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 相关文章推荐
javascript实现面向对象类的功能书写技巧
Mar 07 Javascript
JS小功能(onmouseover实现选择月份)实例代码
Nov 28 Javascript
jQuery中offsetParent()方法用法实例
Jan 19 Javascript
javascript实现选中复选框后相关输入框变灰不可用的方法
Aug 11 Javascript
JavaScript检查子字符串是否在字符串中的方法
Feb 03 Javascript
chosen实现省市区三级联动
Aug 16 Javascript
Vue项目中最新用到的一些实用小技巧
Nov 06 Javascript
微信小程序实现日历效果
Dec 28 Javascript
JavaScript继承的特性与实践应用深入详解
Dec 30 Javascript
原生js实现移动端Touch轮播图的方法步骤
Jan 03 Javascript
jQuery实现的隔行变色功能【案例】
Feb 18 jQuery
5种方法告诉你如何使JavaScript 代码库更干净
Sep 15 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中使用Oracle数据库(5)
2006/10/09 PHP
IE6/7/8/9不支持exec的简写方式
2011/05/25 Javascript
用js写了一个类似php的print_r输出换行功能
2013/02/18 Javascript
编写高效jQuery代码的4个原则和5个技巧
2014/04/24 Javascript
基于豆瓣API+Angular开发的web App
2015/01/02 Javascript
JS自动倒计时30秒后按钮才可用(两种场景)
2015/08/31 Javascript
javascript实现一个简单的弹出窗
2016/02/22 Javascript
JS中Select下拉列表类(支持输入模糊查询)功能
2017/01/17 Javascript
js 性能优化之算法和流程控制
2017/02/15 Javascript
Angular.JS去掉访问路径URL中的#号详解
2017/03/30 Javascript
详解angularjs获取元素以及angular.element()用法
2017/07/25 Javascript
Angular实现类似博客评论的递归显示及获取回复评论的数据
2017/11/06 Javascript
详解webpack3编译兼容IE8的正确姿势
2017/12/21 Javascript
vue + vuex todolist的实现示例代码
2018/03/09 Javascript
详解vue使用插槽分发内容slot的用法
2019/03/28 Javascript
vue+echarts实现可拖动节点的折线图(支持拖动方向和上下限的设置)
2019/04/12 Javascript
JavaScript工具库之Lodash详解
2019/06/15 Javascript
Node.js中文件系统fs模块的使用及常用接口
2020/03/06 Javascript
[03:18]【TI9纪实】社区大触GL与木木
2019/08/25 DOTA
[47:26]完美世界DOTA2联赛 LBZS vs Forest 第二场 11.07
2020/11/09 DOTA
python动态加载变量示例分享
2014/02/17 Python
初步解析Python中的yield函数的用法
2015/04/03 Python
python基于Tkinter库实现简单文本编辑器实例
2015/05/05 Python
使用Django Form解决表单数据无法动态刷新的两种方法
2017/07/14 Python
Python中collections模块的基本使用教程
2018/12/07 Python
python使用pipeline批量读写redis的方法
2019/02/18 Python
如何基于python3和Vue实现AES数据加密
2020/03/27 Python
html5+css3之CSS中的布局与Header的实现
2014/11/21 HTML / CSS
非凡女性奢华谦虚风格:The Modist
2017/10/28 全球购物
MySQL面试题
2014/01/12 面试题
实习评语
2013/12/16 职场文书
乡下人家教学反思
2014/02/01 职场文书
同志主要表现材料
2014/08/21 职场文书
乡镇党员群众路线教育实践活动对照检查材料思想汇报
2014/10/05 职场文书
2016年教师反腐倡廉心得体会
2016/01/13 职场文书
centos8安装nginx1.9.1的详细过程
2021/08/02 Servers