最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React之echarts-for-react源碼解讀

 更新時間:2022年10月15日 09:07:25   作者:肥仔John  
這篇文章主要介紹了React之echarts-for-react源碼解讀,echarts-for-react的源碼非常精簡,本文將針對主要邏輯分析介紹,需要的朋友可以參考下

前言

在當(dāng)前工業(yè)4.0和智能制造的產(chǎn)業(yè)升級浪潮當(dāng)中,智慧大屏無疑是展示企業(yè)IT成果的最有效方式之一。然而其背后怎么能缺少ECharts的身影呢?對于React應(yīng)用而言,直接使用ECharts并不是最高效且優(yōu)雅的方式,而echarts-for-react則是針對React應(yīng)用對ECharts進(jìn)行輕量封裝和增強(qiáng)的工具庫。

echarts-for-react的源碼非常精簡,本文將針對主要邏輯分析介紹。

從與原生初始化對比開始

原生ECharts中我們會通過如下代碼初始化圖表實(shí)例

<div id="container" style="width: 100px; height: 100px"></div>
<script>
  const chart = echarts.init(document.getElementById('container'))
</script>

那么生成的HTML Element結(jié)構(gòu)為

<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的寬高默認(rèn)為容器div#container的寬高,我們可以通過init入?yún)⒅付▋烧邔挾取?/p>

const chart = echarts.init(
  document.getElementById('container'), 
  null, 
  { 
    width: 300, // 可顯式指定實(shí)例寬度,單位為像素。如果傳入值為null/undefined/'auto',則表示自動取 dom(實(shí)例容器)的寬度
    height: 300 // 可顯式指定實(shí)例高度,單位為像素。如果傳入值為null/undefined/'auto',則表示自動取 dom(實(shí)例容器)的高度
  }
)

注意:若此時容器div#container尺寸發(fā)生變化,第二層div和canvas尺寸并不會自適應(yīng),需要我們手工調(diào)用chart.resize()觸發(fā)。

而通過echarts-for-react上述步驟將被簡化為如下,并且生成相同的HTML Element結(jié)構(gòu):

import ReactECharts from 'echarts-for-react'

function Demo() {
  return (
    <ReactECharts
      style={{width: 100, height: 100}} // 設(shè)置容器的寬高
      autoResize={true} // 默認(rèn)為true,自動監(jiān)測容器尺寸的變化,并調(diào)用`chart.resize()`
    />
  )
}

陷阱-默認(rèn)值height為300px

由于ReactEChartsstyle默認(rèn)內(nèi)置height: 300,源碼如下:

// 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的方式設(shè)置容器高度時必須使用!important

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

獲取ECharts實(shí)例

const ref = useRef()

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

<EchartsReact
  ref={ref}
/>

主邏輯源碼剖析

核心邏輯均在EChartsReactCore組件上(位于文件src/core.tsx),特點(diǎn)如下:

  • 采用PureComponent方式編寫組件以便適配所有React版本;
  • 僅對ECharts 命令式API進(jìn)行聲明式API的封裝,并沒有將每種EChart圖表類型封裝為組件;
  • 添加特性,監(jiān)測容器尺寸的變化,并自動調(diào)用ECharts實(shí)例的resize方法實(shí)現(xiàn)自適應(yīng)。

掛載渲染過程

  • componentDidMount時調(diào)用renderNewEcharts方法執(zhí)行ECharts組件的生成邏輯;
  • renderNewEcharts方法內(nèi)部邏輯

    通過echarts.getInstanceByDom(容器DOM元素)echarts.init(容器DOM元素,主題,配置)獲取已有ECharts實(shí)例或生成新的ECharts實(shí)例;

    通過ECharts實(shí)例的setOption方法設(shè)置或更新圖表內(nèi)容;

    通過ECharts實(shí)例的showLoadinghideLoading控制圖表渲染前是否顯示加載進(jìn)度條;

    將通過props onEvents配置的ECharts支持的事件處理器綁定到ECharts實(shí)例上;

    觸發(fā)props onChartsReady 方法;

    訂閱通過size-sensor監(jiān)測容器尺寸并自動調(diào)用ECharts實(shí)例的resize方法,實(shí)現(xiàn)圖表尺寸的自適應(yīng)。

更新渲染過程

由于render方法無論執(zhí)行多少遍,實(shí)際上僅僅有可能影響容器本身而已,對ECharts實(shí)例并沒有任何影響。因此實(shí)際影響ECharts實(shí)例的邏輯被放置到componentDidUpdate那里,這做法和react-amap中在useEffect中通過Marker等實(shí)例內(nèi)置的set方法更新狀態(tài)的原理是一致的。

  • 若更新的props包含themeoptsonEvents則要銷毀原來的ECharts實(shí)例,重新構(gòu)建一個新的ECharts實(shí)例,并終止更新渲染過程;否則執(zhí)行第2步。
  • 若props中的option,notMergela,lazyUpdate,showLoadingloadingOption均沒有變化,則不更新ECharts實(shí)例;
    注意:EChartsReactCore繼承PureComponent,若上述props進(jìn)行shallow equal比較為true時也不會更新ECharts實(shí)例;但這一步采用deep equal比較,來減少ECharts實(shí)例的更新。
  • 若props中的styleclassName發(fā)生變化則會觸發(fā)ECharts實(shí)例的resize方法。

