native-echarts填坑记录

问题描述

native-echarts是基于echart为RN项目开源的图表库,使用过程中碰到如下两个大坑

  1. android在release模式下图表无法展示
  2. echats是基于canvas绘制的,但基于react-native-view-shot生成的快照无法显示canvas绘制的内容

备注:

  1. RN官方提供的CameraRoll可以生成快照,但仅仅支持iOS平台, android平台使用第三方react-native-view-shot生成快照。
  2. 朋友推荐了一个RN图表库react-native-charts-wrapper,比native-echart的start数和fork都比较多,更为好的是更新频繁,尚未关闭的issue也少。可以试试

1. android在release模式下图表无法展示

原因

native-echarts的工作方式是使用WebView加载图表,在该库中加载的html文件放在本地,当android打包时将.html文件跟图片打包到一块打包到原生里面,造成无法RN无法读取到html文件

方案1

该库中issue中提供的一种解决方式
改动比较大,既改动库的源码,也改动自己项目的原生部分,不建议采取

方案2

WebView加载html有三种方式,分别为:本地文件、远程文件、html字符串。该库使用的是本地文件方式,下面分别使用另外两种方式操作:

  1. 远程文件:将html文件放到公司服务器,这样改动最小,但图表显示速度较慢
  2. html字符串:将html文件的内容写在字符串内,工作量虽然比远程文件的方式稍微大一点,但图表显示速度快

这三种加载方式都要不要修改库里面提供的html内容,尤其是head标签里面的内容不要随便删除,不然图表可能显示异常

方案3

不依赖于native-echarts库,自己用纯js写一个图表,然后用WebView加载。我的需求是绘制饼状图,所以我只能提供一个饼状图js代码,其他的自己找吧。
这种方式比较随缘,就看你能不能找到相应图表的js代码

2. react-native-view-shot快照无法显示canvas绘制的图表

原因:还不清楚,有了解的朋友辛苦留个言一块探讨一下

方案

victory-native代替echatts绘制图表,victory-native使用的是svg绘制,不影响快照的显示

备注

victory-native的使用有些麻烦,建议认真看下文档,尤其版本问题

疑问

  1. 为什么在android上我没有使用纯js绘制的,而是使用较为麻烦的victory-native

    因为在android上使用纯js绘制造成当前RN页面的背景图很慢才能显示出来,体验太差。是因为在纯js绘制造成线程阻塞(perf monitor显示20 dropped so far),iOS没有这个原因是因为机器性能好。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
如果 react-native-echarts-pro 组件在 React Native 中的图表溢出容器,可以通过以下两种方法进行解决: 1.设置容器的大小 可以在容器组件中设置宽度和高度,然后将宽度和高度作为 props 传递给 react-native-echarts-pro 组件。例如: ``` import React from 'react'; import { View, Dimensions } from 'react-native'; import Echarts from 'react-native-echarts-pro'; const windowWidth = Dimensions.get('window').width; const windowHeight = Dimensions.get('window').height; export default function App() { return ( <View style={{ width: windowWidth, height: windowHeight }}> <Echarts option={option} width={windowWidth} // 设置宽度 height={windowHeight} // 设置高度 /> </View> ); } ``` 2.使用 onLayout 事件设置图表的大小 可以在 react-native-echarts-pro 组件中使用 onLayout 事件来获取容器组件的宽度和高度,然后将宽度和高度设置给图表。例如: ``` import React, { useState } from 'react'; import { View, Dimensions } from 'react-native'; import Echarts from 'react-native-echarts-pro'; export default function App() { const [chartWidth, setChartWidth] = useState(0); const [chartHeight, setChartHeight] = useState(0); const onLayout = event => { const { width, height } = event.nativeEvent.layout; setChartWidth(width); setChartHeight(height); }; return ( <View style={{ flex: 1 }} onLayout={onLayout}> <Echarts option={option} width={chartWidth} height={chartHeight} /> </View> ); } ``` 以上两种方法均可将 react-native-echarts-pro 组件的大小设置为自适应容器的大小。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值