RN中native-echarts组件加入节点点击事件并传值

本博主是个菜鸟,只是找不到如题的相关解决方案,所以写了个文分享下,如果有更好的解决方案麻烦分享给我下,谢谢~不喜勿喷

写完觉得有点啰嗦,但是不啰嗦,又怕不详细,所以回来补充一句,其实很简单,如果嫌烦的话,直接看有截图的位置的话就可以了。


遇到一个功能,是将数据绘制为折现图并且显示出来,于是找到了一个demo,demo原文地址如下:http://blog.csdn.net/sinat_17775997/article/details/71126857;

根据这个demo教程,使用native-echarts 成功绘制出了一个简单的折线图。


绘制出折线图之后,查了下native-echarts的教程,没找到点击事件的使用方法,后来只能自己去看组件内部,发现是将HTML5中的Echarts封装在Webview中的,想起了Echarts中的点击事件的使用方法,就尝试了下。

不啰嗦,直接说重点,先找到放组件的文件夹node_modules,其下的native echarts文件夹中src->components->Echarts中有个index.js,这个JS文件就是组件放置webview的地方,你可以看到此文件的webview中使用了injectedJavaScript,这个是设置在网页加载之前注入一段JS代码。

顺势找到需要注入的代码文件,就是index.js同级下的文件:renderChart.js,打开之后就会发现一段HTML的代码,和Echarts的代码基本同样,在这里就给节点加点击事件了。代码如下图红框处:

至此,你点击折线图的节点就会有点击事件。注意事项:节点小的话,点击不到,会不灵,所以最好把节点放大些,就是在Echarts所需数据的series中设置symbolSize的值,默认是4,调到10以上稳一些。还是不清楚怎么设置节点大小的,可以百度echarts的symbolSize的使用方法。

点击事件加上之后,就是将Webview的值传出去,传到我们需要展示的页面上。这里是百度了Webview和RN的交互,通过实验后,发现其实很简单。使用webview自带的两个方法就可以了,网上的讲解的交互都有点复杂了,也可以说很详细,只是对于我们需要的功能来说,复杂了。

主要使用onMessage和postMessage两个自带的方法即可。代码如下:

首先,在我们自己写的页面(展示折线图的自定义的页面)上加入一个自定义的方法,图中的 2 处,是自己定义的方法,在 1 处自己定义一个类似于callBack的回调函数。额,我多余的解释下,1处是获取到2处的方法,然后将方法存在自定义的那个橘黄色的变量名中,推入了props里,传到组件里获取。

然后在Echarts文件夹中的index.html(前面说了路径的),加入下方红框中的代码:           

在Echarts文件夹中的renderChart.js中间加入红框中的代码即可。注意:那个params.componentType的参数只是我做测试用的,你可以根据自己的需要传值,点击节点时返回值基本都在params中,具体关于params中参数的意思看下echarts官方的文档吧,我就不说了,太多了.....

至此,点击节点接可以获取到数据了,我的这个测试代码里,就是alert出一个“ceshiseries”,这个series就是折线图返回的那个值,即params.componentType。




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 React Native ,保存图片需要获取写入权限。您可以使用 React Native 的 PermissionsAndroid API 来请求用户的许可。 以下是一些示例代码,可以在保存图片之前请求权限: ```javascript import { PermissionsAndroid, Platform } from 'react-native'; import RNFetchBlob from 'rn-fetch-blob'; async function requestStoragePermission() { try { const granted = await PermissionsAndroid.request( PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE, { title: 'Storage Permission', message: 'App needs access to your storage to save photos', }, ); if (granted === PermissionsAndroid.RESULTS.GRANTED) { console.log('Storage permission granted'); } else { console.log('Storage permission denied'); } } catch (err) { console.warn(err); } } async function saveImage(imageUri) { if (Platform.OS === 'android') { await requestStoragePermission(); } const { config, fs } = RNFetchBlob; const date = new Date(); const imagePath = `${fs.dirs.DCIMDir}/photo_${date.getTime()}.png`; await config({ fileCache: true, addAndroidDownloads: { useDownloadManager: true, notification: true, path: imagePath, }, }).fetch('GET', imageUri); console.log('Image saved to', imagePath); } ``` 这里使用了 RNFetchBlob 模块来下载和保存图片。在 Android 平台上,我们先请求存储权限,然后使用 `addAndroidDownloads` 配置项将图片保存到设备上。 请注意,如果您正在使用 Expo,您需要使用 `expo-permissions` 模块来请求权限。您可以使用以下代码示例: ```javascript import { Platform } from 'react-native'; import * as ImagePicker from 'expo-image-picker'; import * as Permissions from 'expo-permissions'; import RNFetchBlob from 'rn-fetch-blob'; async function requestStoragePermission() { const { status } = await Permissions.askAsync(Permissions.CAMERA_ROLL); if (status === 'granted') { console.log('Storage permission granted'); } else { console.log('Storage permission denied'); } } async function saveImage(imageUri) { if (Platform.OS === 'android') { await requestStoragePermission(); } const { config, fs } = RNFetchBlob; const date = new Date(); const imagePath = `${fs.dirs.DCIMDir}/photo_${date.getTime()}.png`; await config({ fileCache: true, addAndroidDownloads: { useDownloadManager: true, notification: true, path: imagePath, }, }).fetch('GET', imageUri); console.log('Image saved to', imagePath); } ``` 请注意,这里使用了 Expo 的 `Permissions` 模块来请求存储权限,而不是使用 `PermissionsAndroid`。此外,Expo 也提供了自己的 `ImagePicker` 模块,可以用来选择图片,而不需要使用第三方组件

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值