一种在 React Native 中封装的相应式 Echarts 组件,运用与示例请拜见:
react-native-echarts-demo
近年来,跟着挪动端对数据可视化的要求越来越高,相似 MPAndroidChart 如许的传统图表库已不能满足产物司理日趋变态的需求。前端范畴数据可视化的生长相对繁华一些,经由过程 WebView 在挪动端运用 Echarts 如许功用强大的前端数据可视化库,是处理题目的好办法。
React Native 开辟中,由于运用的是与前端雷同的 JavaScript 言语,连接 Echarts 的事情相对顺畅些,不过一些必要的组件封装照样能够大大提高开辟效力的。
Echarts 官方引荐过一个第三方封装库:react-native-echarts(注:它对应的 nmp package 名字为 native-echarts ),如今有 400+ stars 和 100+ 的周下载量,可见照样被普遍运用的。然则我们经由调研,发明 react-native-echarts 存在以下一些题目:
- 该库已半年多未更新,Echarts 版本停留在 3.0 ,Android 端打包需手动增加 assets 的题目也一向未处置惩罚
- 库的接口天真度较低,比方只能经由过程 width、height 设置大小;没法运用 Echarts 扩大包;没法举行事宜注册、WebView 通讯等
由于用 WebView 封装 Echarts 涉及到当地 html,不是纯 JavaScript 言语层面的功用,又没有 native 代码,所以做成 nmp package 并非一个很好的挑选,写成项目里的内部组件,自身举行设置反而是更轻易更天真的计划。
因而我们决议不运用第三方的 Echarts 封装库,自身写一个通用组件 WebChart 。为轻易开辟中运用,该组件具有以下特性:
- 依据相应式举行设想,只需在 option 中设置好数据源,数据变化后图表就会自动革新,更相符 React 的作风。
我们的计划是在组件每次 update 时推断传入的 option 参数是不是发生变化,假如变化经由过程 webView.postMessage ,以 JSON 的情势传入新的 option ,关照 Echarts 从新 setOption 。
虽然 Echarts 自身会对 option 举行对照,但事前推断能够削减 update 致使的与 WebView 频仍通讯,这一点在容器父组件中有大批异步要求时照样很明显的;在 WebView 内部,更新则是采纳 Echarts 自身的 setOption 而无需 reload 全部 WebView
- 应用 WebView 的 postMessage 和 onMessage 接口,可完成图表与别的 React Native 组件的事宜通讯
- 经由过程组件的 exScript 参数,可为 WebView 增加恣意剧本,运用天真
- 由于是自身写的组件, echarts 版本、扩大包,svg/canvas 、数据增量加载都能够自身设定
Demo 与运用方法
运用与示例请拜见:react-native-echarts-demo,假如你须要直接运用,可按以下步骤移植:
- 将根目录下的 WebChart 组件文件夹拷到你项目中适宜的处所
- 将 /android/app/src/main/assets/web 文件夹拷到你项目一样位置,没有 assets 文件夹需手动建立。
只需以上两步就能够在项目中运用 WebChart 组件了。
假如须要进一步定制的话,Echarts 代码在以上两个文件夹中的 index.html 里 <script /> 标签内,如今是放的是 4.0 完全版,无扩大包,可到官网下载所需的版本和扩大包替代;svg/canvas 、数据增量加载等可在 WebChart/index.js 中直接举行修正。在挪动端,出于机能的斟酌,我们平常运用 svg 的衬着形式。
WebChart 详细运用可拜见 App.js ,style 的设置就和一般的 React Native 组件一样,可运用 flex ,也可设为定值。分外的三个参数:
- option(object):赋给 setOption 的参数对象,发生变化后 WebChart 内部会自动挪用 setOption ,完成相应式革新。特别注意,JSON 剖析时未举行函数的处置惩罚,所以需防止运用函数式的 formatter 和类情势的 LinearGradient ,和 demo 一样运用模板式和一般对象的吧
- exScript(string):任何你想在 WebView 加载时实行的代码,平常会是事宜注册之类的,引荐运用模板字面量
- onMessage(function):WebView 内部触发 postMessage 以后的回调,postMessage 需先在 exScript 中举行设置,用于图表与别的 React Native 组件的通讯
固然这是依据我们的营业须要设想的参数,你完全能够自在从新设定。
Echarts与React Native组件的通讯
在 React Native 的 WebView 组件中,供应了 onMessage 和 postMessage 来举行 html 与组件的双向通讯,详细运用可列入文档。
应用 webView.postMessage ,WebChart 完成了关照 Echarts 实行 setOption ;在 exScript 中,可应用 window.postMessage 完成 Echarts 的事宜向 React Native 组件的通讯。
平常我们会商定通讯的 data 为如许花样的对象:
{
type: 'someType',
payload: {
value: 111,
},
}
由于 onMessage 和 postMessage 只能举行字符串的通报,在 exScript 需举行 JSON 序列化,相似如许:
exScript={`
chart.on('click', (params) => {
if(params.componentType === 'series') {
window.postMessage(JSON.stringify({
type: 'select',
payload: {
index: params.dataIndex,
},
}));
}
});
`}
以上就是我们封装的相应式 WebChart 组件及运用,完全代码请拜见:react-native-echarts-demo。
在运用中,另有以下几个坑未处理,如今只能绕过,迎接晓得的同砚斧正:
- 在 IOS 中,Echarts 彷佛衬着不出通明的结果,用 rgba 设置的色彩不能一般
- React Native 的 WebView 彷佛 style.height 属性无效,因而不得不在表面套了个 View
- 按如今的资本加载体式格局,index.html 在 Android 上会有两份。由于平台推断是运行时举行的,哪怕离开设置 index.anroid.js 和 index.ios.js 打包时也会都打包进去,而 Android 中又必需手动增加 assets
- index.html 中必需内联引入 Echarts 的代码,外部援用零丁的 js 文件彷佛无效