Vue3+echarts5踩坑以及resize方法报错的解决

 更新时间:2023年07月01日 09:32:40   作者:B_rabbit_d  
这篇文章主要介绍了Vue3+echarts5踩坑以及resize方法报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Vue3+echarts5踩坑resize方法报错

项目要做一个数据统计可视化的模块,按照官网做法调用resize方法时报错:

Wj2utK.png

卡了一整天,最后在官方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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 一文了解Vue实例挂载的过程

    一文了解Vue实例挂载的过程

    这篇文章主要给大家介绍了关于Vue实例挂载的过程,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-03-03
  • vue中的vue-print-nb如何实现页面打印

    vue中的vue-print-nb如何实现页面打印

    这篇文章主要介绍了vue中的vue-print-nb如何实现页面打印,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • 使用el-form之表单校验自动定位到报错位置问题

    使用el-form之表单校验自动定位到报错位置问题

    这篇文章主要介绍了使用el-form之表单校验自动定位到报错位置问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • vue的注意规范之v-if 与 v-for 一起使用教程

    vue的注意规范之v-if 与 v-for 一起使用教程

    这篇文章主要介绍了vue的注意规范之v-if 与 v-for 一起使用方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • Vue实现渐变色进度条的代码

    Vue实现渐变色进度条的代码

    这篇文章主要介绍了Vue实现渐变色进度条的代码,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • Vue监控路由与路由参数, 刷新当前页面数据的方法汇总

    Vue监控路由与路由参数, 刷新当前页面数据的方法汇总

    这篇文章主要介绍了Vue监控路由与路由参数, 刷新当前页面数据的几种方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-10-10
  • 如何基于Vue制作一个猜拳小游戏

    如何基于Vue制作一个猜拳小游戏

    Vue.js作为目前最热门最具前景的前端框架之一,其提供了一种帮助我们快速构建并开发前端项目的新的思维模式,下面这篇文章主要给大家介绍了关于如何基于Vue制作一个猜拳小游戏的相关资料,需要的朋友可以参考下
    2023-01-01
  • vue.js计算属性computed用法实例分析

    vue.js计算属性computed用法实例分析

    这篇文章主要介绍了vue.js计算属性computed用法,结合实例形式分析了vue.js使用computed方式进行属性计算的相关操作技巧,需要的朋友可以参考下
    2018-07-07
  • 解读vue生成的文件目录结构及说明

    解读vue生成的文件目录结构及说明

    本篇文章主要介绍了解读vue生成的文件目录结构及说明,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • vue mounted周期中document.querySelectorAll()获取不到元素的解决

    vue mounted周期中document.querySelectorAll()获取不到元素的解决

    这篇文章主要介绍了vue mounted周期中document.querySelectorAll()获取不到元素的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03

最新评论