1. 程式人生 > >如何在react中,實現可伸縮的echarts圖表

如何在react中,實現可伸縮的echarts圖表

1,基礎篇
我們在使用echart,基本使用,可以使用script標籤引入的方式進行使用,也可以使用npm的方式,進行載入echarts。

script的方式,非常簡單,就像我們的jquery一樣,引入這樣的一個js檔案就可以使用echarts了。然後echarts的核心就是例項化一個echarts物件,然後給這個物件設定options,options的設定,參考echarts官方文件。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <!-- 引入 ECharts 檔案 -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/echarts/4.1.0.rc2/echarts-en.common.js"></script>
</head>
<body>
	<div id="main" style="width: 600px;height:400px;"></div>
	<script type="text/javascript">
        // 基於準備好的dom,初始化echarts例項
        var myChart = echarts.init(document.getElementById('main'));
        // 指定圖表的配置項和資料
        var option = {
            title: {
                text: 'ECharts 入門示例'
            },
            tooltip: {},
            legend: {
                data:['銷量']
            },
            xAxis: {
                data: ["襯衫","羊毛衫","雪紡衫","褲子","高跟鞋","襪子"]
            },
            yAxis: {},
            series: [{
                name: '銷量',
                type: 'bar',
                data: [5, 20, 36, 10, 10, 20]
            }]
        };
        // 使用剛指定的配置項和資料顯示圖表。
        myChart.setOption(option);
    </script>
</body>
</html>

npm的方式,使用echarts,這是我們在專案中常用的方式。

npm install --save echarts

使用的時候,我們一般這麼寫。

import Echarts from 'echarts';
Echarts.init(dom);

主要看在react中,我們該如何使用?
2,react中使用echarts
首先先引入echarts,在這之前你需要使用npm下載echarts的依賴。

import React, { Component } from 'react';
import echarts from 'echarts';

然後在react的componentDidMount中,進行echats的例項化。

echarts.init(this.chart)

其中,this.chart是使用react中的ref標記的當前dom。

<div ref={dom => this.chart = dom} className={styles.chartsComponent}></div>

當然,這樣的方式,我們僅僅只能展示一個基本的echarts圖表,但是我們還沒法做到echarts在頁面上的伸縮。這個時候,我們可能需要用到的echarts物件的一些方法。

  • resize()方法,當呼叫此方法,echarts例項會觸發一次重繪功能。
  • dispose()方法,當呼叫此方法,echarts例項會被銷燬。

所以這個隨著頁面的伸縮,或者dom元素的變化的時候,觸發resize方法,就能實現echarts的伸縮特效。

在實現上,我們可以使用onresize事件。

這是可伸縮的echats元件的實現原理。

下面程式碼就是一個echarts可伸縮元件的實現。

3,實現一個echarts的外掛
一個完整的可伸縮的echarts元件應該像下面這樣。

/**
 * Created by mapbar_front on 2018/9/18
 */
import React, { Component } from 'react';
import styles from './index.less';
import echarts from "echarts";
import SizeSensor, { clear, bind} from 'size-sensor'
export default class Mycharts extends Component {
  constructor(props) {
    super(props);
    this.chart = null;
    this.timer = 0;
    this.echartsLib = echarts;
  }
  componentDidMount(){
    this.rerenderCharts();
  }
  disposeCharts() {
    if (this.chart) {
      try {
        clear(this.chart)
      } catch (e) {
        console.warn(e);
      }
    }
    this.myChart.dispose(this.chart);
  }
  rerenderCharts() {
    this.myChart = this.getEchartsInstance();
    this.myChart.setOption(this.props.options);
    if (this.chart) {
      bind(this.chart, () => {
        this.myChart.resize();
      })
    }
  }
  getEchartsInstance() {
    const echartInstance = echarts.getInstanceByDom(this.chart) || echarts.init(this.chart)
    return echartInstance;
  }
  componentWillUnmount(){
    this.myChart.dispose();
  }
  render(){
    return (
      <div ref={dom => this.chart = dom} className={styles.chartsComponent}>

      </div>
    );
  }
}

在使用的時候,直接像這樣使用:

import MyCharts from '../../../components/Echarts';
// 然後在render函式中
<MyCharts options={this.state.option}></MyCharts>

4,整合到npm中使用
像上面的方式,是我們自己寫echarts的可伸縮元件,有沒有更簡單的方式?顯然是有的,我們可以把這個整合到npm的package包中,在任何使用的地方,直接使用就行了,沒有必要重複寫這樣的外掛。

我自己實現的一個可伸縮的echarts包—“wd-echarts-react”;

使用的時候直接npm install。

npm install --save wd-echarts-react;

然後在專案中:

import WdEchartsReact from 'wd-echarts-react';
// render函式中:
render(){
    return (
        <div className={styles.chartItem}>
          <WdEchartsReact options={this.state.option}></WdEchartsReact>
        </div>
    )
 }

這樣就實現了echats的使用。

本專案的github地址:
https://github.com/liwudi/wd-echarts-react.git