react+echarts出现“There is a chart instance already initialized on the dom.”
写了一个关于echatrs组件,报错dom重复
配置信息从props拿
let chart;
useEffect(() => {
if (chart) {
updateChartView();
}else{
chart = echarts.init(dom.current)
updateChartView();
handleWindowResize();
}
}
}, [configOption]);
useEffect(() => {
return () => {
if (chart) {
chart.dispose(dom.current);
chart.clear();
window.resize = null;
}
window.removeEventListener("resize", handleWindowResize);
};
}, []);
react更新不能及时取定义数据,最好用usestate创建实例
修改后
const [chart, setChart] = useState(null)
const { configOption } = props;
useEffect(() => {
if (JSON.stringify(configOption) !== "{}") {
if (chart) {
// chart.setOption(configOption, true);
updateChartView();
}
}
}, [configOption]);
useEffect(() => {
let echartsInit = echarts.init(dom.current);
setChart(echartsInit);
updateChartView();
handleWindowResize();
return () => {
if (chart) {
chart.dispose(dom.current);
chart.clear();
window.resize = null;
}
window.removeEventListener("resize", handleWindowResize);
};
}, []);
组件完整代码--简单版
import React, { useEffect, useState, memo, createRef } from "react";
import { merge, debounce } from "lodash"; // 按需引入
import * as echarts from "echarts";
function Fn(props) {
const dom = createRef();
const [chart, setChart] = useState(null)
const { configOption } = props;
useEffect(() => {
if (JSON.stringify(configOption) !== "{}") {
if (chart) {
// chart.setOption(configOption, true);
updateChartView();
}
}
}, [configOption]);
useEffect(() => {
let echartsInit = echarts.init(dom.current);
setChart(echartsInit);
updateChartView();
handleWindowResize();
return () => {
if (chart) {
chart.dispose(dom.current);
chart.clear();
window.resize = null;
}
window.removeEventListener("resize", handleWindowResize);
};
}, []);
const basicOption = {
// title: {
// textStyle: {
// color: "#fff",
// },
// },
grid: {
top: 30,
right: 10,
left: 40,
bottom: 10,
containLabel: true,
},
tooltip: {
trigger: "item",
},
legend: {
top: "5%",
left: "center",
},
series: [],
};
const assembleDataToOption = () => {
if (!configOption) return;
return merge({}, basicOption, configOption);
};
/**
* 更新echart视图
*/
const updateChartView = () => {
if (!chart) return;
const fullOption = assembleDataToOption();
chart.setOption(fullOption, true);
};
/**
* 当窗口缩放时,echart动态调整自身大小
*/
const handleWindowResize = () => {
const __resizeHandler = debounce(() => {
if (chart) {
chart.resize(); // 重置echarts图形绘制区域
}
}, 100);
window.addEventListener("resize", __resizeHandler);
// 监听要是一个函数所以this.__resizeHandler,不能带()
};
return <div ref={dom} style={{ width: "100%", height: "100%" }}></div>;
}
export default memo(Fn);
react+echarts出现“There is a chart instance already initialized on the dom.”的更多相关文章
- There is a chart instance already initialized on the dom!警告
使用Echarts插件的时候,多次加载会出现There is a chart instance already initialized on the dom.这个错误,改插件已经加载完成. 并且如果你 ...
- 多次执行echarts时出现 there is a chart instance already initialized on the dom
原因,多次使用 echarts.init(document.getElementById(this.options.zid)); 解决方案 设为全局
- react+echarts/g2/bizcharts可视化图表
一.echarts的折线图的使用demo如下,linecharts为实例化的封装组件,line为实际应用的组件 cnpm install echarts import React from 'reac ...
- React+echarts (echarts-for-react) 画中国地图及省份切换
有足够的地图数据,可以点击到街道,示例我只出到市级 以umi为框架,版本是: "react": "^18.2.0", "umi": &quo ...
- react通过自己的jsx语法将两者放在一起通过虚拟dom来渲染
目前较为流行的react确实有很多优点,例如虚拟dom,单向数据流状态机的思想.还有可复用组件化的思想等等.加上搭配jsx语法和es6,适应之后开发确实快捷很多,值得大家去一试.其实组件化的思想一直在 ...
- echarts 知识点
echarts map 禁止放大缩小,设置 calculable 为 false 即可. calculable: false echarts 报错: There is a chart instance ...
- 通过百度echarts实现数据图表展示功能
现在我们在工作中,在开发中都会或多或少的用到图表统计数据显示给用户.通过图表可以很直观的,直接的将数据呈现出来.这里我就介绍说一下利用百度开源的echarts图表技术实现的具体功能. 1.对于不太理解 ...
- 时隔两个月再写的Echarts(Enterprise Charts,商业级数据图表)一文
简介 ECharts,缩写来自Enterprise Charts,商业级数据图表,一个纯Javascript的图表库,可以流畅的运行在PC和移动设备上,兼容当前绝大部分浏览器(IE6/7/8/9/10 ...
- Echarts的基本用法
首先需要到导入echatrs.js文件 <script src="dist/echarts.js"></script> 路径配置 require.confi ...
- echarts 某省下钻某市地图
因为最近工作需要,接触到了highcharts 与echarts ,对比了一下,目前公司系统用的是highcharts的图表插件,就不想再去用echarts的图标插件了,奈何highcharts地图对 ...
随机推荐
- Chiplet解决芯片技术发展瓶颈
这是IC男奋斗史的第38篇原创 本文1776字,预计阅读4分钟. Chiplet封装是什么 介绍Chiplet前,先说下SOC.Chiplet和SOC是两个相互对立的概念,刚好可以用来互为参照. SO ...
- Java多线程编程的优点和缺点
优点: 加快响应用户的时间:多线程允许并发执行多个任务,可以充分利用多核处理器,从而提高程序的性能和响应速度.比如我们经常用的迅雷下载,都喜欢多开几个线程去下载,谁都不愿意用一个线程去下载,为什么呢? ...
- chatgpt镜像站汇总 - 聚合GPT【即时更新】
自荐下由我开发的聚合GPT网站,这边的GPT镜像站均为免费.无登录.无次数限制的!会及时剔除失效.添加可用地址[欢迎STAR.PR] 地址:https://ele-cat.gitee.io/comp- ...
- docker容器管理脚本
#!/bin/bash #auto install docker and Create VM #by jfedu.net 2017 #Define PATH Varablies IPADDR=`ifc ...
- vue + tornado 个人博客项目简介
vue + tornado 个人博客项目简介 项目链接:https://www.freepd.top 项目链接:https://admin.freepd.top 项目简介 首页预览 本站接入了百度ap ...
- python 安装包时 ERROR: Failed building wheel for webrtcvad
报错信息: error: subprocess-exited-with-error × Building wheel for webrtcvad (pyproject.toml) did not ru ...
- Vue一些进阶知识-基于官网(笔记)
前言 主要根据vue官网文档完成.对一些平时可能会用到的知识.组件进行收集,为的是对vue的可用性有一个大致的了解.博客中的组件介绍可能只涉及简单用法,完整用法还是以官网为准. 基础 启动过程: 主文 ...
- AI歌姬,C位出道,基于PaddleHub/Diffsinger实现音频歌声合成操作(Python3.10)
懂乐理的音乐专业人士可以通过写乐谱并通过乐器演奏来展示他们的音乐创意和构思,但不识谱的素人如果也想跨界玩儿音乐,那么门槛儿就有点高了.但随着人工智能技术的快速迭代,现在任何一个人都可以成为" ...
- mutable关键词
类中的 mutable mutable 从字面意思上来说,是「可变的」之意. 若是要「顾名思义」,那么这个关键词的含义就有些意思了.显然,「可变的」只能用来形容变量,而不可能是「函数」或者「类」本身. ...
- vue中export default function 和 export function 的区别
export default function 和 export function 的区别 // 第一种 export default function crc32() { // 输出 // ... ...