vue自定义指令 v-debounce 防抖

vue自定义指令-防抖

使用场景:点击查询按钮 或者 点击提交保存按钮 的时候点击次数过多,会多次提交,为了避免这种情况发生,我们可以做个防抖,点击一次后 第二次需要间隔一定的时间才能再次点击。
这时候我们能想到可以用vue 的自定义指令directive来完成这个功能。
新建一个vue2项目 (cv即可使用)

src/components/HelloWorld.vue

<template>
  <div>
      <!-- v-debounce:xx ,xx可以是对象可以是字符串可以是数字   -->
      <button v-debounce:3000="debounceClick">防抖</button>
  </div>
</template>

<script>
export default {
  name: "HelloWorld",
  props: {},
  data() {},
  methods: {
    debounceClick(v) {
      console.log("触发一下,间隔多少毫秒:", v);
    },  
  },
};
</script>

新建 debounce.js文件 src/directive/modules/debounce.js

const debounce = {
  inserted: function (el, binding) {
   	// binding.arg 传进来的参数 可以
    let s = (binding.arg * 1) || 1000
    let timer
    el.addEventListener('click', () => {
      if (timer) {
        clearTimeout(timer)
      }
      timer = setTimeout(() => {
        binding.value(s)
      }, s)
    })
  },
}
export default debounce

src/directive/index.js里面引入 把 debounce.js 引入

import Vue from 'vue'
import debounce from './modules/debounce.js'
// 方式1
const files = require.context('./modules', false, /.+\.js$/)
// 按模块引入
// files.keys(): 打印出来为['./focus.js','/loadmore.js']
files.keys().forEach(fileName => {
  const directiveConfig = files(fileName) // 获取指令函数
  const directiveName = fileName // 获取指令名
    .replace(/^\.\//, '') // 去除开头的'./'
    .replace(/\.\w+$/, '') // 去除文件扩展名
  Vue.directive(directiveName, directiveConfig.default || directiveConfig)
})


// 方式2
// Vue.directive('debounce', debounce)

main.js 里面引入 import '@/directive/index.js'

import '@/directive/index.js'
import App from './App.vue'
import Vue from 'vue'
import router from './router'
import store from './store'

Vue.config.productionTip = false
new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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
发出的红包

打赏作者

前端酱紫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值