React+Echarts简单的封装套路

今天我们来介绍一下React中,对Echarts的一个简单的封装。

首先在我们的React项目中,想使用Echart包,首先需要先安装它,安装代码如下,任选一个就可以

cnpm install echarts --save
npm install echarts --save
yarn add echarts --save

安装好之后,新建一个JS文件,命名test.js,首先导入的是各种依赖(总代码在文章结尾)

import React from ‘react‘;
import echarts from ‘echarts/lib/echarts‘;
import ‘echarts/lib/chart/bar‘;
import ‘echarts/lib/chart/line‘;
import ‘echarts/lib/component/tooltip‘;
import ‘echarts/lib/component/title‘;
import ‘echarts/lib/component/legend‘;
import ‘echarts/lib/component/toolbox‘;
import ‘echarts/lib/component/markPoint‘;
import ‘echarts/lib/component/markLine‘;

Echeart是需要对真实DOM进行渲染的,且必须用ID不能用className,所以在componentDidMount生命周期的时候,就需要get这个图表的id进行初始化,如:

let myChart = echarts.init(document.getElementById(‘myTable‘));

但是反过来想一想,当你需要多次使用该组件的时候,你会发现如果是固定id的时候会出现问题,因为id只能有一个,所以这里会有两种处理方式:

1、如果你习惯于在这个组件留下能操控的id,你可以在给这个组件传值的时候,传入一个id参数,这样可以自己手动保证id不重复,还能在组件外能CSS或JS操作这个图标。

let { id } = this.props.data;
let myChart = echarts.init(document.getElementById( id ? id : ‘myTable‘));

2、如果你不需要留下自己操作的id,可以使用随机的id,这样不用留神是否id重复的问题(以下代码已省略部分)

