搜尋
首頁web前端Vue.jsVue3中如何自訂指令?程式碼講解

Vue3中如何自訂指令?程式碼講解

Jul 28, 2022 pm 07:33 PM
vue.jsvue3自訂指令

Vue3中如何自訂指令?以下這篇文章就來手把手教大家在 Vue3 中自訂指令,希望對大家有幫助!

Vue3中如何自訂指令?程式碼講解

TienChin 專案前端是Vue3,前端有這樣的一個需求:有一些前端頁面上的按鈕要根據使用者的權限來決定是否要展示出來,如果使用者俱備相應的權限,那就展示對應的按鈕;如果使用者不具備對應的權限,那麼按鈕就隱藏起來。大致上就這樣一個需求。

看到這個需求,可能有小夥伴先想到用v-if 指令,這個指令確實也能做,但是,由於使用者俱備的權限一般來說可能是多個,甚至可能還有通配符,所以這個比對並不是一個容易的事情,肯定得寫方法。 。 。所以,如果能用一個指令來實現這個功能,那麼就會顯得專業很多了。

說乾就乾,我們來看看 Vue3 中如何自訂指令。 (學習影片分享:vue影片教學

1. 成果展示

我們先來看看實作自訂指令最終的使用方式:

<button>删除用户</button>

小夥伴們看到,這個v-hasPermission 就是我們的自訂指令,如果目前使用者俱備user:delete 權限,這個按鈕就會展示出來,如果目前使用者不具備這個權限,這個按鈕就不會展示出來。

2. 指令基礎

先要和小夥伴們說一下,Vue2 和Vue3 在自訂指令上有一些差異,並不完全一致,下面的介紹主要是針對Vue3 的介紹。

我先來和小夥伴們分享我們具體是怎麼做的,然後在講解程式碼的時候再來和大家說說各個參數的含義。

2.1 兩種作用域

自訂指令可以定義全域的,也可以定義局部的。

在正式開搞之前,小夥伴們需要先明白,自訂指令有兩種作用域,一種是局部的自訂指令,還有一種是全域的自訂指令。局部的自訂指令就只能在目前 .vue 檔案中使用,全域的則可以在所有的 .vue 檔案中使用。

2.1.1 局部指令

直接在目前.vue 檔案中定義即可,如下:

directives: {
  focus: {
    // 指令的定义
    mounted(el) {
      el.focus()
    }
  }
}

不過,在Vue3 中,也可以這樣寫:

<template>
    <p>
        <button>ClickMe</button>
    </p>
</template>

<script>

    import {ref} from &#39;vue&#39;;

    export default {
        name: "MyVue01",
        setup() {
            const a = ref(1);
            const btnClick = () => {
                a.value++;
            }
            return {a, btnClick}
        },
        directives: {
            onceClick: {
                mounted(el, binding, vnode) {
                    el.addEventListener(&#39;click&#39;, () => {
                        if (!el.disabled) {
                            el.disabled = true;
                            setTimeout(() => {
                                el.disabled = false;
                            }, binding.value || 1000);
                        }
                    });
                }
            }
        }
    }
</script>

這裡我自訂了一個名叫onceClick 的指令,給一個button 按鈕加上這個指令之後,可以設定這個button 按鈕在點擊多久之後,處於停用狀態,防止使用者重複點擊。

小夥伴們看,這個指令的執行邏輯其實很簡單,el 相當於添加了這個指令的元素,監聽該元素的點擊事件,如果點擊該元素時,該元素不是處於禁用狀態,那就設定該元素為停用,給定時任務,到期後使該元素變成可用。這裡邊具體的參數,松哥下面會跟大家詳細介紹。

不過這只是一個局部指令​​,只能在目前 .vue 檔案中使用,我們也可以定義全域指令,這樣就可以在所有的 .vue 檔案中使用了。

2.1.2 全域指令

全域指令我們一般寫在main.js 中,或寫一個單獨的js 檔案然後在main.js 中引入,下面的例子是直接寫在main.js 中:

const app = createApp(App);

app.directive('onceClick',{
    mounted(el, binding, vnode) {
        el.addEventListener('click', () => {
            if (!el.disabled) {
                el.disabled = true;
                setTimeout(() => {
                    el.disabled = false;
                }, binding.value || 1000);
            }
        });
    }
})

這樣,我們就可以隨時隨地去使用v-onceClick 這個指令了。

可能小夥伴感覺比較疑惑,自訂指令時候的 mounted 以及這裡的參數都是咋回事,那麼接下來松哥就來和大家詳細介紹一下這些方法和參數。

