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

实现echarts全屏的放大/缩小最优解

需求 :

丝滑实现echarts全屏的放大/缩小

最终效果如下 : 


未处理前 : 

放大-->缩小后出现echarts样式

旧方案 : 


监听全屏变化事件,全局触发 window.resize , 会出现顿挫感

最终方案 : 


监听全屏切换事件,并在容器尺寸真正变化后才 resize 图表


步骤一 : 在echarts组件中


每个图表组件暴露 resize() 方法

// 文件位置 @/home/components/pieChart.vue<script setup lang="ts">
import { ref, onMounted, onBeforeUnmount } from 'vue'
import * as echarts from 'echarts'const chartRef = ref<HTMLDivElement | null>(null)
let chartInstance: echarts.ECharts | null = nullconst initChart = () => {...
}const resizeChart = () => {chartInstance?.resize()
}onMounted(initChart)
onBeforeUnmount(() => {chartInstance?.dispose()window.removeEventListener('resize', resizeChart)
})// 为每个组件暴露resize方法
const resize = () => {chartInstance?.resize()
}defineExpose({resize
})
</script>


步骤二 : 在hooks中


使用 ResizeObserver 来感知图表容器尺寸变化 (还可封装为hooks方法)

// 文件位置 @/hooks/useEChartsResizeimport { onMounted, onBeforeUnmount, Ref } from 'vue'export function useChartResize (containerRef: Ref<HTMLElement | null>,chartRefs: Ref[] = []
) {let observer: ResizeObserver | null = nullonMounted(() => {if (containerRef.value) {observer = new ResizeObserver(() => {chartRefs.forEach(chartRef => {chartRef.value?.resize?.()})})observer.observe(containerRef.value)}})onBeforeUnmount(() => {if (observer && containerRef.value) {observer.unobserve(containerRef.value)observer.disconnect()}})
}


步骤三 : 在父组件中


父组件(即index.vue)中引入ResizeObserver方法 , 模板中绑定ref

// 文件位置 @/home/index.vue<template><div class="big-screen" ref="screenRef"><!-- 左侧 --><div class="left"><div class="chart-box"><BarChart ref="barChartRef1" /></div><div class="chart-box"><LineChart ref="lineChartRef1" /></div><div class="chart-box"><PieChart ref="pieChartRef1" /></div></div><!-- 中间 --><div class="center">...</div><!-- 右侧 --><div class="right">...</div><!-- 全屏 --><i:class="['iconfont', isFullscreen ? 'icon-suoxiao' : 'icon-fangda']"class="echarts-icon"@click="toggleFullScreen"></i></div>
</template><script setup lang="ts">import { useChartResize } from '@/hooks/useEChartsResize' // 引入hooksconst screenRef = ref<HTMLElement | null>(null)const barChartRef1 = ref()
const lineChartRef1 = ref()
const pieChartRef1 = ref()
const lineChartRef2 = ref()
const barChartRef3 = ref()
const lineChartRef3 = ref()
const pieChartRef3 = ref()useChartResize(screenRef, [barChartRef1,lineChartRef1,pieChartRef1,lineChartRef2,barChartRef3,lineChartRef3,pieChartRef3
])// 点击全屏切换
const toggleFullScreen = () => {if (screenfull.isEnabled && screenRef.value) {screenfull.toggle(screenRef.value).then(() => {// 等待动画结束,再 resize 所有图表setTimeout(() => {;[barChartRef1,lineChartRef1,pieChartRef1,lineChartRef2,barChartRef3,lineChartRef3,pieChartRef3].forEach(refItem => {refItem.value?.resize?.()})}, 300)})}
}</script>

项目结构如下


http://www.xdnf.cn/news/910261.html

相关文章:

  • Kyosan K5BMC ELECTRONIC INTERLOCKING MANUAL 电子联锁
  • 【PmHub面试篇】性能监控与分布式追踪利器Skywalking面试专题分析
  • pp-ocrv5改进
  • 核弹级漏洞深度解析:Log4j2 JNDI注入攻击原理与防御实战
  • [IMX][UBoot] 01.UBoot 常用命令
  • 【八股消消乐】MySQL参数优化大汇总
  • 使用 Python 和 HuggingFace Transformers 进行对象检测
  • xpath表达式的常用知识点
  • K7 系列各种PCIE IP核的对比
  • 每日算法 -【Swift 算法】电话号码字母组合
  • Keil调试模式下,排查程序崩溃简述
  • 六、【ESP32开发全栈指南:深入解析ESP32 IDF中的WiFi AP模式开发】
  • 读《创新者的窘境》二分 - 破坏性创新与延续性创新
  • 飞牛使用Docker部署Tailscale 内网穿透教程
  • KL散度计算示例:用户画像 vs. 专辑播放分布的性别偏好分析
  • MySQL查询语句
  • 02 nginx 的环境搭建
  • 禅道5月更新速览 | 新增交付物配置功能,支持建立跨执行任务依赖关系,研发效能平台上线
  • 6个可提升社媒投资回报率的Facebook KPI
  • 基于tensorflow实现的猫狗识别
  • 配置git命令缩写
  • 学习记录aigc
  • 智能制造数字孪生全要素交付一张网:智造中枢,孪生领航,共建智造生态共同体
  • Verilog编程技巧01——如何编写三段式状态机
  • 数论——同余问题全家桶3 __int128和同余方程组
  • Linux非管理员用户安装python环境
  • Ubuntu创建修改 Swap 文件分区的步骤——解决嵌入式开发板编译ROS2程序卡死问题
  • 2025.6.5学习日记 Nginx主目录文件 .conf介绍、热部署 定时日志切割
  • Abaqus有限元应力集中
  • Odoo 19 路线图(新功能)