vue3自定義指令自動獲取節(jié)點的width和height代碼示例
前言
想寫一個依賴庫, 但是需要監(jiān)聽組件的width和height這些數(shù)據(jù), 就找到了ResizeObserver這個方法,不想每次使用的時候都要創(chuàng)建和銷毀 ResizeObserver, 索性就直接封裝成為一個指令用來獲取想要的信息,
ResizeObserver對象上能夠獲取的信息還是非常多的, 除了width, height 還有 top, bottom, left, top等, 需要使用到這些可以到MDN去查看他的使用方法
實現(xiàn)效果當(dāng)元素大小發(fā)生改變時,會自動更新width 和height 的值

一. 環(huán)境
"vue": "^3.4.29"
二. 代碼
文件ResizeObserverStore.ts
class ResizeObserverStore {
// 存儲目標(biāo)元素和對應(yīng)的ResizeObserver實例
observer= new Map<HTMLElement, ResizeObserver[]>();
// 獲取目標(biāo)元素對應(yīng)的ResizeObserver實例
get(target: HTMLElement) {
return this.observer.get(target) || [];
}
// 設(shè)置目標(biāo)元素對應(yīng)的ResizeObserver實例
set(target: HTMLElement, observer: ResizeObserver) {
const observers = this.observer.get(target);
if (observers) {
observers.push(observer);
} else {
this.observer.set(target, [observer]);
}
};
// 銷毀目標(biāo)元素對應(yīng)的ResizeObserver實例
remove(target: HTMLElement) {
const observers = this.observer.get(target);
// 銷毀事件
if (observers) {
observers.forEach(observer => {
observer.disconnect();
});
this.observer.delete(target);
}
}
}
// 創(chuàng)建一個ResizeObserverStore實例
const resizeObserverStore = new ResizeObserverStore();
// 使用ResizeObserver監(jiān)聽目標(biāo)元素的變化
export const useResizeObserver = (target: HTMLElement, callback: ResizeObserverCallback) => {
const observer = new ResizeObserver(callback);
observer.observe(target);
resizeObserverStore.set(target, observer);
return observer;
}
// 移除ResizeObserver監(jiān)聽
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對象,它可以用于監(jiān)聽元素邊界尺寸的大小。
三. 使用 (全局 或 局部 使用都可以)
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>總結(jié)
到此這篇關(guān)于vue3自定義指令自動獲取節(jié)點的width和height的文章就介紹到這了,更多相關(guān)vue3自動獲取節(jié)點的width和height內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue3 + Element Plus Transfer 穿梭框自定義
本文介紹Vue3結(jié)合ElementPlus實現(xiàn)Transfer穿梭框自定義分組的四種方法,每種方法結(jié)合實例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-07-07
vue實現(xiàn)登錄頁面的驗證碼以及驗證過程解析(面向新手)
這篇文章主要介紹了vue實現(xiàn)登錄頁面的驗證碼以及驗證過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-08-08
vue使用exif獲取圖片旋轉(zhuǎn),壓縮的示例代碼
這篇文章主要介紹了vue使用exif獲取圖片旋轉(zhuǎn),壓縮的示例代碼,幫助大家更好的利用python處理圖片,感興趣的朋友可以了解下2020-12-12
一篇文章教你實現(xiàn)VUE多個DIV,button綁定回車事件
這篇文章主要介紹了VUE多個DIV綁定回車事件,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-10-10
對Vue- 動態(tài)元素屬性及v-bind和v-model的區(qū)別詳解
今天小編就為大家分享一篇對Vue- 動態(tài)元素屬性及v-bind和v-model的區(qū)別詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08