卸載過程

  • 取消通過size-sensor訂閱的容器尺寸變化事件;
  • 通過ECharts實(shí)例的dispose方法注銷ECharts實(shí)例。

項(xiàng)目依賴

fast-deep-equal: 遍歷對象屬性進(jìn)行對比size-sensor: DOM元素尺寸監(jiān)聽器,當(dāng)元素尺寸變化時會觸發(fā)回調(diào)函數(shù)

后續(xù)

echarts-for-react利用size-sensor實(shí)現(xiàn)圖表尺寸自適應(yīng)容器尺寸,那么size-sensor是怎樣做到這一點(diǎn)呢?敬請期待一下篇《React魔法堂:size-sensor源碼略讀》。

到此這篇關(guān)于React之echarts-for-react源碼解讀的文章就介紹到這了,更多相關(guān)echarts-for-react源碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • react Input組件Compositionstart和Compositionend事件

    react Input組件Compositionstart和Compositionend事件

    這篇文章主要為大家介紹了Compositionstart和Compositionend事件之于react組件庫Input組件的坑解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • React導(dǎo)入less及其注意事項(xiàng)說明

    React導(dǎo)入less及其注意事項(xiàng)說明

    在Vite構(gòu)建的React項(xiàng)目中,直接安裝和導(dǎo)入Less即可使用,但需注意的是,Less的樣式作用域不局限于模塊內(nèi)部,可能造成樣式污染,建議通過修改文件名和導(dǎo)入方式來避免此問題
    2024-11-11
  • React?跨端動態(tài)化核心技術(shù)實(shí)例分析

    React?跨端動態(tài)化核心技術(shù)實(shí)例分析

    這篇文章主要為大家介紹了React?跨端動態(tài)化核心技術(shù)實(shí)例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • React使用TypeScript的最佳實(shí)踐和技巧

    React使用TypeScript的最佳實(shí)踐和技巧

    在React項(xiàng)目中使用TypeScript可以顯著提高代碼的可維護(hù)性和可讀性,并提供強(qiáng)大的類型檢查功能,減少運(yùn)行時錯誤,以下是一些優(yōu)雅地將TypeScript集成到React項(xiàng)目中的最佳實(shí)踐和技巧,需要的朋友可以參考下
    2024-06-06
  • React Native 使用Fetch發(fā)送網(wǎng)絡(luò)請求的示例代碼

    React Native 使用Fetch發(fā)送網(wǎng)絡(luò)請求的示例代碼

    本篇文章主要介紹了React Native 使用Fetch發(fā)送網(wǎng)絡(luò)請求的示例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • React中的Diff算法你了解嗎

    React中的Diff算法你了解嗎

    這篇文章主要為大家詳細(xì)介紹了React的Diff算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • React?狀態(tài)管理工具優(yōu)劣勢示例分析

    React?狀態(tài)管理工具優(yōu)劣勢示例分析

    這篇文章主要為大家介紹了React?狀態(tài)管理工具優(yōu)劣勢示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • React 并發(fā)功能體驗(yàn)(前端的并發(fā)模式)

    React 并發(fā)功能體驗(yàn)(前端的并發(fā)模式)

    React 是由 Facebook 軟件工程師 Jordan Walke 創(chuàng)建,React 的第一個版本在七年前問世,現(xiàn)在,F(xiàn)acebook 負(fù)責(zé)維護(hù),本文給大家介紹React 并發(fā)功能體驗(yàn)前端并發(fā)模式的問題,感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • react中事件處理與柯里化的實(shí)現(xiàn)

    react中事件處理與柯里化的實(shí)現(xiàn)

    本文主要介紹了react中事件處理與柯里化的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • React Native第三方平臺分享的實(shí)例(Android,IOS雙平臺)

    React Native第三方平臺分享的實(shí)例(Android,IOS雙平臺)

    本篇文章主要介紹了React Native第三方平臺分享的實(shí)例(Android,IOS雙平臺),具有一定的參考價值,有興趣的可以了解一下
    2017-08-08

最新評論

于都县| 建平县| 肥东县| 长岭县| 司法| 库车县| 武汉市| 饶阳县| 仲巴县| 宁德市| 荣昌县| 东丽区| 云霄县| 两当县| 寿阳县| 西乡县| 禄劝| 铜陵市| 乌鲁木齐市| 张家口市| 聂拉木县| 樟树市| 石嘴山市| 洪湖市| 祁东县| 英山县| 澄迈县| 富平县| 巴里| 辽阳县| 龙岩市| 黄山市| 汪清县| 沛县| 延吉市| 岑溪市| 三门峡市| 遵义县| 泾川县| 长顺县| 盐津县|