vue 封装监听dom尺寸的自定义指令

该博客介绍了如何在Vue中创建一个自定义指令`v-resize`,用于监听元素的尺寸变化,并在尺寸变化时调用传入的方法。通过设置定时器检查元素的宽高,当尺寸改变时,更新绑定的值。在组件模板中,该指令被用来触发`onResize`方法,从而实现对元素尺寸变化的响应式处理。
摘要由CSDN通过智能技术生成

指令源码


function addEventListner(el, binding) {
  // el为绑定的元素,binding为绑定给指令的对象
  let width = '';
  let height = '';

  function isReize() {
    const rect = el.getBoundingClientRect();

    if (width !== rect.width || height !== rect.height) {
      // 关键(这传入的是函数,所以执行此函数)
      binding.value(rect);
    }
    width = rect.width;
    height = rect.height;
  }
  // eslint-disable-next-line no-underscore-dangle
  el.__vueSetInterval__ = setInterval(isReize, 300);
}
export default {
  install(Vue) {
    Vue.directive('resize', {
      bind(el, binding, a) {
        if (!el) return;
        console.log('注册 resize 事件', el, binding, a);
        addEventListner(el, binding);
      },
      unbind(el) {
        if (!el) return;
        console.log(el, '解绑 resize 事件');
        // eslint-disable-next-line no-underscore-dangle
        clearInterval(el.__vueSetInterval__);
      }
    });
  }
};

注册自定义指令

import resize from '@/directives/resize';

Vue.use(resize);

使用自定义指令

<template>
  <div
    class="game-tools"
    v-resize="onResize"
  ></div>
 </template>
<script>
...,
	methods: {
		onResize({height, width}) {
			console.log('尺寸发生变化')
		}
	}
</script>

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值