Echarts:Watch数据与option数据冲突导致的死循环

echarts图表定义在子组件中,父组件从后台得到数据后再给子组件传值。因为ajax请求是异步的,执行顺序为echarts绘制然后父组件才得到数据传给echarts子组件,所以在echarts中不会渲染数据,因此我在子组件中用Watch来监听父组件传递的值的变化。

  // 监听获取数据的变化
  @Watch("dataX")
  onDataXChange(newDataX: string[], oldDataX: string[]) {
    this.dataX = newDataX;
    this.drawChartLine();
  }

后台返回的数据x轴为年份,y轴为数值,这个年份不是从打到小排列的

 

因此后来又提出了一个需求是要给x轴的年份排序,按从小到大展示 

然后。。我就直接在配置option的时候给dataX排序了

xAxis: {
        type: "category",
        //排序
        data: this.dataX?.sort(function (a: PdCAny, b: PdCAny) {
          return a - b;
        }),
        boundaryGap: false,
        //坐标轴名称的样式
        axisLabel: {
          color: "rgba(192,196,206)",
          fontSize: 12,
          fontFamily: "Microsoft YaHei UI",
          fontWeight: "400",
        },
        // 轴线样式
        axisLine: {
          lineStyle: {
            color: "#FFFFFF",
          },
        },
        //不显示x坐标刻度
        axisTick: {
          show: false,
        },
      },

于是出现一个报错“You may have an infinite update loop in watcher with expression”:

而且打包上传到服务器之后页面直接卡死了!

为什么会出现这个bug呢?原因如下:

首先dataX在created生命周期中获取数据时也发生了变化,Watch监听到后,就执行option操作,结果option中的dataX中的数组进行了排序,然后watch监听的dataX又发生变化,陷入了无限死循环中。

于是我在父组件中得到dataX的值后的数据之后就对这个数组进行了排序,避免了死循环的错误。

总结:watch的数据不要随意修改,不要在watch中改变所监听的数据!~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

糖醋麻辣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值