阅读element-ui源码之ResizeObserver使用

2023-11-08

1.ResizeObserver

阅读tabs标签页源码时,发现了这个api。于是,我查了下MDN。

  • 可以监听任意DOM元素内容区域的变化。这里的变化包括但不限于:
    (1)某个节点的出现和隐藏。(2)某个节点的大小变化。
  • 和resize api相比的优点:
    众所周知window.resize事件能帮我们监听窗口大小的变化。但是reize事件会在一秒内触发将近60次,所以很容易在改变窗口大小时导致性能问题。换句话说,window.resize事件通常是浪费的,因为它会监听每个元素的大小变化(只有window对象才有resize事件)。ResizeObserver的优点就不言而喻了。
  • 具体的用法就不说了。可以去MDN上查找。下面重点说下,element-ui是如何使用的?

2.element-ui中的使用

  • 首先,ResizeObserver这个api是有兼容性问题的。element-ui引入了第三方库:
import ResizeObserver from 'resize-observer-polyfill';
  • 接着,它采用了观察者模式,来处理元素尺寸变化逻辑。
// 判断是否在浏览器环境中,还是在node中
const isServer = typeof window === 'undefined';

/* istanbul ignore next */
const resizeHandler = function(entries) {
  for (let entry of entries) {
    // entry.target通过这个访问监听的DOM对象,然后,这个对象上有__resizeListeners__属性。遍历存储的监听回调
    const listeners = entry.target.__resizeListeners__ || [];
    if (listeners.length) {
      listeners.forEach(fn => {
        fn();
      });
    }
  }
};

/* istanbul ignore next */
// 接受DOM元素和方法
export const addResizeListener = function(element, fn) {
  if (isServer) return;
  if (!element.__resizeListeners__) {
    // 在DOM元素对象上,设置__resizeListeners__属性,存储监听器(回调函数)。
    element.__resizeListeners__ = [];
    // ResizeObserver:MDN上解释可以监听DOM元素的变化(什么变化呢?位置变化和大小变化)
    element.__ro__ = new ResizeObserver(resizeHandler);
    element.__ro__.observe(element);// 这里观察主体是DOM对象。(本质就是观察一个对象)
  }
  element.__resizeListeners__.push(fn);
};

