React之Echarts出现Animator.js:64 Uncaught TypeError: Cannot set property ‘0‘ of undefined报错

一、出现的情况

出现这种情况,通常实在出现zoom缩放,类似于下边
在这里插入图片描述
我下篇文章介绍如何实现横坐标缩放
鼠标可以控制缩放条的大小,在缩到一定程度时,或者出现横坐标重叠,控制台会出现如下错误
在这里插入图片描述
或者有网友说到的另一种:

Uncaught TypeError: Cannot set property '0' of undefined
    at Vt (echarts.min.js:1)
    at onframe (echarts.min.js:1)
    at ft.i.onframe (echarts.min.js:1)
    at ft.fire (echarts.min.js:1)
    at ft.step (echarts.min.js:1)
    at wx._update (echarts.min.js:1)
    at t (echarts.min.js:1)

二、解决办法

定位错误来源,以我的错误信息为例子

可以看到是这个函数报了错
在这里插入图片描述

function interpolateArray(p0, p1, percent, out, arrDim) {
  var len = p0.length;

  if (arrDim === 1) {
    for (var i = 0; i < len; i++) {
      out[i] = interpolateNumber(p0[i], p1[i], percent);
    }
  } else {
    var len2 = len && p0[0].length;

    for (var i = 0; i < len; i++) {
      for (var j = 0; j < len2; j++) {
        out[i][j] = interpolateNumber(p0[i][j], p1[i][j], percent);
      }
    }
  }
} // arr0 is source array, arr1 is target array.
// Do some preprocess to avoid error happened when interpolating from arr0 to arr1

这个函数所在的位置是

node_modules/zrender/lib/animation/Animator.js

(1)理解该函数

这个函数是错误在

out[i][j] = interpolateNumber(p0[i][j], p1[i][j], percent);

interpolateNumber函数结构如下

function interpolateNumber(p0, p1, percent) {
  return (p1 - p0) * percent + p0;
}

报错是因为out数组的length会存在可能和P0,P1数组的length不一样,导致给out数组赋值时会出现报错

(2)解决办法

1. 修改此函数

法一

添加if判断,如果out[i]不存在,则给out[i]赋值一个空数组,这样可以保证代码不报错

function interpolateArray(p0, p1, percent, out, arrDim) {
  
  var len = p0.length;

  if (arrDim === 1) {
    for (var i = 0; i < len; i  ) {
      out[i] = interpolateNumber(p0[i], p1[i], percent);
    }
  } else {
    var len2 = len && p0[0].length;

    for (var i = 0; i < len; i  ) {
      for (var j = 0; j < len2; j  ) {
		if (!out[i]) out[i] = [];
        out[i][j] = interpolateNumber(p0[i][j], p1[i][j], percent);
      }
    }
  }
}
法二
  1. 首先确定out[i]是否存在,不存在赋值为空数组
  2. 判断P1[i]是否存在,存在则进行赋值
  3. 如果P1[i]不存在,则使用P[2]赋值
function interpolateArray(p0, p1, percent, out, arrDim) {
	var len = p0.length;
	if (arrDim == 1) {
	    for (var i = 0; i < len; i++) {
	        out[i] = interpolateNumber(p0[i], p1[i], percent);
	    }
	}
	else {
	    var len2 = len && p0[0].length;
	    for (var i = 0; i < len; i++) {
	        if (!out[i])                    
	            out.push([])
	        for (var j = 0; j < len2; j++) {
	            if (p1[i])                       
	                out[i][j] = interpolateNumber(
	                    p0[i][j], p1[i][j], percent
	                );
	            else                               
	                out[i][j] = p0[i][j];
	        }
	    }
	}
}

对了,别忘了更新函数后记得重启服务。。

2. 使用echarts 5.0以上版本

目前我查了一下,出到了5.0版本
更新Echart版本后报错不出现了。

但是@types/echart的版本只有4.9.3
其次,最重要的一点是,echarts-for-react和5.0的Echarts版本不兼容
或者你还可以修改引用办法

import * as echarts from "echarts"

但是还是会有各种问题出现,没有问题就可以直接使用5.0版本解决上述问题


参考文章:
https://github.com/apache/incubator-echarts/issues/13380
https://github.com/apache/incubator-echarts/issues/13441
https://github.com/apache/incubator-echarts/issues/7088

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值