vue全局注冊自定義指令防抖解析
更新時間:2022年05月30日 15:16:19 作者:老電影故事
這篇文章主要介紹了vue全局注冊自定義指令防抖解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
全局注冊自定義指令防抖
1、先建一個js文件
建一個debounce.js文件,放在src/directives文件夾里面
export default (vue) => { ? /** ? ?* 綁定方法 ? ?* @param {Object} el - The element the directive is bound to. ? ?* @param {Object} binding - An vue directive object ? ?*/ ? ?vue.directive('debounce', { //防抖函數(shù)指令 ? ? ? inserted: function(el, binding) { ? ? ? ? let timer; ? ? ? ? el.addEventListener("click", () => { ? ? ? ? ? if (timer) { ? ? ? ? ? ? clearTimeout(timer); ? ? ? ? ? } ? ? ? ? ? timer = setTimeout(() => { ? ? ? ? ? //關(guān)鍵點:vue 的自定義指令傳遞的參數(shù)binding 如果是一個函數(shù),則通過 ? ? ?binding.value()來執(zhí)行,通過上述示例,還可以傳遞比如事件, 綁定對象之類的 ? ? ? ? ? ? binding.value(); ? ? ? ? ? }, 1000); ? ? ? ? }); ? ? ? } ? ?}) }
2、在mian.js里面注冊
import Debounce from './directives/debounce.js' //防抖自定義指令 Debounce(Vue)
3、使用
在組件中button按鈕添加該指令即可實現(xiàn)防抖
v-debounce="getTableData"
vue防抖的使用
防抖函數(shù)
function debounce(fn, immediate = true) { ? let timer; ? return function () { ? ? if (timer) clearTimeout(timer); ? ? if (immediate) { ? ? ? let bool = !timer; ? ? ? timer = setTimeout(() => (timer = 0), 300); ? ? ? return bool && fn.apply(this, [...arguments]); ? ? } ? ? timer = setTimeout(() => fn.apply(this, [...arguments]), 300); ? }; } export default { ? debounce, };
在vue中直接使用
import utils from "./utils/index"; methods:{ ?? ?// 手動添加debounce ? ? btnHandler1: utils["debounce"](function (...rest) { ? ? ? console.log("2222 ", this, rest); ? ? }), }
vue中使用高階組件
使用抽象組件對于傳入按鈕進行改造,對于按鈕進行事件的重寫,加入防抖功能;
import Vue from 'vue' // ctx 【context 上下文 綁定this指向】 const debounce = (func, time, ctx, immediate = true) => { ? let timeout ? return function (...params) { ? ? if (timeout) clearTimeout(timeout) ? ? if (immediate) { ? ? ? var callNow = !timeout ? ? ? timeout = setTimeout(() => { ? ? ? ? timeout = null ? ? ? }, time) ? ? ? if (callNow) func.apply(ctx, params) ? ? } else { ? ? ? timeout = setTimeout(function () { ? ? ? ? func.apply(ctx, params) ? ? ? }, time) ? ? } ? } } // 只能綁定一個組件,多個組件無法綁定 Vue.component('Debounce', { ? abstract: true,//抽象組件,無狀態(tài), ? props: ['time', 'events', 'immediate'], ? created () { ? ? this.eventKeys = this.events && this.events.split(',') ? ? this.originMap = {} ? ? this.debouncedMap = {} ? }, ? render () { ? ? // 組件使用proxy對象包裝,可以了解 【this】; ? ? // 取出虛擬節(jié)點,默認第一個,也就是高階組件中若傳遞了多個子組件,只展示第一個 ? ? const vnode = this.$slots.default[0] ? ? // 如果默認沒有傳 events,則對所有綁定事件加上防抖 ? ? if (!this.eventKeys) { ? ? ? this.eventKeys = Object.keys(vnode.data.on) ? ? } ? ? this.eventKeys.forEach((key) => { ? ? ? const target = vnode.data.on[key] ? ? ? if (target === this.originMap[key] && this.debouncedMap[key]) { ? ? ? ? vnode.data.on[key] = this.debouncedMap[key] ? ? ? } else if (target) { ? ? ? ? this.originMap[key] = target ? ? ? ? this.debouncedMap[key] = debounce(target, this.time, vnode, this.immediate) ? ? ? ? vnode.data.on[key] = this.debouncedMap[key] ? ? ? } ? ? }) ? ? return vnode ? } })
?? ?<Debounce events="click" time="300"> ? ? ? <button @click="clickHandler(1,2,3)" :btnval="'val'">click1</button> ? ? </Debounce>
vue中自定義指令使用
// 指令【防抖】 Vue.directive("debounce", { ? // 只調(diào)用一次,第一次綁定元素時調(diào)用 ? // el【綁定的元素】,binding【一個相關(guān)對象】,vnode【vue編譯生成的虛擬節(jié)點】 ? // beforemount之后,mounted之前; ? // init events&lifecycle 【初始化事件和生命周期】 ? bind(el, binding, vnode, oldVnode) { ? ? console.log(el, binding, vnode, oldVnode); ? ? let { value } = binding; ? ? let [target, time] = value; ? ? const debounced = debounce(target, time, vnode); ? ? el.addEventListener("click", debounced); ? }, ? // 被綁定元素插入父節(jié)點時調(diào)用(僅保證父節(jié)點存在,但是不一定插入文檔) ? inserted() {}, ? // 所在組件的vnode更新時調(diào)用 ? update() {}, ? componentUpdated() {}, ? unbind(el) { ? ? console.log(el, "el"); ? ? el.removeEventListener("click", el._debounced); ? }, });
使用 <button v-debounce="[ () => { btnHandler(); }, 300, ]" > 點擊 </button> <button v-if="testcom" v-debounce="[btnHandler, 300]">點擊</button>
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
您可能感興趣的文章:
- Vue3實現(xiàn)全局loading指令的示例詳解
- vue全局自定義指令和局部自定義指令的使用
- Vue全局自定義指令Modal拖拽的實踐
- vue全局自定義指令-元素拖拽的實現(xiàn)代碼
- vue directive定義全局和局部指令及指令簡寫
- 對Vue2 自定義全局指令Vue.directive和指令的生命周期介紹
- vue3的自定義指令directives實現(xiàn)
- vue 自定義指令directives及其常用鉤子函數(shù)說明
- vue?filters和directives訪問this的問題詳解
- vue通過指令(directives)實現(xiàn)點擊空白處收起下拉框
- 詳解vue + vuex + directives實現(xiàn)權(quán)限按鈕的思路
- vue全局指令文件 directives詳解
相關(guān)文章
VUE如何利用vue-print-nb實現(xiàn)打印功能詳解
這篇文章主要給大家介紹了關(guān)于VUE如何利用vue-print-nb實現(xiàn)打印功能的相關(guān)資料,文中還給大家介紹了vue-print-nb使用中的常見問題,如空白頁,需要的朋友可以參考下2022-04-04vue-cli3使用mock數(shù)據(jù)的方法分析
這篇文章主要介紹了vue-cli3使用mock數(shù)據(jù)的方法,結(jié)合實例形式分析了vue-cli3使用mock數(shù)據(jù)的相關(guān)實現(xiàn)方法與操作注意事項,需要的朋友可以參考下2020-03-03vue3項目+element-plus:時間選擇器格式化方式
這篇文章主要介紹了vue3項目+element-plus:時間選擇器格式化方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03