2.2 七個鉤子函數

在Vue3 中,自訂指令的鉤子函數主要有以下七種(這塊跟Vue2 差異較大):

  • created:在綁定元素的attribute 或事件監聽器被套用之前呼叫。當指令需要附加在普通的 v-on 事件監聽器呼叫前的事件監聽器中時,這很有用。
  • beforeMount:當指令第一次綁定到元素並且在掛載父元件之前呼叫。
  • mounted:在綁定元素的父元件被掛載後調用,大部分自訂指令都寫在這裡
  • beforeUpdate:在更新包含元件的 VNode 之前呼叫。
  • updated:在包含元件的 VNode 及其子元件的 VNode 更新後呼叫。
  • beforeUnmount:在卸載綁定元素的父元件之前呼叫
  • unmounted:當指令解除元素綁定且父元件已卸載時,只呼叫一次。

雖然鉤子函數比較多,看著有點唬人,不過我們日常開發中用的最多的其實是 mounted 函數。

2.3 四个参数

这里七个钩子函数,钩子函数中有回调参数,回调参数有四个,含义基本上和 Vue2 一致:

  • el:指令所绑定的元素,可以用来直接操作 DOM,我们松哥说想实现一个可以自动判断组件显示还是隐藏的指令,那么就可以通过 el 对象来操作 DOM 节点,进而实现组件的隐藏。
  • binding:我们通过自定义指令传递的各种参数,主要存在于这个对象中,该对象属性较多,如下属性是我们日常开发使用较多的几个:

    • name:指令名,不包括 v- 前缀。
    • value:指令的绑定值,例如:v-hasPermission="['user:delete']" 中,绑定值为 'user:delete',不过需要小伙伴们注意的是,这个绑定值可以是数组也可以是普通对象,关键是看你具体绑定的是什么,在 2.1 小节的案例中,我们的 value 就是一个数字。
    • expression:字符串形式的指令表达式。例如 v-my-directive="1 + 1" 中,表达式为 "1 + 1"。
    • arg:传给指令的参数,可选。例如 v-hasPermission:[name]="'zhangsan'" 中,参数为 "name"。
  • vnode:Vue 编译生成的虚拟节点。
  • oldVnode:上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。

除了 el 之外,其它参数都应该是只读的,切勿进行修改。如果需要在钩子之间共享数据,建议通过元素的 dataset 来进行。

2.4 动态参数

有一种动态参数,这里也和小伙伴们分享下。正常情况下,我们自定义指令时传递的参数都是通过 binding.value 来获取到的,不过在这之外还有一种方式就是通过 binding.arg 获取参数。

我举一个简单例子,假设我们上面这个 onceClick 指令,默认的时间单位时毫秒,假设现在想给时间设置单位,那么我们就可以这样写:

const app = createApp(App);

app.directive('onceClick',{
    mounted(el, binding, vnode) {
        el.addEventListener('click', () => {
            if (!el.disabled) {
                el.disabled = true;
                let time = binding.value;
                if (binding.arg == "s") {
                    time = time * 1000;
                }
                setTimeout(() => {
                    el.disabled = false;
                }, time);
            }
        });
    }
})

在自定义指令的时候,获取到 binding.arg 的值,这样就可以知道时间单位了,在使用该指令的时候,方式如下:

<button>ClickMe</button>
<script>

    import {ref} from &#39;vue&#39;;

    export default {
        name: "MyVue01",
        setup() {
            const timeUnit = ref(&#39;s&#39;);
            return {timeUnit}
        }
    }
</script>

timeUnit 是一个提前定义好的变量。

3. 自定义权限指令

好啦,有了上面的基础知识,接下来就来看我们本文的主题,自定义权限指令,我写一个简单的例子大家来看下:

const usersPermissions = ['user'];

app.directive('hasPermission', {
    mounted(el, binding, vnode) {
        const {value} = binding;
        let f = usersPermissions.some(p => {
            return p.indexOf(value) !== -1;
        });
        if (!f) {
            el.parentNode && el.parentNode.removeChild(el);
        }
    }
})

usersPermissions 表示当前用户所具备的权限,正常该数据应该是从服务端加载而来,但是我这里简单起见,就直接定义好了。

具体的逻辑很简单,先从 binding 中提取出 value 的值,这就是当前控件所需要的权限,然后遍历 usersPermissions 用一个 some 函数,去查看 usersPermissions 中是否有满足条件的值,如果没有,说明当前用户不具备展示该组件所需要的权限,那么就要隐藏这个组件,隐藏的方式就是获取到当前组件的父组件,然后从父组件中移除当前组件即可。

这是一个全局的指令,定义好之后,我们就可以在组件中直接使用了:

<button>删除用户</button>

好啦,Vue3 自定义组件学会了没?松哥在最近的 TienChin 项目视频中也会和大家分享这块的内容,敬请期待。

(学习视频分享:web前端开发编程基础视频

以上是Vue3中如何自訂指令?程式碼講解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:segmentfault。如有侵權,請聯絡admin@php.cn刪除
vue.js vs.後端框架:澄清區別vue.js vs.後端框架:澄清區別Apr 25, 2025 am 12:05 AM

Vue.js是前端框架,後端框架用於處理服務器端邏輯。 1)Vue.js專注於構建用戶界面,通過組件化和響應式數據綁定簡化開發。 2)後端框架如Express、Django處理HTTP請求、數據庫操作和業務邏輯,運行在服務器上。

