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 uni-app以H5模式引入Jquery配置教程

    Vue uni-app以H5模式引入Jquery配置教程

    这篇文章主要为大家介绍了Vue uni-app以H5模式引入Jquery配置教程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 详解vue-cli+element-ui树形表格(多级表格折腾小计)

    详解vue-cli+element-ui树形表格(多级表格折腾小计)

    这篇文章主要介绍了vue-cli + element-ui 树形表格(多级表格折腾小计),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-04-04
  • Vue Form表单的使用方法(rules格式校验网络校验键盘按键监听)

    Vue Form表单的使用方法(rules格式校验网络校验键盘按键监听)

    本文介绍了在Vue.js中使用表单校验规则(rules)进行网络请求校验的方法,以及如何通过formRef引用表单对象并进行键盘按键监听,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • 仿vue-cli搭建属于自己的脚手架的方法步骤

    仿vue-cli搭建属于自己的脚手架的方法步骤

    这篇文章主要介绍了仿vue-cli搭建属于自己的脚手架的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Vue3实现跑马灯效果

    Vue3实现跑马灯效果

    这篇文章主要为大家详细介绍了Vue3实现跑马灯效果,可以更换颜色,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Vite中Rollup打包的实现

    Vite中Rollup打包的实现

    Rollup是一个JavaScript模块打包器,它可以将多个小的JavaScript 模块打包成一个大的模块,本文主要介绍了Vite中Rollup打包的实现,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03
  • vue数组中不满足条件跳出循环问题

    vue数组中不满足条件跳出循环问题

    这篇文章主要介绍了vue数组中不满足条件跳出循环问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Element plus 表单中下拉框的空值问题解决

    Element plus 表单中下拉框的空值问题解决

    有时候会碰到查询条件需要用下拉框来区分的时候,比如需要区分全部 | 启用 | 停用三个状态,这时一般会给全部的value值设置为'',但是这样会导致下拉框无法选中对应的全部选项,本文就来介绍一下这个问题解决,感兴趣的可以了解一下
    2024-11-11
  • Vue resource三种请求格式和万能测试地址

    Vue resource三种请求格式和万能测试地址

    这篇文章主要介绍了Vue-resource三种请求格式和万能测试地址,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-09-09
  • elementui之封装下载模板和导入文件组件方式

    elementui之封装下载模板和导入文件组件方式

    这篇文章主要介绍了关于elementui之封装下载模板和导入文件组件方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12

最新评论