自定义指令实现按钮防抖

这篇具有很好参考价值的文章主要介绍了自定义指令实现按钮防抖。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目中经常会遇到防抖这个场景,比如,页面滚动事件;输入框自动搜索等。为了方便统一管理,提高项目代码的可维护性。我们可以利用Vue的自定义指令完成这个功能。

自定义指令

生命周期/钩子函数

自定义指令拥有自身的生命周期,如下所示:

created(el,binding,vnode,preNode){}   // 在绑定元素的属性之前 
beforeMounted(el,binding,vnode,preNode) {}  //在被插入到Dom前调用
mounted(el,binding,vnode,preNode){}   //在绑定他的父组件和他所有的子组件都挂载完毕后调用
beforeUpdate(el,binding,vnode,preNode) {} //在绑定的父元素更新前调用
updated(el,binding,vnode,preNode) {}  //在绑定元素的父组件及它的所有子组件都更新完成后调用
beforeUnmount(el,binding,vnode,preNode) {}  //绑定元素的父组件卸载前调用
unmounted(el,binding,vnode,preNode) {} //绑定元素的父组件卸载后调用

生命周的参数

  • el:指令绑定到的元素。可以用于直接操作DOM

  • binding:一个对象包含如下属性。
    value:传递给指令的值。例如在 v-my-directive=“1 + 1” 中,值是 2。
    oldValue:之前的值,仅在 beforeUpdate 和 updated 中可用。无论值是否更改,它都可用。
    arg:传递给指令的参数 (如果有的话)。例如在 v-my-directive:foo 中,参数是 “foo”。
    modifiers:一个包含修饰符的对象 (如果有的话)。例如在 v-my-directive.foo.bar 中,修饰符对象是 { foo: true, bar: true }。
    instance:使用该指令的组件实例。
    dir:指令的定义对象。

  • vnode:代表绑定元素的底层 VNode。

  • prevNode:代表之前的渲染中指令所绑定元素的 VNode。仅在 beforeUpdate 和 updated 钩子中可用。

步骤

1. 在项目utils文件夹中新增debounce.js文件

在文件中编写防抖的逻辑代码

export const debounce = {
  //ES6中对象中的方法可以直接写,不用写属性名
  mounted(el, binding) {
    console.log(el, binding)
    const doHandler = () => {
      let timer = null
      return function () {
        if (timer) {
          clearTimeout(timer)
        }
        timer = setTimeout(() => {
          binding.value.handler()
        }, binding.value.delay);
      }
    }
    el.addEventListener('click', doHandler())
  },
}

2.在utils文件夹下新建directives.js文件

在此文件中引入项目中所有自定义指令,并将它们统一注册。文章来源地址https://www.toymoban.com/news/detail-809938.html

import {debounce} from './debounce'

const directivesObj = {
    debounce
}

const directives = {
//使用Vue的install方法统一注册自定义指令。
    install(Vue) {
        Object.keys(directivesObj).forEach(key => {
            Vue.directive(key,directivesObj[key])
        })
    }
}

export default directives

3.在main.js中使用指令

import directives from './util/directives'
const app = createApp(App)
console.log(directives)
//使用install方法注册的对象可以通过app.use()来使用
app.use(directives)

到了这里,关于自定义指令实现按钮防抖的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • h5键盘弹起底部菜单(按钮)被顶起-vue自定义指令解决

            开发H5中测试过程中发现在安卓手机上,input/textarea 获取焦点 软键盘弹出 会让absolute/fixed或者使用flex局部 固定在底部的元素(固定底部栏)顶起来问题;在搜索后发现安卓上在键盘弹起的时候浏览器   body height 100%   其实只有键盘以上范围,这里决解方法有很多可

    2024年02月12日
    浏览(56)
  • vue项目中按钮防抖处理

    1. 概念 连续点击按钮时,按钮的点击事件只会触发触发一次,结束连续点击后,再次点击按钮时才会触发按钮的点击事件 2. 意义 按钮防抖是针对按钮操作时,用户连续点击按钮时也会每次触发按钮的绑定的点击事件,这会造成多次无效的触发 1. 通过定义指令方式 通过定义

    2024年02月13日
    浏览(47)
  • Vue.js 2.0 自定义指令

    除了默认设置的核心指令( v-model 和 v-show ),Vue 也允许注册自定义指令。注意,在 Vue2.0 里面,代码复用的主要形式和抽象是组件——然而,有的情况下,你仍然需要对纯 DOM 元素进行底层操作,这时候就会用到自定义指令。下面这个例子将聚焦一个 input 元素,像这样: 当页面

    2023年04月19日
    浏览(53)
  • vue2.x通过指令实现v-debounce和v-throttle防抖节流的实现,亲测可用。

    在vue2.x中,防抖和节流一般是通过引入防抖函数 debounce 和节流函数 throtte ,对事件回调进行一层包裹,然后在模板中绑定包裹后的事件回调,这样每个需要用的地方都需要进行防抖,节流函数的导入,事件回调的包裹,比较麻烦。通过摸索,有以下两种方法。 通过重写Vue.

    2024年02月14日
    浏览(38)
  • vue uniapp 防止按钮多次点击(类似于防抖节流)

    common文件并创建anti-shake.js文件 man.js文件中引入 页面里使用即可 不传参,直接传一个方法就行 带参数,传一个方法和一个参数就行 

    2024年02月11日
    浏览(38)
  • vue防抖 指令 v-debounce

    2024年02月16日
    浏览(38)
  • vue3自定义按钮点击变颜色实现(多选功能)

    实现效果图: 默认选中第一个按钮,未选中按钮为粉色,点击时颜色变为红色 利用动态类名,当定义isChange数值和下标index相同时,赋予act类名,实现变色效果

    2024年01月19日
    浏览(42)
  • vue3项目引入本地js文件,实现一个音频播放按钮

    目前有一个需求就是在网页上放置一个音乐控制按钮,并且是在vue3项目里面。于是小白的我遇到了2个问题,第一个问题是如何实现没有进度条的播放按钮,这个网上有现成的代码,可以通过js代码切换不同的图片或者是别的样式,并不算难;第二个问题是如何在vue3项目中引

    2024年02月19日
    浏览(57)
  • vue前端实现图片下载,实现点击按钮弹出本地窗口,选择自定义保存路径

    直接上代码,废话不多说,点关注,不迷路 一、下载代码 二、别找代码了,不用代码就可以实现 以下按照步骤一步一步来 按照红色箭头所指,用鼠标戳它 恭喜你,功能完成了

    2024年02月13日
    浏览(59)
  • VUE3实现拖拽功能自定义指令

    1.首先创建一个js文件,命名为drag.js    注意看注释部分,对操作DOM块进行了不同需求的支持     可以只在移动头部时操作整个DOM,或者是否允许DOM元素移出屏幕都能实现 2.在main.js中引入drag.js 3.在你想使用的标签中添加 v-drag 即可实现拖动了  

    2024年02月14日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包