Vue 项目使用 ECharts 切换页面回来图表不显示

问题描述

问题1:

  • 解决方案对应方案1
  • 在 Vue 项目中使用 ECharts 时,一开始图表能渲染出来,当切换到其他页面再回来的时候,图表就不显示了

问题2:

  • 解决方案对应方案2
  • Echarts 图表在子组件中,父组件通过传递数据给子组件的 Echarts 进行渲染,导致图表不显示

问题3:

  • 解决方案对应方案3
  • 在同一个页面的 Echarts 图表切换回来不显示

解决方案:

方案1:

  • 手动删除 Echarts 默认生成的 _echarts_instance_ 属性
    在这里插入图片描述
  • 删除
const domMap = document.getElementById("map_chart");
// 清除Echarts默认添加的属性
domMap.removeAttribute("_echarts_instance_");
let myChart = this.$echarts.init(domMap);
myChart.setOption({})

方案2:

  • 在父组件更新的数据传递到子组件后,在子组件使用 watch 监听数据的变化,如果数据发生变化再执行渲染
// 父组件使用子组件
<PieChart :data="subStationPieChartData" :id="'pie_chart1'" />

// 子组件监听数据变化
  props: {
    id: {
      type: String,
      require: true,
      default() {
        return "pie_chart";
      },
    },
    data: {
      type: Array,
      default() {
        return [];
      },
    },
  },
  watch: {
    id(newVal) {
      // console.log("newVal=>", newVal);
      this.getPieChart(newVal, this.data);
    },
    data(newVal) {
      // console.log("newVal=>", newVal);
      this.getPieChart(this.id, newVal);
    },
  },
  methods: {
    getPieChart(id, data) {
      let pieChartData = JSON.parse(JSON.stringify(data));
      // console.log("pieChartData=>", pieChartData);
      const pieDom = document.getElementById(id);
      this.$echarts.init(pieDom).setOption({})
  }

方案3:

  • 使用 nextTick()
  • 使用 setTimeout(() => {},500)
// 请求数据的方法
getData() {
  this.$request.get("/getFacCount", {}, { mock: false }).then((data) => {
    const res = data.data;
    // console.log("二次设备接入统计图=>", res);
    this.$nextTick(() => {
      this.getBarChart()
    })
    setTimeout(() => {
      this.getBarChart()
    },500)
}

// 执行渲染图表的方法
getBarChart() {
  const barChart = document.getElementById("barchart");
  this.$echarts.init(domChart).setOption({})
}
  • 14
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 中,当我们需要切换多个 Echarts 图表显示,而每个图表的宽度都不同时,就会出现 resize() 失效的情况。 这是因为 resize() 方法是用于重新调整图表的大小的,所以当多个图表的大小不同时,调用该方法就无法完整地重新绘制图表。 解决该问题的方法是使用类似于 v-if 之类的指令或者属性来动态改变每个图表显示状态。例如,当某个图表需要显示时,我们可以将其对应的父元素的 display 属性设置为 block,当其需要隐藏时,将其设置为 none。同时,我们还需要动态改变每个图表的宽度属性,以确保 resize() 方法能够正常调用。 代码示例如下: ```html <template> <div class="chart-container"> <div v-show="showChart1" :style="{width: '500px'}"> <!-- echarts1 的配置和数据 --> </div> <div v-show="showChart2" :style="{width: '600px'}"> <!-- echarts2 的配置和数据 --> </div> <div v-show="showChart3" :style="{width: '700px'}"> <!-- echarts3 的配置和数据 --> </div> </div> </template> <script> export default { data() { return { showChart1: true, showChart2: false, showChart3: false, }; }, methods: { toggleChart() { this.showChart1 = !this.showChart1; this.showChart2 = !this.showChart2; this.showChart3 = !this.showChart3; this.$nextTick(() => { window.dispatchEvent(new Event('resize')); }); }, }, }; </script> ``` 在上述示例中,我们使用了 v-show 指令来动态显示和隐藏每个图表,并使用 :style 绑定了每个图表的宽度属性。在 toggleChart 方法中,我们通过改变 showChart 的值来动态切换图表显示状态,并在切换后调用了 resize() 方法重新绘制图表。注意,在调用 resize() 方法前需要使用 $nextTick 方法将其放入微任务队列中,以确保元素已经渲染完毕。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值