React Native使用百度Echarts显示图表的示例代码


Posted in Javascript onNovember 07, 2017

Echarts是百度推出的免费开源的图表组件,功能丰富,涵盖各行业图表。相信很多同学在网页端都使用过。今天我就来介绍下在React Native中如何使用Echarts来显示各种图表。

首先需要在我们的React Native项目中安装native-echarts组件,该组件是兼容IOS和安卓双平台的。

安装

npm install native-echarts --save

安装完成后在node_modules文件夹下会多出一个文件夹叫native-echarts。

目录结构如下图所示:

 React Native使用百度Echarts显示图表的示例代码

基础使用

native-echarts的使用方法基本和网页端的Echarts使用方法一致。组件主要有三个属性:

  1. option (object):图表的相关配置和数据。详见文档:ECharts Documentation
  2. width (number):图表的宽度,默认值是外部容器的宽度。
  3. height (number) :图表的高度,默认值是400。

示例代码:

import React, { Component } from 'react';
import {
 AppRegistry,
 StyleSheet,
 Text,
 View
} from 'react-native';
import Echarts from 'native-echarts';

export default class app extends Component {
 render() {
  const option = {
   title: {
     text: 'ECharts demo'
   },
   tooltip: {},
   legend: {
     data:['销量']
   },
   xAxis: {
     data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
   },
   yAxis: {},
   series: [{
     name: '销量',
     type: 'bar',
     data: [5, 20, 36, 10, 10, 20]
   }]
  };
  return (
   <Echarts option={option} height={300} />
  );
 }
}

AppRegistry.registerComponent('app', () => app);

React Native使用百度Echarts显示图表的示例代码

通过上面的代码我们就可以在React Native里面显示一个图表了。但是我们会发现显示的字体会偏小。我们需要适配下移动端的字体,我们需要在native-echarts文件下找到tpl.html文件,在head里面增加下面一句代码:
<meta name="viewport" content="width=device-width, initial-scale=1"> 这样字体大小就显示正常了。

进阶使用:

在使用图表时,如果我们需要使用图表的点击事件,比如点击柱状图的某个柱子,获取到该柱子的信息,再跳转到详情页面,这该怎么做呢?组件本身是没有这个属性的,需要我们自己修改下代码,传递下消息。具体代码如下:

首先我们需要在renderChart.js文件中把需要的数据注入并传递出来(window.postMessage):

import echarts from './echarts.min';
import toString from '../../util/toString';

export default function renderChart(props) {
 const height = props.height || 400;
 const width = props.width || 568;
 return `
  document.getElementById('main').style.height = "${height}px";
  document.getElementById('main').style.width = "${width}px";
  var myChart = echarts.init(document.getElementById('main'));
  myChart.setOption(${toString(props.option)});
  myChart.on('click', function (params) {
   var message = {};
   message.event='click';
   message.seriesName = params.seriesName;
   message.name = params.name;
   window.postMessage(JSON.stringify(message));
 });
 `
}

然后在index.js中做处理(handleMessage):

import React, { Component } from 'react';
import { WebView, View, StyleSheet, Platform } from 'react-native';
import renderChart from './renderChart';
import echarts from './echarts.min';

export default class App extends Component {
 componentWillReceiveProps(nextProps) {
  if(JSON.stringify(nextProps.option) !== JSON.stringify(this.props.option)) {
   this.refs.chart.reload();
  }
 }
 handleMessage = (evt) => {
  const message = JSON.parse(evt.nativeEvent.data)
   this.props.handleMessage(message);
 }
 render() {
  return (
   <View style={{flex: 1, height: this.props.height,width: this.props.width }}>
    <WebView
     ref="chart"
     scrollEnabled = {false}
     injectedJavaScript = {renderChart(this.props)}
     style={{
      height: this.props.height|| 400,
      width: this.props.width || 568,
     }}
     onMessage={this.handleMessage}
     source={require('./tpl.html')}
    />
   </View>
  );
 }
}

最后在使用图表的页面中,修改下代码来接受传递过来的消息:
<Echarts option={option} height={height} width={theme.screenWidth} handleMessage={this.handleMessage} />

在handleMessage方法中就可以写自己的逻辑来处理传递过来数据了。

打包:

如果就这样打包的话,IOS是可以正常打包并显示的。但是在android端打包时会出错。

解决方法:

将index.js中的代码:source={require('./tpl.html')}修改为:

source= {Platform.OS === 'ios' ? require('./tpl.html') : { uri: 'file:///android_asset/tpl.html' }}

同时将tpl.html文件拷贝到安卓项目下面的app/src/main/assets文件夹中。

在执行完react-native bundle命令后,需要手动将资源文件res/drawable-mdpi中生成的tpl.html文件删除,再执行cd android && ./gradlew assembleRelease命令,这样就能成功打包了。

Q1

当数据量比较大的时候,x轴的数据不显示。这个是echarts自己的一个功能,解决办法是设置xAxis-axisLabel-interval为0即可。

Q2

