实现防抖节流的自定义指令

// directives.js
export const debounce = {
  beforeMount(el, binding) {
    const delay = binding.value || 300; // 默认延迟时间为300毫秒
    let timer;
    
    el.__debounceHandler = function () {
      clearTimeout(timer);
      timer = setTimeout(() => {
        binding.value();
      }, delay);
    };

    el.addEventListener('input', el.__debounceHandler);
  },
  beforeUnmount(el) {
    el.removeEventListener('input', el.__debounceHandler);
  }
};

export const throttle = {
  beforeMount(el, binding) {
    const delay = binding.value || 300; // 默认延迟时间为300毫秒
    let timer;
    let last;

    el.__throttleHandler = function () {
      const now = Date.now();
      if (!last || now - last > delay) {
        last = now;
        binding.value();
      }
    };

    el.addEventListener('input', el.__throttleHandler);
  },
  beforeUnmount(el) {
    el.removeEventListener('input', el.__throttleHandler);
  }
};

使用

<template>
  <div>
    <input v-debounce="handleDebounce" placeholder="Debounce Input" />
    <input v-throttle="handleThrottle" placeholder="Throttle Input" />
  </div>
</template>

<script>
import { debounce, throttle } from './directives';

export default {
  directives: {
    debounce,
    throttle,
  },
  methods: {
    handleDebounce() {
      console.log('Debounced input');
    },
    handleThrottle() {
      console.log('Throttled input');
    },
  },
};
</script>

这是钩子函数:

const myDirective = {
  // 在绑定元素的 attribute 前
  // 或事件监听器应用前调用
  created(el, binding, vnode, prevVnode) {
    // 下面会介绍各个参数的细节
  },
  // 在元素被插入到 DOM 前调用
  beforeMount(el, binding, vnode, prevVnode) {},
  // 在绑定元素的父组件
  // 及他自己的所有子节点都挂载完成后调用
  mounted(el, binding, vnode, prevVnode) {},
  // 绑定元素的父组件更新前调用
  beforeUpdate(el, binding, vnode, prevVnode) {},
  // 在绑定元素的父组件
  // 及他自己的所有子节点都更新后调用
  updated(el, binding, vnode, prevVnode) {},
  // 绑定元素的父组件卸载前调用
  beforeUnmount(el, binding, vnode, prevVnode) {},
  // 绑定元素的父组件卸载后调用
  unmounted(el, binding, vnode, prevVnode) {}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue自定义指令中的防抖节流是一种优化技巧,用于处理频繁触发的事件。防抖节流可以减少事件触发的次数,从而提高性能和响应速度。 防抖指的是当事件触发后,等待一段时间后再执行回调函数。如果在等待期间又触发了同样的事件,则会重新计时。这个技巧适用于一些需要等待一段时间后才执行的操作,比如搜索框输入联想功能。通过防抖可以减少不必要的请求次数,提高用户体验。 节流则是指在一定时间间隔内,只执行一次回调函数。如果在间隔时间内有多次事件触发,则只会执行一次。这个技巧适用于一些需要限制频繁触发的操作,比如滚动加载数据。通过节流可以减少不必要的计算和渲染,提高页面性能。 在Vue中,可以通过自定义指令实现防抖节流的功能。可以使用第三方库如Lodash来简化实现过程,也可以根据需求自己编写相关的代码逻辑。通过自定义指令,可以将防抖节流的逻辑封装到指令中,并在需要的地方进行调用。 例如,可以定义一个防抖指令,在指令的inserted钩子函数中使用Lodash的防抖函数来实现防抖功能。在指令的unbind钩子函数中取消防抖。 ```javascript Vue.directive('debounce', { inserted: function(el, binding) { const delay = binding.value || 200; el.addEventListener('input', _.debounce(function() { // 执行相关操作 }, delay)); }, unbind: function(el) { el.removeEventListener('input'); } }); ``` 类似地,可以定义一个节流指令,在指令的inserted钩子函数中使用Lodash的节流函数来实现节流功能。在指令的unbind钩子函数中取消节流。 ```javascript Vue.directive('throttle', { inserted: function(el, binding) { const delay = binding.value || 200; el.addEventListener('scroll', _.throttle(function() { // 执行相关操作 }, delay)); }, unbind: function(el) { el.removeEventListener('scroll'); } }); ``` 通过使用自定义指令实现防抖节流,可以更灵活地控制事件的触发频率,提高页面性能和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值