React如何以Hook的方式使用Echarts
背景
目前組內(nèi)在開發(fā)的項(xiàng)目使用的雖然是React,但是并不是之前的類式組件,所以寫法有不少的區(qū)別
經(jīng)過查閱之后,現(xiàn)以Hook的方式使用Echarts,在此進(jìn)行總結(jié),方便之后的學(xué)習(xí)。
步驟
安裝Echarts
首先引入Echarts的模塊
npm install echarts --save
如果你使用的是 Typescript ,那么還需要引入 @types/echarts
npm install @types/echarts --save
代碼中引入Echarts
有兩種方式,二選其一,按需引入或全部引入,各有優(yōu)劣,各位可自行選擇
按需引入
代碼如下,使用了echarts,line,tooltip,legend
import echarts from 'echarts/lib/echarts' import 'echarts/lib/chart/line' import 'echarts/lib/component/title' import 'echarts/lib/component/tooltip'
按需引入的優(yōu)點(diǎn)是最后打包生成的文件較小,一般會采用這種方法
全部引入
import echarts from 'echarts'
使用Echarts
React自從新增了Hook特性以后,使用函數(shù)式組件,需要改動一定的地方。
使用useEffect代替之前的初始化函數(shù)
提示
- 如果你熟悉 React class 的生命周期函數(shù)
- 你可以把 useEffect Hook 看做 componentDidMount,componentDidUpdate 和 componentWillUnmount 這三個函數(shù)的組合。
初始化圖表
使用getElementById初始化
綜上,可以在 useEffect 中寫原先在 componentDidMount() 的初始化圖表的函數(shù)
let element = document.getElementById('main');
let myChart = echarts.init(element as HTMLDivElement);
let option = {
title: {
text: 'ECharts 入門示例',
},
tooltip: {
},
legend: {
data:['銷量', '利潤', '比率']
},
xAxis: {
data: ["襯衫", "羊毛衫", "雪紡衫", "褲子", "高跟鞋", "襪子"]
},
yAxis: {
},
series: [
{
name: '銷量',
type: 'bar',
data: [5, 20, 36, 10, 10, 20]
},
{
name: '利潤',
type: 'bar',
data: [30, 25, 15, 20, 20, 35]
},
{
name: '比率',
type: 'line',
data: [35, 30, 20, 25, 25, 40]
}]
};
myChart.setOption(option);
DOM中代碼如下
<div>
<div id={'main'} style={{height: 400}}/>
</div>
使用Ref引用初始化
除了上述的使用getElementById的方法以外,還可以使用ref引用的方式,如以下代碼所示,最后在useEffect里調(diào)用renderChart
const main2 = useRef(null);
let chartInstance = null;
let renderChart = () => {
const myChart = echarts.getInstanceByDom(main2.current as unknown as HTMLDivElement);
if(myChart)
chartInstance = myChart;
else
chartInstance = echarts.init(main2.current as unknown as HTMLDivElement);
chartInstance.setOption({
title: {
text: '燃盡圖'
},
tooltip: {
trigger: 'axis'
},
toolbox: {
feature: {
saveAsImage: {}
}
},
legend: {
data: ['Remain', 'Ideal']
},
xAxis: {
boundaryGap: false,
type: 'category',
data: ['1-1', '1-2', '1-3', '1-5', '1-6', '1-7', '1-8', '1-9']
},
yAxis: {
type: 'value'
},
series: [
{
name: 'Remain',
data: [140, 110, 100, 90, 70, 30, 10, 0],
type: 'line'
},
{
name: 'Ideal',
data: [140, 120, 100, 80, 60, 40, 20, 0],
type: 'line'
}
]
})
};
DOM中代碼如下
<div>
<div style={{height: 400}} ref={main2}/>
</div>
整體代碼
整體的代碼如下所示
import React, {useEffect, useRef, useState} from "react";
import echarts from 'echarts';
const Test: React.FC = () => {
const main2 = useRef(null);
let chartInstance = null;
let renderChart = () => {
const myChart = echarts.getInstanceByDom(main2.current as unknown as HTMLDivElement);
if(myChart)
chartInstance = myChart;
else
chartInstance = echarts.init(main2.current as unknown as HTMLDivElement);
chartInstance.setOption({
title: {
text: '燃盡圖'
},
tooltip: {
trigger: 'axis'
},
toolbox: {
feature: {
saveAsImage: {}
}
},
legend: {
data: ['Remain', 'Ideal']
},
xAxis: {
boundaryGap: false,
type: 'category',
data: ['1-1', '1-2', '1-3', '1-5', '1-6', '1-7', '1-8', '1-9']
},
yAxis: {
type: 'value'
},
series: [
{
name: 'Remain',
data: [140, 110, 100, 90, 70, 30, 10, 0],
type: 'line'
},
{
name: 'Ideal',
data: [140, 120, 100, 80, 60, 40, 20, 0],
type: 'line'
}
]
})
};
let initChart = () => {
let element = document.getElementById('main');
let myChart = echarts.init(element as HTMLDivElement);
let option = {
title: {
text: 'ECharts 入門示例',
},
tooltip: {
},
legend: {
data:['銷量', '利潤', '比率']
},
xAxis: {
data: ["襯衫", "羊毛衫", "雪紡衫", "褲子", "高跟鞋", "襪子"]
},
yAxis: {
},
series: [
{
name: '銷量',
type: 'bar',
data: [5, 20, 36, 10, 10, 20]
},
{
name: '利潤',
type: 'bar',
data: [30, 25, 15, 20, 20, 35]
},
{
name: '比率',
type: 'line',
data: [35, 30, 20, 25, 25, 40]
}]
};
myChart.setOption(option);
};
useEffect(() => {
initChart();
renderChart();
});
return(
<div>
<div id={'main'} style={{height: 400}}/>
<div style={{height: 400}} ref={main2}/>
</div>
);
};
export default Test
最終效果
最后的結(jié)果如下圖所示