vue.js和前端堆棧:了解連接vue.js和前端堆棧:了解連接Apr 24, 2025 am 12:19 AM

Vue.js與前端技術棧緊密集成,提升開發效率和用戶體驗。 1)構建工具:與Webpack、Rollup集成,實現模塊化開發。 2)狀態管理:與Vuex集成,管理複雜應用狀態。 3)路由:與VueRouter集成,實現單頁面應用路由。 4)CSS預處理器:支持Sass、Less,提升樣式開發效率。

Netflix:探索React(或其他框架)的使用Netflix:探索React(或其他框架)的使用Apr 23, 2025 am 12:02 AM

Netflix選擇React來構建其用戶界面,因為React的組件化設計和虛擬DOM機制能夠高效處理複雜界面和頻繁更新。 1)組件化設計讓Netflix將界面分解成可管理的小組件,提高了開發效率和代碼可維護性。 2)虛擬DOM機制通過最小化DOM操作,確保了Netflix用戶界面的流暢性和高性能。

vue.js和前端:深入研究框架vue.js和前端:深入研究框架Apr 22, 2025 am 12:04 AM

Vue.js被開發者喜愛因為它易於上手且功能強大。 1)其響應式數據綁定係統自動更新視圖。 2)組件系統提高了代碼的可重用性和可維護性。 3)計算屬性和偵聽器增強了代碼的可讀性和性能。 4)使用VueDevtools和檢查控制台錯誤是常見的調試技巧。 5)性能優化包括使用key屬性、計算屬性和keep-alive組件。 6)最佳實踐包括清晰的組件命名、使用單文件組件和合理使用生命週期鉤子。

vue.js在前端的力量:關鍵特徵和好處vue.js在前端的力量:關鍵特徵和好處Apr 21, 2025 am 12:07 AM

Vue.js是一個漸進式的JavaScript框架,適用於構建高效、可維護的前端應用。其關鍵特性包括:1.響應式數據綁定,2.組件化開發,3.虛擬DOM。通過這些特性,Vue.js簡化了開發過程,提高了應用性能和可維護性,使其在現代Web開發中備受歡迎。

vue.js比反應好嗎?vue.js比反應好嗎?Apr 20, 2025 am 12:05 AM

Vue.js和React各有優劣,選擇取決於項目需求和團隊情況。 1)Vue.js適合小型項目和初學者,因其簡潔和易上手;2)React適用於大型項目和復雜UI,因其豐富的生態系統和組件化設計。

vue.js的功能:增強前端的用戶體驗vue.js的功能:增強前端的用戶體驗Apr 19, 2025 am 12:13 AM

Vue.js通過多種功能提升用戶體驗:1.響應式系統實現數據即時反饋;2.組件化開發提高代碼復用性;3.VueRouter提供平滑導航;4.動態數據綁定和過渡動畫增強交互效果;5.錯誤處理機制確保用戶反饋;6.性能優化和最佳實踐提升應用性能。

vue.js:定義其在網絡開發中的作用vue.js:定義其在網絡開發中的作用Apr 18, 2025 am 12:07 AM

Vue.js在Web開發中的角色是作為一個漸進式JavaScript框架,簡化開發過程並提高效率。 1)它通過響應式數據綁定和組件化開發,使開發者能專注於業務邏輯。 2)Vue.js的工作原理依賴於響應式系統和虛擬DOM,優化性能。 3)實際項目中,使用Vuex管理全局狀態和優化數據響應性是常見實踐。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。