封装一个echarts钩子函数

众所周知,echarts的使用经常会涉及到大量重复的代码,那么封装一个hook来,将重复的代码放在一块,可以节省很多大代码复制。

useCharts

首先要搞清楚echarts需要什么。

  1. 一个Dom节点。
  2. 配置Option。

我们需要什么。

1、生成的echarts的实例对象。

那么我们的大概了解hook需要的参数 option 返回的内容:生成的echarts的实例对象。但是echarts初始化需要用到dom 那么我们就需要在hook里放ref。

const useChart = (option) => {
	const chart = useRef(null);
	let chartInstance= useRef(null);
     //...
	return [chart,chartInstance]
}

 2、生成的echarts的实例对象。

接下来,我们要初始化得到chartInstance---echarts.init(chart.current),但是我们知道,要等组件挂载完毕后才可以获取到Dom,那么init就需要放在UseEffect中,并且要在组件卸载时销毁那么就需要这样写。

const useChart = (option) => {
	const chart = useRef(null);
	let chartInstance= useRef(null);
	
	useEffect(() => {
		chartInstance= echarts.init(chart.current);
		chartInstance.setOption(option)
		return () => {
            //卸载时销毁
			chartInstance && chartInstance.dispose()
		}
	}, [option]);
	
    //由于钩子一开始的chartInstance为null,会在使用的时候定义下来,获取不到最新的实例对象,所以要写一个get函数代替实例
    const getInstance = () => {
		return chartInstance
	}

	return [chart,getInstance]
}

3、配置一些默认的option

由于一个项目echarts的配置项和样式大致时相同的,所以可以把一些特定的option写为常量,setOption的时候合并一下会更方便。

import * as echarts from 'echarts'
import {useEffect, useRef} from "react";
import {merge} from "lodash";

const DEFAUTL_OPTION = {
    //一些默认的配置项
	tooltip: {},
	xAxis: {
		axisLabel: {}
	},
	yAxis: {},
	series: {
		itemStyle: {
			borderRadius: [5, 5, 0, 0],
			color: '#a7d1ff',
		},
		type: 'bar',
	},
}


const useChart = (option) => {
	const chart = useRef(null);
	let chartInstance = useRef(null);
	
	useEffect(() => {
		chartInstance = echarts.init(chart.current);
        //这里使用的merge合并对象用的是lodash的,也可以自己写一个合并函数
		chartInstance .setOption(merge(DEFAUTL_OPTION, option))
		return () => {
			myChart && myChart.dispose()
		}
	}, [option]);
	
	const getInstance = () => {
		return chartInstance 
	}
	
	return [chart, getInstance]
}

4、使用


const Chart = memo(() => {
	const [chart, getInstance] = useChart({
    	//由于配置了默认的配置项 所以这里就可以只关注数据	
        xAxis: {
			data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子'],
		},
		series: {
			data: [5, 20, 36, 10, 10, 20]
		},
	})
	
	const handleClick = () => {
	//通过 钩子函数返回的 getInstance方法就可以成功拿到实例对象,就可以对echarts做一些变化了
    getInstance().setOption(
			{
				series: [
					{
						type: 'bar',
						data: [111, 200, 36, 10, 10, 20]
					}
				]
			})
	}
	
	
	return (
		<div>
			<Button onClick={handleClick.run}>
				切换
			</Button>
			<div
				ref={chart}
				style={{
					height: 400,
					width: 400,
				}}
				className={'size-full rounded-lg bg-gray-50 shadow-lg mt-20'}
			></div>
		</div>
	
	);
})

  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 封装 Echarts 的方法: 1. 安装 Echarts 使用 npm 安装 Echarts: ``` npm install echarts --save ``` 2. 创建 Vue 组件 创建一个 Vue 组件,例如 `Echarts.vue`。 3. 引入 Echarts 在 `Echarts.vue` 中引入 Echarts: ``` import echarts from 'echarts' ``` 4. 初始化 Echarts 在 `mounted` 钩子函数中初始化 Echarts: ``` mounted() { this.initChart() }, methods: { initChart() { const container = this.$refs.container this.chart = echarts.init(container) } } ``` 5. 配置 Echarts 在 `initChart` 方法中配置 Echarts: ``` initChart() { const container = this.$refs.container this.chart = echarts.init(container) const option = { // 配置项 } this.chart.setOption(option) } ``` 6. 监听组件大小变化 为了保证 Echarts 图表在组件大小变化时能够自适应,需要监听组件大小变化,并重新渲染 Echarts 图表。 ``` mounted() { this.initChart() window.addEventListener('resize', this.resizeHandler) }, beforeDestroy() { window.removeEventListener('resize', this.resizeHandler) }, methods: { resizeHandler() { this.chart.resize() } } ``` 7. 封装成可复用的组件 将以上步骤封装一个可复用的 Vue 组件,供其他组件使用。例如: ``` <template> <div ref="container" style="width: 100%; height: 300px;"></div> </template> <script> import echarts from 'echarts' export default { name: 'Echarts', props: { option: { type: Object, required: true } }, mounted() { this.initChart() window.addEventListener('resize', this.resizeHandler) }, beforeDestroy() { window.removeEventListener('resize', this.resizeHandler) }, methods: { initChart() { const container = this.$refs.container this.chart = echarts.init(container) this.chart.setOption(this.option) }, resizeHandler() { this.chart.resize() } } } </script> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值