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之过滤器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助,希望能够给你带来帮助
    2021-11-11
  • Vue中关于异步请求数据未更新的解决

    Vue中关于异步请求数据未更新的解决

    本文将探讨Vue中异步请求数据未更新的常见原因,并提供解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • Vue使用Echarts画柱状图详解

    Vue使用Echarts画柱状图详解

    数据的重要性我们大家都知道,就算再小的项目中都可能使用几个图表展示,我最近在做项目的过程中也是需要用到图表,最后选择了echarts图表库,这篇文章主要介绍了Vue使用Echarts画柱状图
    2022-12-12
  • vue单文件组件lint error自动fix与styleLint报错自动fix详解

    vue单文件组件lint error自动fix与styleLint报错自动fix详解

    这篇文章主要给大家介绍了关于vue单文件组件lint error自动fix与styleLint报错自动fix的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • Element-UI日期选择器(选择日期范围)禁用未来日期实现代码

    Element-UI日期选择器(选择日期范围)禁用未来日期实现代码

    我们在网页开发时通常需要用到一些日期组件来方便用户选择时间,其中element日期组件是一个非常好用的工具,这篇文章主要给大家介绍了关于Element-UI日期选择器(选择日期范围)禁用未来日期的相关资料,需要的朋友可以参考下
    2024-02-02
  • vue跨域问题:Access to XMLHttpRequest at‘httplocalhost解决

    vue跨域问题:Access to XMLHttpRequest at‘httplocalhost解决

    在前端发出Ajax请求的时候,有时候会产生跨域问题,下面这篇文章主要给大家介绍了关于vue跨域问题:Access to XMLHttpRequest at‘httplocalhost的解决办法,需要的朋友可以参考下
    2023-01-01
  • vue使用Luckysheet插件实现excel导入导出

    vue使用Luckysheet插件实现excel导入导出

    本文主要介绍了vue使用Luckysheet插件实现excel导入导出,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-03-03
  • vue如何判断组件进入可视区域

    vue如何判断组件进入可视区域

    这篇文章主要介绍了vue如何判断组件进入可视区域问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • SpringBoot+Vue 前后端合并部署的配置方法

    SpringBoot+Vue 前后端合并部署的配置方法

    这篇文章主要介绍了SpringBoot+Vue 前后端合并部署的配置方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • vue中实现拖拽排序功能的详细教程

    vue中实现拖拽排序功能的详细教程

    在业务中列表拖拽排序是比较常见的需求,下面这篇文章主要给大家介绍了关于vue中实现拖拽排序功能的详细教程,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08

最新评论