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

ResizeObserver监听画布尺寸改变动态渲染echarts

前言:

        在日常开发中有时遇到同数据相关的业务可能会用到echarts插件。一般在封装echarts组件的时候大家可能都会通过windows对象监听浏览器窗口大小的改变动态渲染echarts,这样当echarts窗口改变导致echarts画布元素大小改变的同时,就能调用相关api进行重绘。这样统计图就能一直充满canvas画布了,并能适配尺寸的电脑屏幕。

         但是在有些业务场景下,对于同一台电脑而言,窗口大小不会改变,但是会动态修改echarts绑定的dom元素的宽高。这个时候通过Windows对象监听resize事件就不符合当前业务要求了。

此时可以通过ResizeObserve对象监听echarts绑定元素,一旦绑定元素尺寸改变,就可以调用相关api 重新进行绘制了。

一:相关API

ResizeObserver.disconnect()

取消特定观察者目标上所有对 Element 的监听。

ResizeObserver.observe()。

开始对指定 Element 的监听。

ResizeObserver.unobserve().

结束对指定 Element 的监听。

二:局部代码示例

// mychart.vue
<template><divref="container"class="idata-multi-y-axis"></div>
</template>
<script lang="ts" setup>
import {onUnmounted,watch,reactive,ref,toRefs,PropType,shallowRef,defineComponent,nextTick,onMounted,
} from 'vue';
import { PageList } from '@/types/smart/report/idata-table';
import { SheetResource, SheetFilter, SheetOrder, SheetStyle } from '@/types/smart/report/report';
import { debounce, cloneDeep, uniq, merge } from 'lodash';
import * as echarts from 'echarts/core';
import {ToolboxComponent,TooltipComponent,GridComponent,LegendComponent,GraphicComponent,TitleComponent,
} from 'echarts/components';
import { BarChart, PieChart, LineChart } from 'echarts/charts';
import { LabelLayout } from 'echarts/features';
import { CanvasRenderer } from 'echarts/renderers';
import 'echarts/lib/component/dataZoom';echarts.use([ToolboxComponent,TooltipComponent,GridComponent,LegendComponent,LabelLayout,BarChart,PieChart,LineChart,GraphicComponent,CanvasRenderer,TitleComponent,
]);const state = reactive({resizeObserve: null as ResizeObserver|null,
})const container = ref(null);const chart = shallowRef(null);onMounted(() => {nextTick(() => {(chart.value as any) = echarts.init(container.value as any);(chart.value as any).setOption(state.option);// 对container.value dom元素的尺寸进行监听,若其尺寸发生改变,则重新渲染统计图if (!state.resizeObserve) {state.resizeObserve = new ResizeObserver((entires) => {for (const entry of entires) {if (entry.target === container.value) {// 此时监听统计图dom尺寸的改变,重载统计图(chart.value as any).resize();}}});}state.resizeObserve.observe(container.value as any);});});onUnmounted(() => {if (!chart.value) {return;}(chart.value as any).dispose();if (container.value) {state.resizeObserve?.unobserve(container.value as any);}});

        

相关文章:

  • Lua 基础 04 模块
  • Linux 系统安全及应用
  • FFmpeg解复用器(解封装)简单测试【2】
  • 每日一练——分糖果2
  • 【Go语言精进之路】构建高效Go程序:零值可用、使用复合字面值作为初值构造器
  • CAPL如何发送一条UDP报文
  • 独立游戏开发的 6 个步骤
  • 游戏找不到d3dcompiler43.dll怎么办,分享5种有效的解决方法
  • 【全开源】种草分享|动态朋友圈|瀑布流|uniapp
  • MySQL—约束—外键约束(基础)
  • Scala 柯里化、sortBy方法
  • Linux配置java,maven,marshalsec环境
  • 实现Dropdown下拉菜单监听键盘上下键选中功能-React
  • vue3状态管理,pinia的使用
  • JavaScript、Kotlin、Flutter可以开发鸿蒙APP吗?
  • [NodeJS] 关于Buffer
  • [Vue CLI 3] 配置解析之 css.extract
  • Android开源项目规范总结
  • CentOS从零开始部署Nodejs项目
  • Fundebug计费标准解释:事件数是如何定义的?
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • LintCode 31. partitionArray 数组划分
  • Linux后台研发超实用命令总结
  • markdown编辑器简评
  • Mithril.js 入门介绍
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • spring学习第二天
  • uni-app项目数字滚动
  • 安装python包到指定虚拟环境
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 小程序button引导用户授权
  • 一、python与pycharm的安装
  • C# - 为值类型重定义相等性
  • PostgreSQL之连接数修改
  • ​探讨元宇宙和VR虚拟现实之间的区别​
  • # Maven错误Error executing Maven
  • #Z0458. 树的中心2
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • $.ajax中的eval及dataType
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (一)基于IDEA的JAVA基础1
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • *算法训练(leetcode)第四十五天 | 101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104. 建造最大岛屿
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .Net 知识杂记
  • .net6Api后台+uniapp导出Excel
  • .NET值类型变量“活”在哪?
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • /bin/bash^M: bad interpreter: No such file ordirectory