前言在当前工业4.0和智能制造的产业升级浪潮当中,智慧大屏无疑是展示企业IT成果的最有效方式之一 。然而其背后怎么能缺少ECharts的身影呢?对于React应用而言,直接使用ECharts并不是最高效且优雅的方式,而echarts-for-react则是针对React应用对ECharts进行轻量封装和增强的工具库 。
echarts-for-react的源码非常精简,本文将针对主要逻辑分析介绍 。
从与原生初始化对比开始原生ECharts中我们会通过如下代码初始化图表实例
【React魔法堂:echarts-for-react源码略读】<div id="container" style="width: 100px; height: 100px"></div><script>const chart = echarts.init(document.getElementById('container'))</script>
那么生成的HTML Element结构为
<div id="container" style="width: 100px; height: 100px" _echarts_instance="....."><div style="width: 100px; height: 100px;position: relative;"><canvas width="100" height="100"></canvas></div></div>
其中第二层的div和canvas的宽高默认为容器div#container的宽高,我们可以通过init入参指定两者宽度 。
const chart = echarts.init(document.getElementById('container'),null,{width: 300, // 可显式指定实例宽度,单位为像素 。如果传入值为null/undefined/'auto',则表示自动取 dom(实例容器)的宽度height: 300 // 可显式指定实例高度,单位为像素 。如果传入值为null/undefined/'auto',则表示自动取 dom(实例容器)的高度})
注意:若此时容器div#container尺寸发生变化,第二层div和canvas尺寸并不会自适应,需要我们手工调用chart.resize()
触发 。
而通过echarts-for-react上述步骤将被简化为如下,并且生成相同的HTML Element结构:
import ReactECharts from 'echarts-for-react'function Demo() {return (<ReactEChartsstyle={{width: 100, height: 100}} // 设置容器的宽高autoResize={true} // 默认为true,自动监测容器尺寸的变化 , 并调用`chart.resize()`/>)}
陷阱-默认值height为300px由于ReactECharts
的style
默认内置height: 300
,源码如下:
// src/core.tsxrender(): JSX.Element {const { style, className = '' } = this.propsconst newStyle = { height: 300, ...style }return (<divref={(e: HTMLElement) => {this.ele = e}}style={newStyle}className={`echarts-for-react ${className}`}/>)}
因此通过className的方式设置容器高度时必须使用!important
<ReactEChartsclassName={styles.container}/>
// index.module.css.container {height: 500px !important;}
获取ECharts实例const ref = useRef()useEffect(() => {const instance = ref.current.getEchartsInstance()}, [])<EchartsReactref={ref}/>
主逻辑源码剖析核心逻辑均在EChartsReactCore
组件上(位于文件src/core.tsx
),特点如下:
- 采用PureComponent方式编写组件以便适配所有React版本;
- 仅对ECharts 命令式API进行声明式API的封装,并没有将每种EChart图表类型封装为组件;
- 添加特性 , 监测容器尺寸的变化,并自动调用ECharts实例的
resize
方法实现自适应 。
- 在
componentDidMount
时调用renderNewEcharts
方法执行ECharts组件的生成逻辑; renderNewEcharts
方法内部逻辑- 通过
echarts.getInstanceByDom(容器DOM元素)
或echarts.init(容器DOM元素,主题,配置)
获取已有ECharts实例或生成新的ECharts实例; - 通过ECharts实例的
setOption
方法设置或更新图表内容; - 通过ECharts实例的
showLoading
或hideLoading
控制图表渲染前是否显示加载进度条; - 将通过props
onEvents
配置的ECharts支持的事件处理器绑定到ECharts实例上; - 触发props
onChartsReady
方法; - 订阅通过size-sensor监测容器尺寸并自动调用ECharts实例的
resize
方法,实现图表尺寸的自适应 。
- 通过
render
方法无论执行多少遍,实际上仅仅有可能影响容器本身而已,对ECharts实例并没有任何影响 。因此实际影响ECharts实例的逻辑被放置到componentDidUpdate
那里,这做法和react-amap中在useEffect
中通过Marker等实例内置的set
方法更新状态的原理是一致的 。- 若更新的props包含
theme
,opts
或onEvents
则要销毁原来的ECharts实例,重新构建一个新的ECharts实例,并终止更新渲染过程;否则执行第2步 。 - 若props中的
option
推荐阅读
- 北京同仁堂面膜最近真的超级火,今天就做一篇同仁堂面膜的全面解析,首先一定要知道两点
- 支付宝蚂蚁庄园小课堂10月18日答题内容
- 支付宝蚂蚁庄园小课堂10月19日答题内容
- 创造与魔法10月20日礼包兑换码是多少
- 迷你世界怎么才可以去天堂可不可以去天堂(迷你世界怎样才可以到天堂去)
- 创造与魔法10月22日礼包兑换码是什么
- 创造与魔法10月25日礼包兑换码是多少
- 创造与魔法10月26日礼包兑换码是什么
- 创造与魔法10月27日礼包兑换码是多少
- 支付宝蚂蚁庄园小课堂2022每日答案分享