我的编程空间,编程开发者的网络收藏夹
学习永远不晚

React之echarts-for-react源码解读

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

React之echarts-for-react源码解读

前言

在当前工业4.0和智能制造的产业升级浪潮当中,智慧大屏无疑是展示企业IT成果的最有效方式之一。然而其背后怎么能缺少ECharts的身影呢?对于React应用而言,直接使用ECharts并不是最高效且优雅的方式,而echarts-for-react则是针对React应用对ECharts进行轻量封装和增强的工具库。

echarts-for-react的源码非常精简,本文将针对主要逻辑分析介绍。

从与原生初始化对比开始

原生ECharts中我们会通过如下代码初始化图表实例

<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 (
    <ReactECharts
      style={{width: 100, height: 100}} // 设置容器的宽高
      autoResize={true} // 默认为true,自动监测容器尺寸的变化,并调用`chart.resize()`
    />
  )
}

陷阱-默认值height为300px

由于ReactEChartsstyle默认内置height: 300,源码如下:

// class="lazy" data-src/core.tsx

render(): JSX.Element {
  const { style, className = '' } = this.props
  const newStyle = { height: 300, ...style }

  return (
    <div
      ref={(e: HTMLElement) => {
        this.ele = e
      }}
      style={newStyle}
      className={`echarts-for-react ${className}`}
    />
  )
}

因此通过className的方式设置容器高度时必须使用!important

<ReactECharts
  className={styles.container}
/>
// index.module.css
.container {
  height: 500px !important;
}

获取ECharts实例

const ref = useRef()

useEffect(() => {
  const instance = ref.current.getEchartsInstance()
}, [])

<EchartsReact
  ref={ref}
/>

主逻辑源码剖析

核心逻辑均在EChartsReactCore组件上(位于文件class="lazy" data-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实例的showLoadinghideLoading控制图表渲染前是否显示加载进度条;

    将通过props onEvents配置的ECharts支持的事件处理器绑定到ECharts实例上;

    触发props onChartsReady 方法;

    订阅通过size-sensor监测容器尺寸并自动调用ECharts实例的resize方法,实现图表尺寸的自适应。

更新渲染过程

由于render方法无论执行多少遍,实际上仅仅有可能影响容器本身而已,对ECharts实例并没有任何影响。因此实际影响ECharts实例的逻辑被放置到componentDidUpdate那里,这做法和react-amap中在useEffect中通过Marker等实例内置的set方法更新状态的原理是一致的。

  • 若更新的props包含themeoptsonEvents则要销毁原来的ECharts实例,重新构建一个新的ECharts实例,并终止更新渲染过程;否则执行第2步。
  • 若props中的option,notMergela,lazyUpdate,showLoadingloadingOption均没有变化,则不更新ECharts实例;
    注意:EChartsReactCore继承PureComponent,若上述props进行shallow equal比较为true时也不会更新ECharts实例;但这一步采用deep equal比较,来减少ECharts实例的更新。
  • 若props中的styleclassName发生变化则会触发ECharts实例的resize方法。

卸载过程

  • 取消通过size-sensor订阅的容器尺寸变化事件;
  • 通过ECharts实例的dispose方法注销ECharts实例。

项目依赖

fast-deep-equal: 遍历对象属性进行对比size-sensor: DOM元素尺寸监听器,当元素尺寸变化时会触发回调函数

后续

echarts-for-react利用size-sensor实现图表尺寸自适应容器尺寸,那么size-sensor是怎样做到这一点呢?敬请期待一下篇《React魔法堂:size-sensor源码略读》。

到此这篇关于React之echarts-for-react源码解读的文章就介绍到这了,更多相关echarts-for-react源码内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

React之echarts-for-react源码解读

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

React之echarts-for-react源码解读

这篇文章主要介绍了React之echarts-for-react源码解读,echarts-for-react的源码非常精简,本文将针对主要逻辑分析介绍,需要的朋友可以参考下
2022-11-13

React前端开发createElement源码解读

这篇文章主要为大家介绍了React前端开发createElement源码解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-11-13

React中的for循环解读

这篇文章主要介绍了React中的for循环解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-01-16

React源码分析之useCallback与useMemo及useContext详解

这篇文章主要介绍了ReactuseCallback与useMemo及useContext源码分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
2022-11-13

React Fiber构建completeWork源码解析

这篇文章主要为大家介绍了React Fiber构建completeWork源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-02-06

React Context源码实现原理详解

这篇文章主要为大家介绍了React Context源码实现原理示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-11-13

React SSR架构Stream Rendering与Suspense for Data Fetching源码分析

这篇“React SSR架构Stream Rendering与Suspense for Data Fetching源码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完
2023-07-05

react源码合成事件深入解析

这篇文章主要为大家介绍了react源码合成事件深入解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-01-06

十个yyds的Vue、React源码解析开源项目!

下面就来分享 5 个 Vue 源码解析开源项目、5 个 React 源码解析开源项目!
VueReact2024-12-13

React Refs 的使用forwardRef 源码示例解析

这篇文章主要为大家介绍了React 之 Refs 的使用和 forwardRef 的源码解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-11-13

Ffplay源码Read_Thread解读之一

大家好,我是小涂,今天继续给大家分享ffplay播放器里面的源码解读,今天原本想和大家一起解读一下下面这个三个线程函数.

深入了解 React Fiber:应用与源码实现

通过深入了解 React Fiber 的应用场景和源码实现,我们可以更好地理解 React 中的异步渲染机制以及如何优化组件的生命周期。React Fiber 的引入使得 React 应用在性能和用户体验方面迈出了重要的一步。
ReactFiber2024-11-30

从源码理解 React Hook 是如何工作的

本文只讲了状态 Hook 代表 UseState,和 副作用 Hook 代表 UseEffect,其他 Hook 其实也差不多。
HookReact2024-12-13

渐进式源码解析React更新流程驱动

这篇文章主要为大家介绍了渐进式源码解析React更新流程驱动详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-16

Java源码重读之ConcurrentHashMap详解

ConcurrentHashMap(CHM)是日常开发中使用频率非常高的一种数据结构。本文将从源码角度带大家深入了解一下ConcurrentHashMap的使用,需要的可以收藏一下
2023-05-19

从源码层面理解 React 是如何做 Diff 的

ReconcileChildFibers 是 ChildReconciler 方法内部定义的方法,通过调用 ChildReconciler 方法,并传入一个 shouldTrackSideEffects 参数返回。这样做是为了根据不同使用场
Reactdiff2024-12-01

编程热搜

目录