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

【10分钟学习Vue自定义指令开发】元素变化指令

描述

自定义指令 v-resize

  • mounted(el, binding):当元素被挂载到DOM上时,这个钩子会被调用。

    • 如果浏览器支持 ResizeObserver,则创建一个 ResizeObserver 实例来监听元素的大小变化。当变化发生时,它会遍历所有的变化条目,并调用绑定的回调函数 binding.value,将变化的详情作为参数传递。
    • 如果浏览器不支持 ResizeObserver,则使用一个回退方案。创建一个 handleResize 函数,当窗口大小变化时,这个函数会被调用,并使用 getBoundingClientRect 方法获取元素的新大小,然后将这个信息传递给绑定的回调函数。同时,将这个函数绑定到 window 对象的 resize 事件上,并立即执行一次以获取初始大小。
    • 为了能够在元素卸载时取消监听,将 ResizeObserver 实例和 handleResize 函数分别存储在元素的 _resizeObserver 和 _resizeHandler 属性中。
  • unmounted(el):当元素被卸载时,这个钩子会被调用。

    • 如果元素有 _resizeObserver 属性,即浏览器支持 ResizeObserver,则调用 disconnect 方法停止监听。
    • 如果元素有 _resizeHandler 属性,即浏览器不支持 ResizeObserver,则从 window 对象的 resize 事件中移除 handleResize 函数,以防止内存泄漏。

监听窗口变化,元素大小发生变化,则会调用指令绑定的回调方法

此处需要考虑浏览器兼容性,部分老版本浏览器,无法兼容ResizeObserver,会导致报错崩溃

resizeWin是窗口变化的回调方法

使用

    <div v-resize="resizeWin">129391239</div>

代码

app.directive('resize', {
    mounted(el, binding) {
      if (window.ResizeObserver) {
        // Use ResizeObserver if available
        const resizeObserver = new ResizeObserver(entries => {
          for (let entry of entries) {
            binding.value(entry);
          }
        });
        resizeObserver.observe(el);
        el._resizeObserver = resizeObserver;
      } else {
        // Fallback for browsers that do not support ResizeObserver
        const handleResize = () => {
          binding.value({
            contentRect: el.getBoundingClientRect()
          });
        };
        window.addEventListener('resize', handleResize);
        el._resizeHandler = handleResize;
        handleResize();
      }
    },
    unmounted(el) {
      if (el._resizeObserver) {
        el._resizeObserver.disconnect();
      }
      if (el._resizeHandler) {
        window.removeEventListener('resize', el._resizeHandler);
      }
    }
  });

拓展

【10分钟学习Vue自定义指令开发】复制指令v-copy

【10分钟学习Vue自定义指令开发】元素变化指令

【10分钟学习Vue自定义指令开发】鼠标放置提示指令


http://www.kler.cn/a/403953.html

相关文章:

  • 7天掌握SQL - 第一天:数据库基础与SQL入门
  • 排序算法:直接插入排序,希尔排序,选择排序,快速排序,堆排序,归并排序
  • MyBatis的resultType和resultMap区别
  • HarmonyOs DevEco Studio小技巧31--卡片的生命周期与卡片的开发
  • 后仿真中的SDF语法之关键字 IOPATH 用法详解
  • 极客时间《Redis核心技术与实战》开篇词 知识点总结
  • 【PGCCC】Postgresql 缓存替换算法
  • Python Turtle召唤童年:喜羊羊与灰太狼之灰太狼绘画
  • PHPstudy 全局安装composer +topthink5.1
  • 学习GENTOO系统中的emerge -uDNavg @world命令
  • 解析后端框架学习:从单体应用到微服务架构的进阶之路
  • 网络无人值守批量装机-cobbler
  • 我用豆包MarsCode IDE 做了一个 CSS 权重小组件
  • 力扣 LeetCode 654. 最大二叉树(Day9:二叉树)
  • React第六节 组件属性prop的propTypes类型使用介绍
  • 二进制与网络安全的关系
  • 数据集-目标检测系列- 装甲车 检测数据集 armored_vehicles >> DataBall
  • 【数据分析实战】(一)—— JOJO战力图
  • Logrus IT亮相G-STAR 2024
  • 小白系统安装工具,U盘,在线,备份三合一
  • Dockerhub镜像加速
  • python读取Oracle库并生成API返回Json格式
  • 基于SpringBoot+RabbitMQ完成应⽤通信
  • Java小白成长记(创作笔记二)
  • 蓝桥杯c++算法秒杀【6】之动态规划【上】(数字三角形、砝码称重(背包问题)、括号序列、组合数问题:::非常典型的必刷例题!!!)
  • 鸿蒙学习高效开发与测试-应用程序框架(3)