前言
一種在 React Native 中封裝的響應(yīng)式 Echarts 組件,使用與示例請(qǐng)參見(jiàn):react-native-echarts-demo
近年來(lái),隨著移動(dòng)端對(duì)數(shù)據(jù)可視化的要求越來(lái)越高,類(lèi)似 MPAndroidChart 這樣的傳統(tǒng)圖表庫(kù)已經(jīng)不能滿足產(chǎn)品經(jīng)理日益變態(tài)的需求。前端領(lǐng)域數(shù)據(jù)可視化的發(fā)展相對(duì)繁榮一些,通過(guò) WebView 在移動(dòng)端使用 Echarts 這樣功能強(qiáng)大的前端數(shù)據(jù)可視化庫(kù),是解決問(wèn)題的好辦法。
React Native 開(kāi)發(fā)中,由于使用的是與前端相同的 JavaScript 語(yǔ)言,銜接 Echarts 的工作相對(duì)順暢些,不過(guò)一些必要的組件封裝還是能夠大大提高開(kāi)發(fā)效率的。
Echarts 官方推薦過(guò)一個(gè)第三方封裝庫(kù):react-native-echarts(注:它對(duì)應(yīng)的 nmp package 名字為native-echarts ),目前有 400+ stars 和 100+ 的周下載量,可見(jiàn)還是被廣泛使用的。但是我們經(jīng)過(guò)調(diào)研,發(fā)現(xiàn) react-native-echarts 存在以下一些問(wèn)題:
由于用WebView 封裝 Echarts 涉及到本地 html,不是純 JavaScript 語(yǔ)言層面的功能,又沒(méi)有 native 代碼,所以做成 nmp package 并不是一個(gè)很好的選擇,寫(xiě)成項(xiàng)目里的內(nèi)部組件,自己進(jìn)行配置反而是更方便更靈活的方案。
因此我們決定不使用第三方的 Echarts 封裝庫(kù),自己寫(xiě)一個(gè)通用組件 WebChart 。為方便開(kāi)發(fā)中使用,該組件具有以下特點(diǎn):
Demo 與使用方法
使用與示例請(qǐng)參見(jiàn):react-native-echarts-demo,如果你需要直接使用,可按以下步驟移植:
將根目錄下的 WebChart 組件文件夾拷到你項(xiàng)目中合適的地方
將 /android/app/src/main/assets/web 文件夾拷到你項(xiàng)目同樣位置,沒(méi)有 assets 文件夾需手動(dòng)創(chuàng)建。
只需以上兩步就可以在項(xiàng)目中使用 WebChart 組件了。
如果需要進(jìn)一步定制的話,Echarts 代碼在以上兩個(gè)文件夾中的 index.html 里 <script /> 標(biāo)簽內(nèi),目前是放的是 4.0 完整版,無(wú)擴(kuò)展包,可到官網(wǎng)下載所需的版本和擴(kuò)展包替換;svg/canvas 、數(shù)據(jù)增量加載等可在 WebChart/index.js 中直接進(jìn)行修改。在移動(dòng)端,出于性能的考慮,我們一般使用 svg 的渲染模式。
WebChart 具體使用可參見(jiàn) App.js ,style 的設(shè)置就和普通的 React Native 組件一樣,可使用 flex ,也可設(shè)為定值。額外的三個(gè)參數(shù):
當(dāng)然這是根據(jù)我們的業(yè)務(wù)需要設(shè)計(jì)的參數(shù),你完全可以自由重新設(shè)定。
Echarts與React Native組件的通信
在 React Native 的 WebView 組件中,提供了 onMessage 和 postMessage 來(lái)進(jìn)行 html 與組件的雙向通信,具體使用可參加文檔。
利用 webView.postMessage ,WebChart 實(shí)現(xiàn)了通知 Echarts 執(zhí)行 setOption ;在 exScript 中,可利用 window.postMessage 實(shí)現(xiàn) Echarts 的事件向 React Native 組件的通信。
一般我們會(huì)約定通信的 data 為這樣格式的對(duì)象:
{type: 'someType',payload: {value: 111,},}
由于 onMessage 和 postMessage 只能進(jìn)行字符串的傳遞,在 exScript 需進(jìn)行 JSON 序列化,類(lèi)似這樣:
exScript={`chart.on('click', (params) => {if(params.componentType === 'series') {window.postMessage(JSON.stringify({type: 'select',payload: {index: params.dataIndex,},}));}});`}
以上就是我們封裝的響應(yīng)式 WebChart 組件及使用,完整代碼請(qǐng)參見(jiàn):react-native-echarts-demo。
在使用中,還有以下幾個(gè)坑未解決,目前只能繞過(guò),歡迎知道的同學(xué)指正:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注