vue3 自定义指令 自动获取节点的width 和 height

news2024/9/22 7:35:45

想写一个依赖库, 但是需要监听组件的width和height这些数据, 就找到了ResizeObserver这个方法,不想每次使用的时候都要创建和销毁 ResizeObserver, 索性就直接封装成为一个指令用来获取想要的信息,
ResizeObserver对象上能够获取的信息还是非常多的, 除了width, height 还有 top, bottom, left, top等, 需要使用到这些可以到MDN去查看他的使用方法

实现效果
当元素大小发生改变时,会自动更新width 和height 的值
在这里插入图片描述

一. 环境

"vue": "^3.4.29"

二. 代码

文件ResizeObserverStore.ts

class ResizeObserverStore {
    // 存储目标元素和对应的ResizeObserver实例
    observer= new Map<HTMLElement, ResizeObserver[]>();
    // 获取目标元素对应的ResizeObserver实例
    get(target: HTMLElement) {
        return this.observer.get(target) || [];
    }
    // 设置目标元素对应的ResizeObserver实例
    set(target: HTMLElement, observer: ResizeObserver) {
        const observers = this.observer.get(target);
        if (observers) {
            observers.push(observer);
        } else {
            this.observer.set(target, [observer]);
        }
    };
    // 销毁目标元素对应的ResizeObserver实例
    remove(target: HTMLElement) {
        const observers = this.observer.get(target);
        // 销毁事件
        if (observers) {
            observers.forEach(observer => {
                observer.disconnect();
            });
            this.observer.delete(target);
        }
    }
}
// 创建一个ResizeObserverStore实例
const resizeObserverStore = new ResizeObserverStore();

//  使用ResizeObserver监听目标元素的变化
export const useResizeObserver = (target: HTMLElement, callback: ResizeObserverCallback) => {
    const observer = new ResizeObserver(callback);
    observer.observe(target);
    resizeObserverStore.set(target, observer);
    return observer;
}

// 移除ResizeObserver监听
export const removeResizeObserver = (target: HTMLElement) => {
    resizeObserverStore.remove(target);
}

文件: directives.ts

import {App, Directive} from "vue";
import {removeResizeObserver, useResizeObserver} from "ResizeObserverStore.ts";


export const  vSize: Directive = {
    mounted: (el, binding) => {
        // 注册并使用resizeObserver
        useResizeObserver(el, (entries) => {
            binding.value.width = entries[0].contentRect.width
            binding.value.height = entries[0].contentRect.height
        })
    },
    beforeUnmount: (el) => {
        // 销毁resizeObserver
        removeResizeObserver(el)
    },
}

export default (app: App)=>{
    app.directive('size', vSize)
}

该指令主要使用ResizeObserver对象,它可以用于监听元素边界尺寸的大小。

三. 使用 (全局 或 局部 使用都可以)

1. 全局注册

文件: main.ts

import {createApp} from "vue";
import App from "./App.vue";
import directives from "../directives";

const app = createApp(App)
// 在这里注册以下就可以使用了
directives(app)
app.mount("#app");

2. 局部使用

<template>
  <div class="layout-box" v-size="size"></div>
</template>

<script setup lang="ts">
  import {reactive, ref, watch, watchEffect} from "vue";
  // 如果全局引入的话就不用在这里引用了
  import {vSize} from "../directives";
  const size = reactive({
    width: 0,
    height: 0
  })
  watchEffect(
      () => {
        console.log(size.width, size.height)
      }
  )
</script>

<style lang="scss" scoped>
.layout-box{
  width: 100px;
  height: 100px;
  background-color: #f5f5f5;
  border: 1px  solid #bd34fe;
  overflow: auto;
  resize: both;
}
</style>

写的比较简陋, 如果在使用过程中发现什么问题, 欢迎评论和私信,
如果发现问题, 欢迎一起解决

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一篇文章讲明白Ldraw(乐高模型)的格式文件说明

最好将文章内容保存下来 https://ldraw.org/article/218.html 乐高模型是非常有意思的模型&#xff0c;弄明白了它的模型构造&#xff0c;也就懂了三维模型的构造&#xff0c;原理都是相通的。

如何在行空板上运行 YOLOv10n?

YOLOv10介绍 YOLO&#xff08;You Only Look Once&#xff09;系列是当前最主流的端侧目标检测算法&#xff0c;由Joseph Redmon等人首次提出&#xff0c;并随着时间发展&#xff0c;已经推出了多个版本&#xff0c;每个版本“似乎”都在性能和速度上有所提升。 本文为大家介绍…

【前端编程小白】的HTML从零入门到实战

之前有高中毕业生读了博客&#xff0c;想让我帮他找一些前端入门的内容&#xff0c;他们报的计算机专业&#xff0c;想利用开学前夕学习一下&#xff0c;我给他推荐了一些菜鸟教程呀什么的。后来想&#xff0c;看来还是很多人需要一些更加入门的可成的&#xff0c;而且很多教程…

24年电赛——自动行驶小车(H题)基于 CCS Theia -陀螺仪 JY60 代码移植到 MSPM0G3507(附代码)

前言 只要搞懂 M0 的代码结构和 CCS 的图形化配置方法&#xff0c;代码移植就会变的很简单。因为本次电赛的需要&#xff0c;正好陀螺仪部分代码的移植是我完成的。&#xff08;末尾附全部代码&#xff09; 一、JY60 陀螺仪 JY60特点 1.模块集成高精度的陀螺仪、加速度计&…

APACHE安装与应用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

24澳中博览会|2025非洲水协年会暨展览|2025山西水展