/* istanbul ignore next */
export const removeResizeListener = function(element, fn) {
  if (!element || !element.__resizeListeners__) return; // 先判断下
  element.__resizeListeners__.splice(element.__resizeListeners__.indexOf(fn), 1);
  if (!element.__resizeListeners__.length) {
    // 取消element.__ro__观察者身上所有的元素的观察
    element.__ro__.disconnect();
  }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

阅读element-ui源码之ResizeObserver使用 的相关文章

随机推荐

  • 冒险岛开服服务端教程自己搭建服务器需要那些东西

    冒险岛开服服务端教程自己搭建服务器需要那些东西 冒险岛Online 是由韩国WIZET和NEXON制作开发的一款2D横版卷轴网络游戏 故事以被 黑暗力量 不断入侵 因而进入了 浑沌期 的世界为背景 勇士们组成了联盟 再次与 黑暗力量 展开激
  • 数字化转型中的大数据治理架构

    转载本文需注明出处 EAII企业架构创新研究院 微信号 eaworld 违者必究 如需加入微信群参与微课堂 架构设计与讨论直播请直接回复此公众号 加群 姓名 公司 职位 微信号 发送关键字 BDTC 至此公众号 获取完整PPT下载 大家好
  • setHeader的用法大全

    1 一秒刷新页面一次 response setHeader refresh 1 2 二秒跳到其他页面 response setHeader refresh 2 URL otherPagename 3 没有缓存 response setHea
  • React-Native 获取屏幕尺寸

    XCODE补充 启动项目 react native init 项目名称 修改Xcode中plist文件
  • 将普通项目转换成Maven项目

    第一种方式 新建pom xml文件 gt 选中右键点击Add as Maven Project 第二种方式 项目上直接点击Add Framework Support 选择Maven
  • Mutex的使用

    什么是Mutex mutex 是术语 互相排斥 mutually exclusive 的简写形式 也就是互斥量 互斥量跟临界区中提到的Monitor很相似 只有拥有互斥对象的线程才具有访问资源的权限 由于互斥对象只有一个 因此就决定了任何情
  • Android基础教程(非常详细)从零基础入门到精通,看完这一篇就够了

    文章目录 一 开发环境搭建 二 简单控件 1 文本显示 2 按钮 3 常用布局 1 线性布局LinearLayout 3 相对布局RelativeLayout 3 网格布局GridLayout 4 图像显示 1 图像的缩放问题 2 图像按钮
  • Ubuntu 18.04下使用Apache搭建一个web服务器

    Ubuntu 18 04下使用Apache搭建一个web服务器 几个必要的概念 web服务器 以我之见 web服务器就是运行在计算机上的一个向整个网络或者是web客户端 浏览器提供文档的一个程序 我们通过http请求便可以获取到存储到web
  • 阿里巴巴管理三板斧 - 阿里巴巴专栏

    阿里巴巴管理三板斧 阿里巴巴专栏 阿里巴巴管理三板斧 阿里巴巴专栏 posted on 2016 07 16 00 44 lexus 阅读 评论 编辑 收藏 转载于 https www cnblogs com lexus p 5675125
  • 基于51单片机的智能大棚浇花系统设计 花盆浇水灌溉补光散热方案原理图程序

    硬件电路的设计 附文件 3 1系统的功能分析及体系结构设计 3 1 1系统功能分析 本设计由STC89C52单片机电路 LCD1602液晶显示电路 光照检测电路 土壤湿度传感器电路 A D采样PCF8591电路 风扇控制电路 继电器控制电路
  • windows7最简单最快速解决“此windows副本不是正版”(“This copy of Windows is not genuine”)方法

    如果出现这个问题的话 windows的桌面就会变成全黑 并且右下角出现 其实解决这个问题的方法有很多种 有很多工具都可以解决这个问题 下面介绍下最简单快速的解决方法 步骤1 在开始的输入框中输入cmd 步骤2 右击出现的cmd 以管理员ad
  • ubuntu2.0安装postgresql

    1 更新系统软件包 首先 通过在终端中运行以下以下apt命令 确保所有系统软件包都是最新的 sudo apt update sudo apt upgrade 2 安装 使用以下apt命令软件包 apt get install postgre
  • 智能算法和人工智能算法,人工智能算法概念股票

    人工智能股票有哪些 1 苏州科达 苏州科达科技股份有限公司是领先的视讯与安防产品及解决方案提供商 致力于以视频会议 视频监控以及丰富的视频应用解决方案帮助各类政府及企业客户解决可视化沟通与管理难题 2012年 公司整体改制为股份有限公司 2
  • python之数据驱动DDT安装

    黑窗口一行指令即可 pip install ddt
  • Mybatis与Spring的集成

    目录 一 Mybatis与spring的集成 Mybatis与spring集成的步骤 1 导入pom依赖 2 利用mybatis逆向工程生成模型底层代码 3 编写appolication mybatis xml 4 Spring Test
  • 让GPT成为您的科研加速器丨GPT引领前沿与应用突破之GPT4科研实践技术与AI绘图

    GPT对于每个科研人员已经成为不可或缺的辅助工具 不同的研究领域和项目具有不同的需求 如在科研编程 绘图领域 1 编程建议和示例代码 无论你使用的编程语言是Python R MATLAB还是其他语言 都可以为你提供相关的代码示例 2 数据可
  • 5-软件实现

    程序设计语言 数据成分 运算成分 控制成分 传输成分 结构化程序设计编码 结构化程序设计的特点 自顶向下 逐步求情 单入口和单出口的控制结构 结构化程序设计步骤 提出和分析问题 确定数学模型 设计算法 模块化编程 编译 运行程序 模块设计和
  • DID基础介绍

    1 介绍 DID Decentralized Identity 去中心化身份标识 它的本质是基于去中心化体系下的中心化信任模型 2 相关名词解释 DID标识符 did example 1232423143215jlgaglgak 前缀必然是
  • fastDFS文件服务器的java客户端初始化方法ClientGlobal.init(fdfs_client.properties) 找不到配置文件路径异常的解决

    最近在使用fastDFS文件服务器的java客户端上传文件时 它的初始化方法ClientGlobal init String 出现找不到配置文件的异常 无论是写死fdfs client properties文件位置还是怎样 都找不到配置文件
  • 阅读element-ui源码之ResizeObserver使用

    1 ResizeObserver 阅读tabs标签页源码时 发现了这个api 于是 我查了下MDN 可以监听任意DOM元素内容区域的变化 这里的变化包括但不限于 1 某个节点的出现和隐藏 2 某个节点的大小变化 和resize api相比的