面积折线图中面积颜色“不正“,也就是说和设置的颜色对不上。这个可能是react-native-echarts组件封装的问题,解决办法是设置areaStyle-normal-shadowColor为'#ffffff',同理可以设置lineStyle等。

Q3

打release包的时候报错了,
\android\app\src\main\res\drawable-mdpi\node_modules_nativeecharts_src_components_echarts_tpl.html
Error:Error: The file name must end with .xml or .png

原因:

release打包的时候把node_modules_nativeecharts_src_components_echarts_tpl.html打到了drawable下,这是不行的,要放到assets下。

解决办法是

另外,release版本只能使用uri加载资源,android把tpl.html文件放在android/app/src/main/assets文件里,使用uri:'file:///android_asset/tpl.html'这个地址加载,ios在项目目录下建个文件夹,把tpl文件放里面去,使用uri:'文件名/tpl'加载。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
IE8 下的Js错误HTML Parsing Error...
Aug 14 Javascript
JS获取整个页面文档的实现代码
Dec 15 Javascript
JS中字符串trim()使用示例
May 26 Javascript
jquery简单实现幻灯片的方法
Aug 03 Javascript
原生JS和jQuery版实现文件上传功能
Apr 18 Javascript
BootStrap响应式导航条实例介绍
May 06 Javascript
JavaScript_ECMA5数组新特性详解
Jun 12 Javascript
Jquery把获取到的input值转换成json
May 15 jQuery
vue.js使用v-if实现显示与隐藏功能示例
Jul 06 Javascript
vue与原生app的对接交互的方法(混合开发)
Nov 28 Javascript
ES6如何用一句代码实现函数的柯里化
Jan 18 Javascript
Element DateTimePicker日期时间选择器的使用示例
Jul 27 Javascript
浅谈在Vue-cli里基于axios封装复用请求
Nov 06 #Javascript
浅谈mint-ui 填坑之路
Nov 06 #Javascript
基于vue实现分页效果
Nov 06 #Javascript
vue使用mint-ui实现下拉刷新和无限滚动的示例代码
Nov 06 #Javascript
JS实现分页浏览横向图片(类轮播)实例代码
Nov 06 #Javascript
Angular实现类似博客评论的递归显示及获取回复评论的数据
Nov 06 #Javascript
vue自定义过滤器创建和使用方法详解
Nov 06 #Javascript
You might like
PHP去除数组中重复的元素并按键名排序函数
2008/08/18 PHP
php获取文件夹路径内的图片以及分页显示示例
2014/03/11 PHP
php使用str_replace实现输入框回车替换br的方法
2014/11/24 PHP
thinkphp中memcache的用法实例
2014/11/29 PHP
Laravel 5框架学习之数据库迁移(Migrations)
2015/04/08 PHP
CodeIgniter扩展核心类实例详解
2016/01/20 PHP
php处理抢购类功能的高并发请求
2018/02/08 PHP
PHP模版引擎原理、定义与用法实例
2019/03/29 PHP
js鼠标滑轮滚动事件绑定的简单实例(兼容主流浏览器)
2014/01/14 Javascript
jquery图片滚动放大代码分享(2)
2015/08/28 Javascript
AngularJS入门教程之AngularJS模型
2016/04/18 Javascript
js改变style样式和css样式的简单实例
2016/06/28 Javascript
js字符串与Unicode编码互相转换
2017/05/17 Javascript
使用命令行工具npm新创建一个vue项目的方法
2017/12/27 Javascript
VUE 使用中踩过的坑
2018/02/08 Javascript
Angular事件之不同组件间传递数据的方法
2018/11/15 Javascript
vue watch监控对象的简单方法示例
2021/01/07 Vue.js
[48:21]Mski vs VGJ.S Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
python进阶教程之函数参数的多种传递方法
2014/08/30 Python
opencv python 图像去噪的实现方法
2018/08/31 Python
Python通过for循环理解迭代器和生成器实例详解
2019/02/16 Python
Django Celery异步任务队列的实现
2019/07/24 Python
python数字类型math库原理解析
2020/03/02 Python
Python脚本实现监听服务器的思路代码详解
2020/05/28 Python
以设计师精品品质提供快速时尚:PopJulia
2018/01/09 全球购物
手工制作的意大利太阳镜和光学元件:Illesteva
2019/01/19 全球购物
中专自我鉴定范文
2013/10/16 职场文书
影视艺术学院毕业生自荐信
2013/11/13 职场文书
市政施工员自我鉴定
2014/01/15 职场文书
园林技术个人的自我评价
2014/02/15 职场文书
竞争与合作演讲稿
2014/05/12 职场文书
世界卫生日宣传活动总结
2015/02/09 职场文书
倡议书怎么写?
2019/04/11 职场文书
《中国古代诗歌散文欣赏》高中语文教材
2019/08/20 职场文书
SpringBoot实现quartz定时任务可视化管理功能
2021/08/30 Java/Android
Win10本地连接不见了怎么恢复? win10系统电脑本地连接不见了解决方法
2023/01/09 数码科技