当前位置: 首页 > news >正文

【ECharts✨】解决Vue 中 v-show 导致组件 ECharts 样式异常问题

解决Vue 中 v-show 导致组件 ECharts 样式异常问题

问题概述

在使用 Vue 的 v-show 指令实现 <PageOne/><PageTwo/><PageThree/> 三个视图的定时切换时,<PageTwo/> 显示时出现了异常,具体表现为 ECharts 图表渲染图表尺寸异常问题,严重影响了页面的正常展示和用户体验。

错误原因

v-show 的隐藏机制通过设置 display: none 隐藏元素,虽然元素仍然保留在 DOM 中,但它不参与页面的布局计算,因此宽高被计算为 0。当 ECharts 初始化时,它依赖容器的实际尺寸来渲染图表。如果此时容器处于隐藏状态,ECharts 会以 0 尺寸进行渲染,之后切换为可见时,图表无法自动修正其尺寸,导致图表渲染异常 。

解决方法:

🌟延迟初始化并重绘图表

  1. 父组件传递显示状态

    在父组件中使用 currentPage 判断,并通过 isVisible 属性告知 <PageTwo/> 当前是否可见:

    <!-- 父组件模板 -->
    <PageTwov-show="currentPage === 2":is-visible="currentPage === 2"
    />```
    
  2. 在 PageTwo 中监听并重绘

    PageTwo 接收 isVisible,通过 watch 监听其变化,在可见时延迟执行图表初始化和尺寸更新:

    <script setup>
    import { ref, watch, nextTick } from 'vue';
    import { initChart, handleWindowResize } from '@/utils/chartHelper';const props = defineProps({ isVisible: Boolean });
    const gridItems = ref([]);watch(() => props.isVisible,(visible) => {if (visible) {// 等待 DOM 完全渲染nextTick(() => {// 重新初始化每个图表gridItems.value.forEach(item => initChart(item.id));// 触发全局 resize,通知 ECharts 更新尺寸handleWindowResize();});}},{ immediate: true }
    );
    </script>
    

    说明:确保 initChart 方法内部调用了 echarts.init(dom) 并配置了必要的选项,handleWindowResize 则使用 window.dispatchEvent(new Event('resize'))

完整代码

父组件

<template><div><button @click="currentPage = 1">Page One</button><button @click="currentPage = 2">Page Two</button><button @click="currentPage = 3">Page Three</button><!-- 使用 v-show 切换页面 --><PageTwo v-show="currentPage === 2" :is-visible="currentPage === 2" /></div>
</template><script setup>
import { ref } from 'vue';
import PageTwo from './PageTwo.vue'; // 假设 PageTwo.vue 为子组件const currentPage = ref(1);
</script>

PageTwo 组件

<template><div class="page-two"><div class="chart-container" v-for="item in gridItems" :key="item.id" :id="item.id"><!-- 图表容器 --></div></div>
</template><script setup>
import { ref, watch, nextTick } from 'vue';
import { initChart, handleWindowResize } from '@/utils/chartHelper'; // 假设这些方法已定义const props = defineProps({isVisible: {type: Boolean,default: false}
});const gridItems = ref([{ id: 'chart1' },{ id: 'chart2' }
]);// 监听 isVisible,确保在页面显示时重新初始化图表
watch(() => props.isVisible, (isVisible) => {if (isVisible) {nextTick(() => {// 重新初始化每个图表gridItems.value.forEach(item => initChart(item.id));// 触发窗口resize,通知 ECharts 更新尺寸handleWindowResize();});}
}, { immediate: true });
</script><style scoped>
/* 你的样式 */
.chart-container {width: 100%;height: 400px;
}
</style>

总结

  1. 使用 v-show 切换 <PageTwo/> 时,is-visible 属性用于控制页面是否可见。
  2. <PageTwo/> 中监听is-visible,当页面显示时,使用 nextTick 延迟执行,确保 DOM 更新后初始化图表并调整尺寸
  3. 使用 initChart 初始化 ECharts 图表handleWindowResize 用于触发窗口尺寸变化,确保图表正确渲染。

这段代码确保在使用 v-show 显示<PageTwo/> 时,ECharts 图表能够根据正确的尺寸重新初始化,解决因 v-show 隐藏导致的初始化问题。

http://www.lryc.cn/news/598197.html

相关文章:

  • [AI 生成] Flink 面试题
  • 【论文阅读】REVISITING DEEP AUDIO-TEXT RETRIEVAL THROUGH THE LENS OF TRANSPORTATION
  • 基于SpringBoot+Uniapp的健身饮食小程序(协同过滤算法、地图组件)
  • 人形机器人加快先进AI机器人开发
  • 开发避坑短篇(5):vue el-date-picker 设置默认开始结束时间
  • 实时云渲染将UE像素流嵌入业务系统,实现二维管理系统与数字孪生三维可视化程序的无缝交互
  • 小程序生命周期及页面操作执行过程详解
  • 使用phpstudy极简快速安装mysql
  • Java进阶3:Java集合框架、ArrayList、LinkedList、HashSet、HashMap和他们的迭代器
  • Android集成Google Map
  • C++中std::list的使用详解和综合实战代码示例
  • RPG64.制作敌人攻击波数四:优化
  • vue 项目中 components 和 views 包下的组件功能区别对比,示例演示
  • vue递归树形结构删除不符合数据 生成一个新数组
  • 基于深度学习的图像分类:使用MobileNet实现高效分类
  • 【SpringAI实战】提示词工程实现哄哄模拟器
  • MCNN-BiLSTM-Attention分类预测模型等!
  • 模型量化方式及分类
  • OpenAI最新大模型GPT-4o体验之Code Copilot AI编程大模型
  • 边缘智能体:轻量化部署与离线运行
  • 高可用架构模式——如何应对接口级的故障
  • node.js中的fs与path模块
  • Unity 多人游戏框架学习系列十
  • 贪心算法Day6学习心得
  • 苹果带火的3D高斯泼溅产品化玩法:一个成熟产品参考——以DJI Terra为例解析空间智能产品的商业化路径
  • ML3072 MQTT连接阿里云
  • 企业资产管理智能化:IT运维如何借力数字化管理提效避坑?
  • 计算机网络-- TCP 滑动窗口与拥塞控制
  • 亚马逊云科技:引领云计算新时代,开启无限可能
  • JavaSE:学习输入输出编写简单的程序