阅读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使用 的相关文章

  • 当条件满足时如何打破CasperJS的重复功能?

    我想知道是否可以打破 casper repeat 循环 我有这个脚本可以做到这一点 在谷歌上搜索特工001 特工002 特工003 特工004 特工005 特工006 直到特工011 我希望它在找到文本 詹姆斯 邦德 后停止循环 现在它找到
  • 如何在 Highcharts / Highstock 上显示 x 轴上的十字线选定值和 y 轴上选定的日期?

    我正在研究这个项目 其中包括在交互式图表上显示历史数据 我得出的结论是 Highcharts Highstock 是最好的选择 因为它提供了最多的定制选项 我想要实现的目标是 当我将鼠标悬停在一个点上时 分别在 x 轴和 y 轴上显示所选值
  • 在淘汰赛应用程序中使用 setInterval 进行轮询实现?

    我正在尝试使用 setInterval 实现简单的轮询机制 我有一个视图模型如下 define knockout jquery function ko function ViewModel var self this setInterval
  • 如何使用 JavaScript 将当前页面设置为 about:blank?

    我遇到的情况是服务器可能在当前地址上不可用 因此我想检测到这一点并将页面重定向到 about blank 页面 我该如何使用 JavaScript 来做到这一点 window location href about blank
  • 匹配数组中的对象并合并

    UPDATE 我有一个名为的对象数组cars包含 li 标签 其中包含有关汽车的属性数据 例如价格 汽车类型等 我的目标是 如果这些汽车符合某些标准 则将它们合并到一个列表中 要求 快速性能 保持相同的汽车数组结构 Main Goal Ma
  • Angular.js:未捕获的错误,没有模块:myapp

    我也在尝试引导 angular js 项目 这是我的index html div p Loading p div
  • React 不响应按键事件

    我正在尝试实现一些非常基本的按键检测 但我根本无法让它工作 我有一个裸露的组件 应该在onKeyDown事件 但控制台中没有任何内容被注销 class App extends React Component constructor prop
  • 在 javascript 中访问 ajax POST 响应

    我正在从 javascript 函数发出 ajax POST 请求 function UpdateMetrics ajax type POST url MyHandler ashx Param1 value1 data contentTyp
  • 根据用户区域设置过滤字符串列表

    当使用 AngularJS 1 6 处理 JavaScript 项目时 我有一个要过滤的字符串列表 例如 假设我的列表包含 rbol cig e a nido and tubo 当过滤西班牙语字符串时 如果我过滤 u 我会期望两者cig e
  • JSON对象的长度[重复]

    这个问题在这里已经有答案了 该函数生成一个包含 json 对象的数组 var estoque function unpack estoque tnm total estoque vl id tid st tnm tnm split tota
  • 覆盖函数(例如“警报”)并调用原始函数?

    我想用调用原始版本的新版本覆盖 Javascript 内置函数 类似于用调用的版本覆盖类上的方法 super有多种语言版本 我怎样才能做到这一点 例如 window alert function str do something addit
  • Vue 监听 Vuex 提交吗?

    有没有一种方法可以监听 Vuex 提交 而不观察任何随提交而更改的属性 只是简单地找出是否发生了提交 我有一个 Filter 组件 想将其放入 NPM 包中 但我已经有一个用例 在该用例中 我希望设置一个 cookie 在选择过滤器时存储过
  • 如何创建自定义元素扩展类的新实例

    我正在尝试以下示例谷歌开发者网站 https developers google com web fundamentals getting started primers customelements extendhtml我收到错误 Typ
  • 如果多个键是相同的 JS,则对对象中的值求和

    例如我有 5 个对象 row aa col 1 value 1 row bb col 2 value 1 row bb col 3 value 1 row aa col 1 value 1 row aa col 2 value 1 我想对值
  • jQuery 在 Chrome 下发现错误元素

    我使用 jQuery 迭代 HTML 表 并动态填充每行的行号 通过在文本框中填充行号 function updateRowNums myTable find tr each function index this find input i
  • 监听浏览器宽度以进行响应式网页设计?

    我正在努力使我的网站适合移动设备 我想知道浏览器窗口的大小 以便当它比 728px 窄时我可以执行某些操作 而当它大于 728px 时我可以执行其他操作 这必须考虑到调整 PC 上的窗口大小以及在手机中从纵向模式更改为横向模式 如何才能做到
  • 为什么从浏览器上传到 S3 时出现 403 错误?

    因此 我尝试查看此处之前的答案 但似乎没有任何效果 我正在使用 Dropzone 它似乎发出 OPTIONS 请求来获取所有允许的 CORS 相关信息 但它似乎没有正确返回 因此 通过查看 Chrome 开发工具 我有以下请求标头 Host
  • 如何按字母顺序排序并先小写排序

    如何获得以下排序的结果Food to Eat然后是 食物123 显然 第二个较低的 o 应该将 要吃的食物 带到排序后的第一个项目中 我很惊讶这个问题不容易通过谷歌找到答案 这个壮举没有包含在 javascript 标准中也让我感到惊讶 F
  • 将 div 文本分配给变量然后显示它

    我有一个简单的任务 我试图完成学习 JavaScript 但一直无法找到明确的答案 这是代码 div Testing div 基本上我希望将方框 div 中的文本存储到变量中 然后 我想在页面的不同部分显示该变量的文本 使用上面的代码我得到
  • 如何使用引用该键的变量来获取对象键中的值?

    我有一个对象 我可以引用密钥a如下 var obj a A b B c C console log obj a return string A 我想通过使用变量引用对象键来获取值 如下所示 var name a console log ob

随机推荐

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

    冒险岛开服服务端教程自己搭建服务器需要那些东西 冒险岛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相比的