vue3 封装自定义指令,监听元素宽高的变化

最近做一个项目,涉及到echart图,要去根据父元素去自适应宽高,所以需要监听到元素的宽高变化、

因为是监听某一元素的宽高变化 ,所以这里用的是ResizeObserver.

ResizeObserver是可以监听到DOM元素,宽高的变化,需要注意的一点就是监听出变化结果是contentBox的宽度和高度。

以下为浏览器兼容性

第一步:封装自定义指令

在directive文件夹下创建一个resizeObserver.js文件

内容如下

javascript 复制代码
// 监听元素大小变化的指令
const map = new WeakMap()
const ob = new ResizeObserver((entries) => {
    for (const entry of entries) {
        // 获取dom元素的回调
        const handler = map.get(entry.target)
        //存在回调函数
        if (handler) {
            // 将监听的值给回调函数
            handler({
                width: entry.borderBoxSize[0].inlineSize,
                height: entry.borderBoxSize[0].blockSize
            })
        }
    }
})


export const Resize = {

    mounted(el, binding) {
        //将dom与回调的关系塞入map
        map.set(el, binding.value)
        //监听el元素的变化
        ob.observe(el)
    },
    unmounted(el) {
        //取消监听
        ob.unobserve(el)
    }
}

export default Resize

第二步:在directive文件夹再创建一个index.js文件,目的是为了集中注册自定义指令

javascript 复制代码
import { Resize } from "./resizeObserver"


// 自定义指令集合
const directives = {
    Resize,
}

export default {
    install(app) {
        Object.keys(directives).forEach((key) => {
            app.directive(key, directives[key])
        })
    }
}

第三步:在main.js文件进行全局注册

javascript 复制代码
import directives from "@/util/directive/index"
app.use(directives)

第四步:使用方法

复制代码
<template>
<div style="height: 100%; width: 100%" v-resize="onResize"></div>
</template>
<script setup>
// 当元素宽高发生变化时,触发下面的方法
const onResize = (dom) => {
    console.log(dom) // dom为元素变化后的宽高
}
</script>

以上,希望大家一键三连哇~~ 感谢

相关推荐
青云计划2 分钟前
SSE流式响应:从Reactor Flux到生产级AI聊天的工程实践——5分钟超时、线程隔离、背压处理全解析
前端·人工智能·firefox
A南方故人8 分钟前
将容器内的元素变为可拖拽
开发语言·javascript·ecmascript
身如柳絮随风扬15 分钟前
Docker 化部署 Spring Boot + Vue 全栈应用:从打包到容器化上线
vue.js·spring boot·docker
codefan※18 分钟前
7 个Prompt 框架汇总:从 Chain of Thought 到 ReAct + PoT
前端·react.js·ai·llm·prompt·prompt工程·思维链
迁旭20 分钟前
Claude Code /status 功能技术文档
前端·javascript·人工智能·react.js·机器学习·gpt-3·文心一言
星星~笑笑24 分钟前
react Next.js oss上传 上传阿里云
javascript·react.js·阿里云·js
GISer_Jing25 分钟前
前端全流程求职Skill 攻略
前端·学习·前端框架
Bigger35 分钟前
架构解密:mini-cc 的核心设计思路
前端·agent·ai编程
极客密码9 小时前
感谢雷总!Mimo大模型价值¥659/月的 MAX 套餐,让我免费领到了!
前端·ai编程·claude
深念Y10 小时前
我明白为什么B站没法在浏览器开直播了——Windows Chrome推流踩坑全记录
前端·chrome·webrtc·浏览器·srs·直播·flv