案例使用Echarts快速上手提供的案例。
如果将Echarts案例直接写入组件中而不拿useEffect包裹时,就会报错。
import * as echarts from 'echarts';
const Resource = () => {
// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.getElementById('main'));
// 指定图表的配置项和数据
var option = {
title: {
text: 'ECharts 入门示例'
},
tooltip: {},
legend: {
data: ['销量']
},
xAxis: {
data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']
},
yAxis: {},
series: [
{
name: '销量',
type: 'bar',
data: [5, 20, 36, 10, 10, 20]
}
]
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
return (
<div id='main' style={{ width: '600px', height: '400px' }}></div>
);
};
export default Resource;
报错信息:
而用useEffect把Echarts的相关配置包裹起来时,就会显示Echarts图表,如下:
import * as echarts from 'echarts';
import { useEffect } from 'react';
const Resource = () => {
useEffect(() => {
// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.getElementById('main'));
// 指定图表的配置项和数据
var option = {
title: {
text: 'ECharts 入门示例'
},
tooltip: {},
legend: {
data: ['销量']
},
xAxis: {
data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']
},
yAxis: {},
series: [
{
name: '销量',
type: 'bar',
data: [5, 20, 36, 10, 10, 20]
}
]
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
}, [])
return (
<div id='main' style={{ width: '600px', height: '400px' }}></div>
);
};
export default Resource;
而报错的原因是在Resource组件挂载前,js代码会先被解析,而组件在挂载后才创建dom(id为main)对象,所以会报错(Initialize failed: invalid dom.)
PS:同样,在vue中,用watch将Echarts相关代码包起来也能解决该问题。