欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • VUE如何利用vue-print-nb實現(xiàn)打印功能詳解

    VUE如何利用vue-print-nb實現(xiàn)打印功能詳解

    這篇文章主要給大家介紹了關(guān)于VUE如何利用vue-print-nb實現(xiàn)打印功能的相關(guān)資料,文中還給大家介紹了vue-print-nb使用中的常見問題,如空白頁,需要的朋友可以參考下
    2022-04-04
  • vue點擊當(dāng)前路由高亮小案例

    vue點擊當(dāng)前路由高亮小案例

    這篇文章主要為大家詳細介紹了vue點擊當(dāng)前路由高亮小案例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • Vue.js路由實現(xiàn)選項卡簡單實例

    Vue.js路由實現(xiàn)選項卡簡單實例

    這篇文章主要為大家詳細介紹了Vue.js路由實現(xiàn)選項卡簡單實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • vue項目首屏打開速度慢的解決方法

    vue項目首屏打開速度慢的解決方法

    這篇文章主要介紹了vue項目首屏打開速度慢的解決方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • Vue 修改網(wǎng)站圖標的方法

    Vue 修改網(wǎng)站圖標的方法

    這篇文章主要介紹了Vue 修改網(wǎng)站圖標的方法,幫助大家更好的理解和使用vue框架,感興趣的朋友可以了解下
    2020-12-12
  • Vue組件中使用防抖和節(jié)流實例分析

    Vue組件中使用防抖和節(jié)流實例分析

    在本篇文章里小編給大家整理的是一篇關(guān)于Vue組件中使用防抖和節(jié)流實例分析內(nèi)容,有需要的朋友們可以學(xué)習(xí)參考下。
    2021-11-11
  • vue-cli3使用mock數(shù)據(jù)的方法分析

    vue-cli3使用mock數(shù)據(jù)的方法分析

    這篇文章主要介紹了vue-cli3使用mock數(shù)據(jù)的方法,結(jié)合實例形式分析了vue-cli3使用mock數(shù)據(jù)的相關(guān)實現(xiàn)方法與操作注意事項,需要的朋友可以參考下
    2020-03-03
  • Vite的常見配置選項詳細說明

    Vite的常見配置選項詳細說明

    相信大部分兄弟都體驗過Vite了,都知道它很快,在學(xué)習(xí)的時候,官網(wǎng)上的各種配置也是看的眼花繚亂,不知道哪些是必要掌握的,下面這篇文章主要給大家介紹了關(guān)于Vite常見配置選項的相關(guān)資料,需要的朋友可以參考下
    2024-09-09
  • 詳解使用vue實現(xiàn)tab 切換操作

    詳解使用vue實現(xiàn)tab 切換操作

    這篇文章主要介紹了詳解使用vue實現(xiàn)tab操作,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • vue3項目+element-plus:時間選擇器格式化方式

    vue3項目+element-plus:時間選擇器格式化方式

    這篇文章主要介紹了vue3項目+element-plus:時間選擇器格式化方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03

最新評論