React18中使用echarts.警告:There is a chart instance already initialized on the dom.

在React中使用ECharts封装Bar组件时,可能会遇到图表重绘警告。为避免此问题,可以在useEffect的清理函数中使用echarts.dispose来移除旧的图表实例,确保在更新组件时正确清理。这样模仿了类组件的componentWillUnmount生命周期方法。
摘要由CSDN通过智能技术生成

React 中使用 echarts,我们一般会将图表封装成公共组件,如下我们封装成 Bar 组件:

// 封装图表 Bar 组件
import { useRef, useEffect } from "react";
import * as echarts from "echarts";

function Bar({ title, xData, yData, style }) {
  const domRef = useRef();
  // 执行初始化的函数
  useEffect(() => {
    const current = domRef.current;
    const chartInit = () => {
      const myChart = echarts.init(current);
      // 绘制图表
      myChart.setOption({
        title: {
          text: title,
        },
        tooltip: {},
        xAxis: {
          data: xData,
        },
        yAxis: {},
        series: [
          {
            name: "满意度",
            type: "bar",
            data: yData,
          },
        ],
      });
    };
    chartInit();
  }, [title, xData, yData]);

  return (
    <div>
      {/* 准备一个挂载节点 */}
      <div ref={domRef} style={style}></div>
    </div>
  );
}

export default Bar;

我们使用 useRef 这个 hooks 来获取当前的 dom,这里把它定义为 current,然后将 current 作为参数传入 echarts.init() 进行初始化。

这样写是可以运行的,但是控制台抛出了一个警告:

[ECharts] There is a chart instance already initialized on the dom.

翻译过来就是 dom 上已经初始化了一个图表实例。

那么在重绘图表时,我们要把之前已经渲染好的图表清空。在 useEffect 中我们可以这样实现:

useEffect(() => {
    // 此处省略,和上面一样
    chartInit();
    return () => {
      echarts.dispose(current);
    };
  }, [title, xData, yData]);

useEffect 是可以 return 的,返回一个函数,这个函数称为清理函数。在这个函数中,我们使用echarts.dispose(current) 将实例移除。这样控制台警告就消失了。

通过这一特性我们可以模拟类式组件中 componentWillUnmount 这个钩子函数,当组件被销毁时执行清理函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

codinglin

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

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

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

打赏作者

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

抵扣说明:

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

余额充值