在Vue中更新EChart图表数据时,Watch不起作用

l7wslrjt  于 2023-04-07  发布在  Vue.js
关注(0)|答案(1)|浏览(377)

我正在使用EChart和Vue 2,我做了一个简单的EChart组件。

<template>
  <div :class="className" :style="{height:height,width:width}" />
</template>

<script>
import * as echarts from 'echarts';
require('echarts/theme/macarons') // echarts theme
export default {
  props: {
    className: {
      type: String,
      default: 'chart'
    },
    width: {
      type: String,
      default: '100%'
    },
    height: {
      type: String,
      default: '300px'
    },
    chartData: {
      type: Object,
      required: true
    },
    autoResize: {
        type: Boolean,
        default: true,
      },        
  },
  watch: {

    chartData: {
         deep: true,
         handler(val) {
          console.log('chartdata handler',val);

          this.setOptions(val.legend, val.data);
         }
    },
    width: {
         deep: true,
         handler(val) {
          console.log(' width',val);
        }
    }
  },  
  data() {
    return {
      chart: null
    }
  },
  mounted() {
    this.$nextTick(() => {
      this.initChart();
    })
  },
  beforeDestroy() {
    if (!this.chart) {
      return
    }
    this.chart.dispose();
    this.chart = null;
    
  },
  methods: {
    initChart() {
      this.chart = echarts.init(this.$el, 'macarons');
      this.setOptions(
         ['pepper','rice'],
         [
              { value: 0, name: 'pepper' },
              { value: 0, name: 'rice' },
        ]
      );
    },

    setOptions( lengend, data ) {    
      this.chart.setOption({
          title: {
              left: 'center'
          },
          tooltip: {
            trigger: 'item'
          },
          legend: {
            top: '5%',
            left: 'center',
            data: lengend,
          },
          series: [
            {
              name: 'Access From',
              type: 'pie',
              radius: ['40%', '70%'],
              itemStyle: {
                borderRadius: [20, 5, 5, 10],
                borderColor: '#fff',
                borderWidth: 2
              },
              label: {
                show: false
              },
              data: data
            }
          ]
        });
    }
  }
}
</script>

我在另一个父级中使用此组件。

<PieChart ref="pieChart" :chartData="pieData" :width="'400px'"> </PieChart>

  data () {
    return {
        pieData: {
            name: 'crop distribution',
            data:[
                { value: 115, name: 'pepper' },
                { value: 128, name: 'rice' }
            ],
            legend:['pepper','rice']
        },
     }

然而,这段代码永远不会将chartData传递给PieChart来更新图表。我查看并发现:

watch: {
    chartData: { deep: true,
         handler(val) {
          console.log('chartdata handler',val);
          this.setOptions(val.legend, val.data);
         }
    },
}

这个watch函数没有被触发,还没有控制台输出。watch在其他Vue应用程序中运行良好,但是当与EChart集成时,这里没有工作。

x33g5p2x

x33g5p2x1#

很确定你只是在监视器上缺少了immediate: true

watch: {
    chartData: {
      handler(val) {
        console.log('chartdata handler',val);
        this.setOptions(val.legend, val.data);
      }
      deep: true,
      immediate: true,  // <--------------
    },
  }

如果没有它,观察器不会在初始化期间触发,只有在数据更改之后才会触发。因此,如果您从未更改数据(并且看起来不像您这样做),则观察器永远不会运行。
添加该属性会将其更改为一个eager watcher,在第一次设置数据时运行(v2的相关文档很差,但在v3中工作相同)。
这样行吗

相关问题