Vue3 对于echarts使用 v-show,导致显示不全,宽度仅100px,无法重新渲染的问题

参考链接:
解决Echarts图表使用v-show,显示不全,宽度仅100px的问题_echarts v-show图表不全-CSDN博客

Vue3 echarts v-show无法重新渲染的问题_v-show echarts不渲染-CSDN博客

原因不多赘述了,大概就是v-show 本身是结构已经存在,当数据发生变化时,结构并未重新渲染,所以会出现 echarts 图表未获取到最外层大盒子的宽度而显示一半的情况,就像下图(截的别人的图):

方法一:将 v-show 改成 v-if

但是我做的功能涉及频繁切换,以及更换成v-if后会导致图表的初始化找不到dom, 遂放弃。

方法二:使用nextTick(() => {})函数

首先需要从vue中引入:

TypeScript 复制代码
<script lang="tsx" setup>

import {nextTick} from 'vue';


</script>

然后就是在需要切换v-show状态的地方:

TypeScript 复制代码
<template>

// 放echart图的div
<div v-show="isData" ref="chartRef" style="width:45%; height=400px"></div>

// 切换按钮
<button @click="changeButton">切换按钮</button>

</template>


<script lang="tsx" setup>

import {nextTick} from 'vue';

const isData = ref(false);

// 图表的渲染函数
const echartInit = () => {
    if(chartRef.value){
        const myEchart = echarts.init(chartRef.value);
        // 配置项
        const option = {

           // 此处省略
        };
        
        myEchart.setOption(option);

        // 千万别忘了要resize
        myEchart.resize();        
          
    };
};

const changeButton = () => {

    isData.value = true;
    if(isData.value){
        nextTick(() => {
          // 图表的渲染函数,重新强制让它渲染一次
          echartInit();
        })
    }
    
}
</script>

重点:

  1. 在切换 v-show 的变量时,使用nextTick(() => {})函数 重新调用一次渲染echarts的函数echartInit

2.在渲染函数echartInit 里面要最后写一句resize !

相关推荐
苏武难飞8 分钟前
THREE.JS实现一个魔法镜子!
前端·css·three.js
云浪9 分钟前
从 0 到 1 搭建 RAG 应用:用 LangChain + Chroma + qwen-plus 实现《红楼梦》问答
javascript·vue.js·人工智能
小流苏生19 分钟前
工作十年了,慢慢学习敬畏死亡
前端·程序员·ai编程
xiaoxue..21 分钟前
react:浅聊 vdom 与 diff 算法
前端·javascript·react.js·面试
恋猫de小郭22 分钟前
Flutter 3.41.7 ,小版本但 iOS 大修复,看完只想说:这是人能写出来的 bug ?
android·前端·flutter
止语Lab26 分钟前
记忆溢出:当你的 Agent 记得太多时会发生什么
前端·javascript·vue.js
天天向上102427 分钟前
vue openlayers地图加载大量点位时优化
前端·javascript·vue.js
菩提小狗1 小时前
第42天:WEB攻防-PHP应用&MYSQL架构&SQL注入&跨库查询&文件读写_笔记|小迪安全2023-2024|web安全|渗透测试|
前端·安全·php
liuyouzhang4 小时前
将基于Archery的web数据库审计查询平台封装为jdbc接口的可行性研究(基于AI)
前端·数据库
码事漫谈9 小时前
大模型输出的“隐性结构塌缩”问题及对策
前端·后端