Vue3+echarts5踩坑以及resize方法报错的解决
作者:B_rabbit_d
这篇文章主要介绍了Vue3+echarts5踩坑以及resize方法报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
Vue3+echarts5踩坑resize方法报错
项目要做一个数据统计可视化的模块,按照官网做法调用resize方法时报错:
卡了一整天,最后在官方issues上找到了原因,记录一下。
原因
Vue3使用了proxy
,Echarts无法从中获取内部变量
解决方法
不要在data
中定义chart,或者使用shallowRef
mounted() { // 注:图表不能放进data,vue3使用proxy,echarts无法从中获取变量 let charts = [ { id: 'yearChart', chart: null, options: yearOption }, { id: 'monthChart', chart: null, options: monthOption } ] // 使用刚指定的配置项和数据显示图表。 this.$nextTick(() => { this.charts.forEach(p => { p.chart = echarts.init(document.getElementById(p.id)); p.chart.setOption(p.options); }) }) // 监听窗口变化,重绘图表 window.addEventListener("resize", (() => { this.charts.forEach(p => { setTimeout(() => { // 避免多图同时加载卡顿 p.chart.resize(); }, 200) }) })); },
参考:官方issues
vue3+echarts踩坑小计
想写一下vue3和echarts5写个小demo,然后实现一个小功能,点击按钮进行切换图标数据,在全局监听resize事件时报错
查看原因
发现是在vue3使用proxy监听的,Echarts无法从中获取内部变量
解决方法
不要在data中定义chart,或者使用shallowRef
<template> <button @click="handleClick">更换数据</button> <div id="home" ref="home"> Home </div> </template> <script setup lang="ts"> import { onMounted, reactive, ref, shallowRef } from 'vue'; import {ECharts, EChartsOption,init} from 'echarts'; // import useCurrentInstance from "@/utils/useCurrentInstance"; // const { proxy } = useCurrentInstance() const myChart = shallowRef<ECharts>() const home = ref<HTMLElement>() const myData = reactive([ {id:1,name:'衬衫',xl:22,kc:77}, {id:2,name:'雪纺衫',xl:99,kc:45}, {id:3,name:'羊毛衫',xl:45,kc:11}, {id:4,name:'高跟鞋',xl:15,kc:23}, {id:5,name:'袜子',xl:12,kc:85}, {id:6,name:'帽子',xl:12,kc:85}, {id:7,name:'',xl:12,kc:85}, ]) onMounted(() =>{ const charEle = document.getElementById('home') as HTMLElement; myChart.value = init(charEle) initOptions() window.addEventListener('resize',() =>{ if(myChart.value){ myChart.value.resize() } }) }) const initOptions = () =>{ const option: EChartsOption = { xAxis: { type: 'category', data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] }, yAxis: { type: 'value' }, series: [ { data: [150, 230, 224, 218, 135, 147, 260], type: 'line' } ], legend:{} }; (myChart.value as ECharts ).setOption(option) } const handleClick = () =>{ (myChart.value as ECharts ).setOption({ xAxis:{ data:myData.map(item => item.name) }, series:[ { name:'销量', type:'bar', data:myData.map(item => item.xl) }, { name:'库存', type:'bar', data:myData.map(item => item.kc) } ] }) } </script> <style scoped> #home{ width: 95%; height: 500px; border: red solid 1px; } </style>
结果:
官方的issues:https://github.com/apache/echarts/issues/14781
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。