總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
ForwardRef?useImperativeHandle方法demo
這篇文章主要為大家介紹了ForwardRef?useImperativeHandle方法demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
react實(shí)現(xiàn)路由動畫跳轉(zhuǎn)功能
這篇文章主要介紹了react路由動畫跳轉(zhuǎn)功能,大概思路是下載第三方庫?引用,創(chuàng)建css文件引用,想要實(shí)現(xiàn)跳轉(zhuǎn)動畫功能,就在那個組件的根節(jié)點(diǎn)綁定classname屬性即可,在跳轉(zhuǎn)的時候即可實(shí)現(xiàn),需要的朋友可以參考下2023-10-10
Zustand介紹與使用 React狀態(tài)管理工具的解決方案
本文主要介紹了Zustand,一種基于React的狀態(tài)管理庫,Zustand以簡潔易用、靈活性高及最小化原則等特點(diǎn)脫穎而出,旨在提供簡單而強(qiáng)大的狀態(tài)管理功能2024-10-10
React + Redux 從單向數(shù)據(jù)流到閉環(huán)實(shí)現(xiàn)
本文徹底剖析 React、Redux 及 Store、Action、Reducer 之間的邏輯關(guān)系與實(shí)現(xiàn)原理,構(gòu)建一個完整的“數(shù)據(jù)流閉環(huán)”認(rèn)知模型,感興趣的可以了解一下2026-06-06
React實(shí)現(xiàn)數(shù)字滾動組件numbers-scroll的示例詳解
數(shù)字滾動組件,也可以叫數(shù)字輪播組件,這個名字一聽就是非常普通常見的組件。本文將利用React實(shí)現(xiàn)這一組件,感興趣的小伙伴可以了解一下2023-03-03
基于react hooks,zarm組件庫配置開發(fā)h5表單頁面的實(shí)例代碼
這篇文章主要介紹了基于react hooks,zarm組件庫配置開發(fā)h5表單頁面,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04
React18系列commit從0實(shí)現(xiàn)源碼解析
這篇文章主要為大家介紹了React18系列commit從0實(shí)現(xiàn)源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01

