基於React Hooks 封裝一個Echarts組件


基於React Hooks 封裝一個Echarts組件

官網 https://echarts.apache.org/zh/index.html

1 Echarts全局配置

echarts.config.js

// 引入 echarts 核心模塊,核心模塊提供了 echarts 使用必須要的接口。
import * as echarts from 'echarts/core';
// 引入柱狀圖圖表,圖表后綴都為 Chart
import { BarChart,PieChart } from 'echarts/charts';
// 引入提示框,標題,直角坐標系,數據集,內置數據轉換器組件,組件后綴都為 Component
import {
    TitleComponent,
    TooltipComponent,
    GridComponent,
    DatasetComponent,
    TransformComponent,
    LegendComponent
} from 'echarts/components';
// 標簽自動布局,全局過渡動畫等特性
import { LabelLayout, UniversalTransition } from 'echarts/features';
// 引入 Canvas 渲染器,注意引入 CanvasRenderer 或者 SVGRenderer 是必須的一步
import { CanvasRenderer } from 'echarts/renderers';


// 注冊必須的組件
echarts.use([
    TitleComponent,
    TooltipComponent,
    GridComponent,
    DatasetComponent,
    TransformComponent,
    BarChart,
    LabelLayout,
    UniversalTransition,
    CanvasRenderer,
    LegendComponent,
    PieChart
]);

export default echarts;

2 封裝React Echarts組件

import React, { useEffect, useRef,memo } from 'react'

import echarts from './echarts.config'

import './ReactEchartComponent.css'

const ReactEchartComponent = (props) => {

    const { option: chartOptions, clickHandler, className } = props

    const dom = useRef()

    useEffect(() => {
        if (chartOptions) {
            const chart = echarts.init(dom.current)
            // chart.showLoading()
            clickHandler && chart.on('click', clickHandler)
            chart.setOption(chartOptions)
            // chart.hideLoading()
        }
    }, [chartOptions, clickHandler])

    return (
        <div className={className} ref={dom}></div>
    )
}

export memo(ReactEchartComponent)

3 使用組件

import React from 'react'
import { useCallback } from 'react';
import { ReactEchartComponent } from '../component/ReactEchartComponent';

import './ReactEchartDemo.css'


const option = {
    legend: {
        orient: 'vertical',
        x: 'right',
        data: ['A', 'B', 'C', 'D', 'E']
    },
    series: [
        {
            type: 'pie',
            radius: ['50%', '70%'],
            avoidLabelOverlap: false,
            label: {
                show: false,
                position: 'left',
                emphasis: {
                    show: true
                }
            },
            labelLine: {
                show: true
            },
            emphasis: {
                label: {
                    show: true,
                    fontSize: '30',
                    fontWeight: 'bold'
                }
            },
            data: [
                { value: 335, name: 'A' },
                { value: 310, name: 'B' },
                { value: 234, name: 'C' },
                { value: 135, name: 'D' },
                { value: 1548, name: 'E' }
            ]
        }
    ]
};

export const ReactEchartDemo = () => {

    const clickHandler = useCallback(
        (e) => {
            console.log(e);
        }, [])

    return (
        <div className='con'>
            <ReactEchartComponent clickHandler={clickHandler} className="chart" option={option}></ReactEchartComponent>
        </div>
    )
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM