前端通过ResizeObserver来监听dom大小动态渲染echarts

export const GlobalResizeObserver = (function () {
  const ATTR_NAME = 'global-resizeobserver-key'
  const attrValueToCallback = {}
  function antiShake(fn, delay, immediate = false) {
    let timer = null
    //不能用箭头函数
    return function () {
      //在时间内重复调用的时候需要清空之前的定时任务
      if (timer) {
        clearTimeout(timer)
      }
      //适用于首次需要立刻执行的
      if (immediate && !timer) {
        fn.apply(this, arguments)
      }
      timer = setTimeout(() => {
        fn.apply(this, arguments)
      }, delay)
    }
  }
  // const fn = antiShake((callback, entry) => {
  //   callback(entry)
  // }, 300)
  const o = new ResizeObserver((entries) => {
    for (const entry of entries) {
      const resizedElement = entry.target
      const attrValue = resizedElement.getAttribute(ATTR_NAME)
      if (attrValue) {
        const callback = attrValueToCallback[attrValue]
        if (typeof callback === 'function') {
          callback()
          // fn(callback, entry)
        }
      }
    }
  })

  return Object.freeze({
    /**
     * @param { Element } element
     * @param { (ResizeObserverEntry) => {} } callback
     */
    observe(chart) {
      if (!(chart._dom instanceof Element)) {
        console.error('GlobalResizeObserver, cannot observe non-Element.')
        return
      }

      let attrValue = chart._dom.getAttribute(ATTR_NAME)
      if (!attrValue) {
        attrValue = String(Math.random())
        chart._dom.setAttribute(ATTR_NAME, attrValue)
      }
      // 为每个元素创建独立的防抖函数
      const debouncedResize = antiShake(() => {
        chart.resize()
      }, 300)

      attrValueToCallback[attrValue] = debouncedResize
      // attrValueToCallback[attrValue] = chart.resize
      o.observe(chart._dom)
    },

    /**
     * @param { Element } element
     */
    unobserve(chart) {
      if (!(chart._dom instanceof Element)) {
        console.error('GlobalResizeObserver cannot unobserve non-Element.')
        return
      }
      const attrValue = chart._dom.getAttribute(ATTR_NAME)
      if (!attrValue) {
        console.error(
          'GlobalResizeObserver cannot unobserve element w/o ATTR_NAME.',
        )
        return
      }
      delete attrValueToCallback[attrValue]
      o.unobserve(chart._dom)
      chart.dispose()
    },
  })
})()

使用方式

先去mainjs去注册

import {GlobalResizeObserver} from '@/utils/echartsResize.js'
Vue.prototype.GlobalResizeObserver = GlobalResizeObserver

 在vue2里面使用

  destroyed() {
    this.GlobalResizeObserver.unobserve(this.radarChart)
    this.GlobalResizeObserver.unobserve(this.lineChart)
  },
  methods: {
    initEcharts() {
      this.radarChart = echarts.init(document.querySelector('#radar'))
      this.lineChart = echarts.init(document.querySelector('#line'))
      this.GlobalResizeObserver.observe(this.radarChart)
      this.GlobalResizeObserver.observe(this.lineChart)
    },
  }

有个小的地方需要注意 像这种布局 

尽量使用width百分比来渲染 尽量不用flex-grow 缩放虽然没问题 但调整浏览器的大小就会有不触发的情况 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/755397.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux Vim最全面的教程

Linux Vim简介 Linux Vim 是一个高度可定制的文本编辑器,广泛用于 Linux 和类 Unix 系统中。它起源于 Vi,一个早期的 Unix 系统中的编辑器,Vim 是 "Vi IMproved"(改进版 Vi)的缩写。Vim 继承了 Vi 的许多特性…

理解论文笔记:基于贝叶斯网络和最大期望算法的可维护性研究

看了与上一篇研究方向一致的文章,上一篇19年的,这一篇22年的更新。若有侵权,请联系删除。 I. INTRODUCTION 介绍 主要介绍了使用贝叶斯网络和历史数据对无线传感器网络可维护性研究的重要性和必要性,并对下面的各章进行了…

为什么有的手机卡没有语音功能呢?

大家好,今天这篇文章为大家介绍一下,无通话功能的手机卡, 在网上申请过手机卡的朋友应该都知道,现在有这么一种手机卡,虽然是运营商推出的正规号卡,但是却屏蔽了通话功能,你知道这是为什么吗&am…

APP项目测试 之 APP功能测试

1. APP测试流程 需求评审——计划编写——用例设计——用例执行——缺陷管理——测试报告 2. APP测试内容 功能测试 专项测试 性能测试 3.注册测试点扩充 4.登录测试点扩充 5.购物车测试点扩充 6.搜索测试点扩充 7.支付测试点扩充 8.评论测试点扩充 未完待续。…

decode()方法——解码字符串

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 解码是将字节流转换成字符串(文本),其他编码格式转成unicode。在Python中提供了decode()方法&#xff0…

layui在表格中嵌入上传按钮,并修改上传进度条

当需要在表格中添加上传文件按钮,并不需要弹出填写表单的框的时候,需要在layui中,用按钮触发文件选择 有一点需要说明的是,layui定义table并不是在定义的标签中渲染,而是在紧接着的标签中渲染,所以要获取实…

小模型家族又新增成员Gemma2

大模型技术论文不断,每个月总会新增上千篇。本专栏精选论文重点解读,主题还是围绕着行业实践和工程量产。若在某个环节出现卡点,可以回到大模型必备腔调重新阅读。而最新科技(Mamba,xLSTM,KAN)则提供了大模…

java大型医院绩效考核系统源码(医院为什么需要绩效机制?)医院绩效考核系统源码 医院管理绩效考核系统源码

java大型医院绩效考核系统源码(医院为什么需要绩效机制?)医院绩效考核系统源码 医院管理绩效考核系统源码 医院作为提供医疗服务的核心机构,其运营和管理效率直接影响到患者的就医体验、治疗效果以及医院的长期发展。因此&#xf…

Java编写学籍信息管理系统,完整代码

🏆本文收录于《CSDN问答解答》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&…

基于香农编码的图像压缩算法实现,聊聊!

🏆本文收录于《CSDN问答解答》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&…

【语言模型】探索AI模型、AI大模型、大模型、大语言模型与大数据模型的关系与协同

一、引言 随着人工智能(AI)技术的飞速发展,各种AI模型如雨后春笋般涌现,其中AI模型、AI大模型、大模型、大语言模型以及大数据模型等概念在学术界和工业界引起了广泛关注。这些模型不仅各自具有独特的特点和应用场景,…

我关于Excel使用点滴的笔记

本篇笔记是我关于Excel使用点滴的学习笔记,摘要和地址链接列表。临时暂挂,后面可能在不需要时删除。 (笔记模板由python脚本于2024年06月28日 12:23:32创建,本篇笔记适合初通Python,熟悉六大基本数据(str字符串、int整型、float浮…

有人问周鸿祎: 学历不重要,为什么360只要985和211?

关注、星标公众号,直达精彩内容 有人问周鸿祎:你说学历不重要,为什么360招聘的人才只要985和211?他说这个事情,我专门问了我们的人力资源,我们的干品分为校园招聘和社会招聘 校园招聘的话会看文凭 社会招聘的话&#x…

es学习初步总结

看api看麻了不知道意义在哪里,所以就简单总结点我觉得有用的东西 基本数据结构解析 分为了文档,索引和映射 索引可以理解为一张表,映射描述了索引的数据结构,而文档就是一个个具体的行 所以一般我们需要在申明索引的时候同时申…

[数据库]事务的隔离级别存储引擎

事务的隔离级别 存储引擎 举例 myisam 进行回滚操作后可以发现有一个警告没有行受到影响 memory 比如用于qq的在线离线状态

EE trade:贵金属投资的优点及缺点

贵金属(如黄金、白银、铂金和钯金)一直以来都是重要的投资和避险工具。它们具有独特的物理和化学特性,广泛应用于各种行业,同时也被视为财富储备。在进行贵金属投资时,了解其优点和缺点对于做出明智的投资决策至关重要。 一、贵金属投资的优…

一个CentOS“倒下去”,更多开源创新服务器操作系统站起来

“一切过往,皆为序章。” ——出自莎士比亚的戏剧《暴风雨》 CentOS 7将在2024年6月30日正式停更,这在某种程度上宣告了国外开源操作系统一个时代的结束。那么,这是不是必然意味着,一个属于我国自主创新的开源操作…

人工智能设备pbootcms网站模板源码

模板介绍 人工智能行业发展趋势不断攀升逐渐成为了新业态,小编精心为大家收集整理了一款HTML5人工智能设备pbootcms网站模板整站源码下载,可帮助您快速建站以展示企业的产品与业务,响应式自适应设计也会适配所有浏览设备。 模板截图 源码下…

社群知识数据管理平台,为VISA合作银行实现私域社群提质降本 | 创新场景

ITValue 痛点 在银行私域社群运营领域,随着社群规模的迅速扩张,管理复杂度和人力成本同步攀升。同时,社群中的数据和知识内容分散,缺乏有效的整合和利用。 解决方案 在提供给VISA合作银行的解决方案中,基于摹小仙AI营销…

Python学习路线图:120天系统学习,你也能成大神!

学Python,切忌今天这学一点,明天那里学一点,零零散散没有系统的学习。这样不仅耽搁大家时间,久而久之也会消磨大家学习的兴致!这里给大家总结了一张系统的Python学习路线图!希望大家共勉! Pyth…