2024澳中博览会 2025非洲水协年会暨展览 2025年山西国际水展暨水利工程设计与施工、水处理技术设备、泵管阀、智慧水务及环保展 承办单位&#xff1a;山西泽嘉国际展览有限公司 上海泽嘉展览服务有限公司 战略合作伙伴 &#xff1a; 美国迈阿密水展 欧 洲 海 水 脱 盐 淡 化…

SD原班人马发布FLUX.1:打开AI绘画新世界

​ Black Forest Labs 旗下产品 AI 绘画工具如雨后春笋般涌现&#xff0c;让我们对创作的理解不断刷新。就在大家以为已经见识了 AI 绘画的天花板时&#xff0c;FLUX.1 出现了&#xff01;这款由 Black Forest Labs 推出的 AI 绘画工具&#xff0c;不仅在性能上远超竞品&#x…

不好用你打我!2024你必须要会的AI神器

这篇文章&#xff0c;除了干货就是干货~ 今天给大家介绍一款2024年你必须要掌握的AI神器。 我可以肯定的说他是目前市面上第一款在这个领域出现的AI工具。 现在的AI工具&#xff0c;可以用来生成文字、图片、视频甚至音乐&#xff0c; 但是你听说过直接用AI生成APP的吗&…

【Spring】Spring框架的概念,以及Spring框架的简单使用。

目录 1. 概念 2. Spring的体系结构介绍&#xff08;了解&#xff09; 3. Spring框架的使用 3.1 环境准备 3.2 代码编写 1. 概念 总的来说就是一句话&#xff0c;Spring框架是一个轻量级的控制反转&#xff08;IoC&#xff09;和面向切面&#xff08;AOP&#xff09;编程的容…

Spring Boot+MyBatis+MySQL如何实现读写分离

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 背景 读写分离是数据库架构中的一种优化策略&#xff0c;它将读操作&#xff08;查询&#xff09;和写操作&#xff08;更新、插入、删除&#xff09;分开处理&#xff0c;通常通过将读请求和写请求分别发送…

2024年全国青少年信息素养大赛总决赛日赛程表

2024全国青少年信息素养大赛赛程表分赛场&#xff08;浙江传媒学院桐乡校区、桐乡技师学院&#xff09;日期地点时间赛项16日传媒学院8:00-9:00检录 9:00-10:30开赛图形化编程挑战赛&#xff08;小学1-3年级&#xff09;A组12:00-13:00检录 13:00-14:30开赛图形化编程挑战赛&am…

最新版Baby Audio Bundle,win和mac,持续更新,长期有效

一。Baby Audio Bundle.2024.07.WiN&MAC Baby Audio让您的混音听起来比以往任何时候都更大&#xff0c;更好&#xff0c;更有活力。这个捆绑包有七个独特的插件&#xff0c;涵盖了从延迟和混响效果&#xff08;Spaced Out&#xff09;到低保真声音&#xff08;Super VHS&am…

MySQL(8.0)数据库安装和初始化以及管理

1.MySQL下载安装和初始化 1.下载安装包 下载地址&#xff1a;https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar 2.解压…

手把手使用 SVG + CSS 实现渐变进度环效果

效果 轨道 使用 svg 画个轨道 <svg viewBox"0 0 100 100"><circle cx"50" cy"50" r"40" fill"none" stroke-width"10" stroke"#333"></circle></svg>简单的说&#xff0c;就是…

shell脚本(自动化安装各种服务)

1、自动化配置DNS服务 [rootelemestatic ~]# vim dns.sh [rootelemestatic ~]# bash dns.sh 客户端测试&#xff1a; yum -y install bind-utils echo "nameserevr 192.168.8.161" > /etc/resolv.conf nslookup www.a.com 2、自动化配置rsync服务 [rootele…

如何用Python删除电脑中的重复文件?

在生活中&#xff0c;我们经常会遇到电脑中文件重复的情况。 在文件较少的情况下&#xff0c;这类情况还比较容易处理&#xff0c;最不济就是一个个手动对比删除&#xff1b; 而在重复文件很多的时候&#xff0c;我们很难保证把重复文件全部删完。 这里给大家带来了一个便捷…

《计算机组成原理》(第3版)第2章 计算机的发展及应用 复习笔记

第2章 计算机的发展及应用 一、计算机的产生和发展 &#xff08;一&#xff09;第一代电子管计算机 1943年&#xff0c;美国国防部批准了建造一台用电子管组成的电子数字积分机和计算机&#xff08;Electronic Numerica1 Integrator And Computer&#xff0c;ENIAC&#xff…

2024年06月 Scratch 图形化(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch图形化等级考试(1~4级)全部真题・点这里 一、单选题(共10题,共30分) 第1题 运行下列程序,输入单词“PLAY”,最后角色说?( ) A:LY4AP B:AP4LY C:YA4PL D:PL4AY 答案:B 根据程序分析可知,首先获取单词字符数,然后奇数位的字母放在字符数左侧,偶数位…

基于STM32的嵌入式深度学习系统教程

目录 引言环境准备嵌入式深度学习系统基础代码实现&#xff1a;实现嵌入式深度学习系统 数据采集与预处理深度学习模型训练与优化模型部署与推理实时数据处理与反馈应用场景&#xff1a;智能物联网设备常见问题与解决方案收尾与总结 引言 随着深度学习在各种应用中的广泛采用…

HBuilder在uni-admin实现unicloud-map中poi管理

文章目录 新建uni-admin项目下载并导入插件申请地图key并配置&#xff08;本人使用的腾讯地图&#xff09;配置WebServiceAPI配置HBuilder中Web配置 启动项目进行菜单管理 新建uni-admin项目 新建项目时选择uni-admin模板 下载并导入插件 在unicloud介绍页面https://doc.dc…