当前位置: 首页 > 知识库问答 >
问题:

前端 - echart图不更新?

巫健柏
2024-11-14
const setDivChartData = (data,tabType) => {
    let xAxisData:any[] = [];
    if(tabType === 'first') {
      const mapBaseData = data.map(item => item.base);
      const xAxisData = [...new Set(mapBaseData)];
      const yAxisData = getYDivChartDataByBase(xAxisData,data);
      console.log(yAxisData,'yAxisData');
      const sortYAxisData = yAxisData.sort((a, b) => Number(b.name) - Number(a.name));
      const mapNameList = sortYAxisData.map(item => item.name);
      echartLayoutVal.value.byDivison.option.legend.data = mapNameList;
      echartLayoutVal.value.byDivison.option.xAxis.data = xAxisData;
      echartLayoutVal.value.byDivison.option.series = setDivBaseChartDefaultColor(sortYAxisData);
    } else if(tabType === 'second') {
      xAxisData = monthList;
    }
  };

vue3+echarts项目中改变echartLayoutVal.value.byDivison.option.series,为什么界面echart图没有更新

共有2个答案

符渊
2024-11-14

强制 Vue 检测变化

以下是完整的代码

const setDivChartData = (data, tabType) => {
  let xAxisData = [];
  if (tabType === 'first') {
    const mapBaseData = data.map(item => item.base);
    xAxisData = [...new Set(mapBaseData)];
    const yAxisData = getYDivChartDataByBase(xAxisData, data);
    console.log(yAxisData, 'yAxisData');
    const sortYAxisData = yAxisData.sort((a, b) => Number(b.name) - Number(a.name));
    const mapNameList = sortYAxisData.map(item => item.name);
    echartLayoutVal.value.byDivison.option.legend.data = mapNameList;
    echartLayoutVal.value.byDivison.option.xAxis.data = xAxisData;
    // 创建一个新数组并赋值给 series
    echartLayoutVal.value.byDivison.option.series = [...setDivBaseChartDefaultColor(sortYAxisData)];
  } else if (tabType === 'second') {
    xAxisData = monthList;
  }
};

具体改动如下

// 原来的代码
// echartLayoutVal.value.byDivison.option.series = setDivBaseChartDefaultColor(sortYAxisData);

// 修改后的代码
echartLayoutVal.value.byDivison.option.series = [...setDivBaseChartDefaultColor(sortYAxisData)];
长孙作人
2024-11-14
### 回答

在你的代码中,虽然你更新了 `echartLayoutVal.value.byDivison.option` 的内容,但是你没有触发 ECharts 实例的重新渲染。在 Vue 3 中,如果你直接修改了 ECharts 配置对象而没有通过 Vue 的响应式系统来更新,ECharts 可能不会检测到这些变化并重新渲染图表。

为了解决这个问题,你可以在更新 ECharts 配置后,手动调用 ECharts 实例的 `setOption` 方法来触发重新渲染。这里是一个可能的修改方式:

const setDivChartData = (data, tabType) => {

let xAxisData = [];
if (tabType === 'first') {
    const mapBaseData = data.map(item => item.base);
    xAxisData = [...new Set(mapBaseData)];
    const yAxisData = getYDivChartDataByBase(xAxisData, data);
    console.log(yAxisData, 'yAxisData');
    const sortYAxisData = yAxisData.sort((a, b) => Number(b.name) - Number(a.name));
    const mapNameList = sortYAxisData.map(item => item.name);
    
    const newOption = {
        legend: {
            data: mapNameList
        },
        xAxis: {
            data: xAxisData
        },
        series: setDivBaseChartDefaultColor(sortYAxisData)
    };

    // 假设 echartsInstance 是你的 ECharts 实例
    echartsInstance.setOption(newOption);
} else if (tabType === 'second') {
    xAxisData = monthList;
    // 同样需要更新 option 并调用 setOption
    const newOption = {
        xAxis: {
            data: xAxisData
        }
        // 可能还需要更新其他部分,根据实际情况添加
    };
    echartsInstance.setOption(newOption);
}

};


在这个修改中,我创建了一个新的 `newOption` 对象来存储更新后的配置,并使用 `echartsInstance.setOption(newOption)` 来更新图表。确保 `echartsInstance` 是你通过 `echarts.init` 方法初始化的 ECharts 实例。

注意:你需要根据你的实际项目结构来获取 `echartsInstance`。通常,这会在你的 Vue 组件的 `mounted` 钩子或类似的生命周期钩子中完成。
 类似资料:
  • echarts图表渲染不出来,查看元素canvas标签都没有。 需求:在表格内点击生成echart图 解决:表格数据渲染,其中一列判断为csv属性后,实现在单元格内点击文字,触发dialog弹窗,弹窗中显示echart图表。 模板: data: dialogTableVisible: false methods: 渲染出来了(可能一开始就渲染出来没注意到),但是弹窗上不显示,而是后面阴影部分显示出

  • 图例: 因为是单柱多数据,导致myChart.on后params,会有两条。重复点甚至会有多条。目前只想获取点击对应一次params.name。 事件代码: 已解决 myChart.off('click') //!防止重复

  • 请问大佬们,当鼠标移动echarts散点图某个点的时候,当两个点数据重合了的时候,如何能够正确的将重合的点数据全部显示出来呢? 我通过tooltip下的formatter函数这样写的,但是显示出来的数据有错误? 错误显示: 正确的显示应该是 BDS:5,81,33。GALILEO:5,81,33。 请大佬们指点指点,谢谢!!!

  • 在线demo 鼠标悬停在任意一个bar上,底部的bar会消失。怎么配置让底部bar背景颜色一直存在。

  • EChart 是 iOS 上一个柱状图组件,实现动态增长的动画效果,支持点击或者长按事件。

  • 场景是有一个主应用里面有多个子应用,其中a应用嵌入iframe(b应用)展示,可点击弹窗大屏展示; 问题1:a应用进来iframe展示操作没问题,但是点击大屏显示的时候控制台明明打印出来数据但是b应用页面没更新,使用强制刷新forceUpdate和局部刷新this.$nextTick都不好使,使用v-if也是初次进来有触发信息但是页面还是没有显示 问题2:c应用引入iframe(b应用),有复制和

  • 时间8.31 base深圳 吹爆面试官,体验很好,不过也很开心 面试官先自我介绍,开摄像头,很和蔼 做题,给了一个叉叉图标,问不用图片可以怎么实现(脑子懵了,答了svg和canvas绘制,不知道想考什么) 做题,try catch块里的输出 项目拷打,lz主要聊了webworker和大文件上传,面试官会边听边记录重点,面试官会问需求和根据重点细节探讨,20min Vue3相对Vue2的最大的改进