let getRandomID = () => Number(Math.random().toString().substr(4, 10) + Date.now()).toString(36)
let id = getRandomID();
class Test extends React.Component {
    componentDidMount() {
        window.addEventListener("resize", function () {
            myChart.resize();
        });
        // 初始化
        let myChart = echarts.init(document.getElementById(id));
    render() {
        return (
            <div id={id}></div>
        );
    }
}

export default Test;

初始化完成后,使用图表是当然需要使用数据的,我们当然是不希望数据是只能固定一排或者两排的,所以我们应该在组件外传入不定量的数据,然后在组件中自动去初始化这个图表,这里我的传入数据有:图表标题、x轴名、y轴数据、y轴数据所对应的项目名、该图表的高度和宽度、id。以下就是我的组件代码:

import React from ‘react‘;
import echarts from ‘echarts/lib/echarts‘;
import ‘echarts/lib/chart/bar‘;
import ‘echarts/lib/chart/line‘;
import ‘echarts/lib/component/tooltip‘;
import ‘echarts/lib/component/title‘;
import ‘echarts/lib/component/legend‘;
import ‘echarts/lib/component/toolbox‘;
import ‘echarts/lib/component/markPoint‘;
import ‘echarts/lib/component/markLine‘;

const defaultType = ‘bar‘;
const defaultWidth = ‘100%‘;
const defaultHeight = ‘300px‘;
let getRandomID = () => Number(Math.random().toString().substr(4, 10) + Date.now()).toString(36)
let id = getRandomID();
class Test extends React.Component {
    componentDidMount() {
        window.addEventListener("resize", function () {
            myChart.resize();
        });
        // 初始化
        let { title, xdata, ydata, legend } = this.props.data;
        let myChart = echarts.init(document.getElementById(id));
        let series = [];
        for (let i = 0; i < ydata.length; i++) {
            let item = {
                name: legend[i],
                type: defaultType,
                data: ydata[i],
                markPoint: {
                    data: [
                        { type: ‘max‘, name: ‘最大值‘ },
                        { type: ‘min‘, name: ‘最小值‘ }
                    ]
                },
                markLine: {
                    data: [
                        { type: ‘average‘, name: ‘平均值‘ }
                    ]
                }
            }
            series.push(item)
        }
        // 绘制图表
        myChart.setOption({
            title: { text: title },
            tooltip: {
                trigger: ‘axis‘
            },
            legend: {
                data: legend
            },
            toolbox: {
                show: true,
                feature: {
                    dataView: { show: true, readOnly: false },
                    magicType: { show: true, type: [‘line‘, ‘bar‘] },
                    restore: { show: true },
                    saveAsImage: {
                        show: true,
                        type: ‘jpg‘
                    }
                }
            },
            xAxis: [
                {
                    type: ‘category‘,
                    data: xdata
                }
            ],
            yAxis: [
                {
                    type: ‘value‘
                }
            ],
            series
        });
    }
    render() {
        let { width, height } = this.props.data;
        return (
            //默认高宽
            <div id={id} style={{ width: width ? width : defaultWidth, height: height ? height : defaultHeight }}></div>
        );
    }
}

export default Test;

这样封装好了之后,我们的调用就很舒服,无论是传几条数据在ydata里面都可以。

import React, { Component } from ‘react‘
import Test from ‘./Test‘

class All extends Component {
    constructor(props) {
        super(props);
    }
    render() {
        return (
            <div className="all">
                    <Test data={{
                        id: ‘mainmain‘,
                        width: ‘100%‘,
                        height: ‘500px‘,
                        title: ‘某地区新增男孩人数、女孩人数和总人数‘,
                        xdata: [‘1月‘, ‘2月‘, ‘3月‘, ‘4月‘, ‘5月‘, ‘6月‘, ‘7月‘, ‘8月‘, ‘9月‘, ‘10月‘, ‘11月‘, ‘12月‘],
                        ydata: [[2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3],
                        [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3],
                        [4.6, 10.8, 16, 50, 54.3, 147.4, 311.2, 344.4, 81.3, 38.8, 12.4, 5.6]],
                        legend: [‘男孩‘, ‘女孩‘, ‘总人数‘]
                    }} />
            </div>
        )
    }
}

export default All

这是一个非常简单,但是实用的封装,不止是在Echarts,在很多其他的地方,大家都可以用到这么一套方法来封装自己的组件

原文地址:https://www.cnblogs.com/JobsOfferings/p/ReactWithEcharts.html

时间: 2024-11-05 14:37:43

React+Echarts简单的封装套路的相关文章

【实例教程】Echarts 的 Java 封装类库

Echarts 的 Java 封装类库:http://www.oschina.net/p/echarts-java 没想到喜欢Echarts 的 Java 封装类库的人还挺多,在源码中的测试例子一般目的只是构造官网例子的结构,这里写个比较实际的简单例子来演示如何写出一个图表. 首先看看Option的提示. Option说明 Option正式代码中使用,不需要任何依赖. GsonOption正式代码中可以使用,需要引入Gson包,使用toString()方法可以转换为JSON结构的数据(支持fun

html --- ajax --- javascript --- 简单的封装

Ajax的简单封装 Ajax的全称是AsynchronousJavaScriptAndXML 如有疑问请参考:http://zh.wikipedia.org/zh-cn/AJAX 以及传智播客的视频教程:http://java.itcast.cn/news/8308d118/740a/4dcd/8dbf/c73d2fe5bc60.shtml 其实已经有好多框架对它进行了封装,但是还是有好多时候用到自己封装的 透露一下,本人是宇多田光的听众之一哦! 封装后的代码如下: 文件路径:\web\Ajax

最新 AFNetworking 3.0 简单实用封装

AFNetworking 3.0 的到来使我们开发者又方便了许多,话不多说,直接上代码. 1.首先 引入框架AFNetworking框架 GitHub下载地址:https://github.com/AFNetworking/AFNetworking AFNetworking官网地址:http://afnetworking.com 2.导入AFNetworking 支持框架 #import<MobileCoreServices/MobileCoreServices.h> #import<S

对bootstrap modal的简单扩展封装

对bootstrap modal的简单扩展封装 参考自:http://www.muzilei.com/archives/677   注:原文不支持bootstrap新版本,并且居中等存在问题 此段时间一直在学习bootstrap,主要是用于做后台,一直习惯用easyui,ui,jgrid前端框架,以至于并不习惯bootstrap的风格.近来考虑到easyui性能不太好,就用了bootstrap,先说下我所了解的bootstrap. 1.外国的框架用于显示中文看着总是不妥. 2.默认的样式觉得有些

一个用python简单的封装了aria2的jsonrpc中adduri的脚本

aria2是一个十分牛逼的下载神器,有时候项目需要一个很牛逼的下载中间件的话,aria2是一个不错的选择.其中支持jsonrpc和websocket的特性尤其诱人.但是python用起来还是有点不爽,所以简单封装一下aria2的jsonrpc. 所以,用python简单的封装了aria2的jsonrpc中adduri的脚本. 使用起来非常简单,仅需要三行代码. from pyaria2 import Jsonrpc jsonrpc = Jsonrpc('localhost', 6800) res

React Hooks简单业务场景实战(非源码解读)

前言 React Hooks 是React 16.7.0-alpha 版本推出的新特性.从 16.8.0 开始,React更稳定的支持了这一新特性. 它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性. 注意:React 16.8.0 是第一个支持 Hook 的版本.升级时,请注意更新所有的 package,包括 React DOM.React Native 将在下一个稳定版本中支持 Hook. 如果说promise是JavaScript异步的终极解决方案,那

Echarts简单应用

在对比了HighCharts之后,因为版权问题,还是决定在项目中采用Echarts来做图表展示. Echarts更新速度很快,已经更新到Echarts3了,感觉3的表现更炫.更酷,据说性能更好,但考虑到项目的整体风格,还是采用Echarts2的版本.  在项目正式开始之前,做个一个简单的Demo,结合EasyUI的Grid呈现一个柱状图,后期再考虑对Echarts的js进行二次封装. Echarts的使用跟HighCharts很类似,之前基于HighCharts做了一个Demo之后,熟悉了这类框

SSH 项目中 用Hibernate底层 简单的封装DAO层

废话不多少了,主要是使用hibernate的查询方法,自己封装了DAO层,供service来方便使用. 首先:必须要继承的 public class CommonDao extends HibernateDaoSupport 紧接着是要注入必须的数据源: @Resource private SessionFactory sessionFactory; @PostConstruct public void initSessionFactory() { super.setSessionFactory

echarts简单使用

最近在做一个项目,开始使用的是acharts,在电脑端访问的效果还真不错,但是放到手机端访问就惨了,尤其是iOS系统上,各种不兼容,后来准备换收费的hightcharsts,无意间发现有个免费的echarts,后来研究了一下,效果还可以,可是用使用.手机端访问也没问题.下面是一些简单的设置参数,仅供参考:在http://echarts.baidu.com/doc/example/pie1.html上可以直接执行. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16