EP38 - 自訂命令

更新於 發佈於 閱讀時間約 10 分鐘
Custom Directives,感覺好像有點猛?
感覺是可以做一些擴充功能吧!從 v-for 變成 v-money !!!
創建一個幫我賺錢的指令 www ~~

介紹 - Introduction

除了核心中預設的一組指令(如 v-model 或 v-show)之外,Vue 還允許您註冊自己的自定義指令。

我們在 Vue 中引入了兩種代碼重用的形式:組件可組合功能。組件是主要的構建塊,而可組合功能則專注於重用有狀態的邏輯。另一方面,自定義指令主要用於重用涉及低級 DOM 訪問的邏輯。

自定義指令被定義為包含類似於組件的生命週期鉤子的物件。這些鉤子接收指令綁定的元素。下面是一個指令的例子,當元素被 Vue 插入到 DOM 中時,會將焦點放在輸入框上:

<script setup>
// 使 v-highlight 可在模板中使用
const vHighlight = {
mounted: (el) => {
el.classList.add('is-highlight')
}
}
</script>

<template>
<p v-highlight>這句話很重要!</p>
</template>
raw-image

<script setup> 中,任何以 v 前綴開頭的駝峰命名變量都可以作為自定義指令使用。在上面的例子中,vHighlight 可以在模板中作為 v-highlight 使用。

如果您不使用 <script setup>,可以使用 directives 選項來註冊自定義指令:

export default {
setup() {
/*...*/
},
directives: {
// 使 v-highlight 可在模板中使用
highlight: {
/* ... */
}
}
}

通常也會在應用層級全局註冊自定義指令:

const app = createApp({})

// 使 v-highlight 在所有組件中可用
app.directive('highlight', {
/* ... */
})

何時使用自定義指令 - When to use custom directives​

自定義指令應該僅在需要通過直接操作 DOM 才能實現所需功能時使用。
一個常見的例子是 v-focus 自定義指令,用於將元素設置為焦點。

<script setup>
// 在模板中啟用 v-focus
const vFocus = {
mounted: (el) => el.focus()
}
</script>

<template>
<input v-focus />
</template>

這個指令比 autofocus 屬性更有用,因為它不僅在頁面加載時有效,還在元素由 Vue 動態插入時有效!

當可能時,推薦使用內置指令(如 v-bind)來進行聲明式模板編寫,因為它們更高效且更適合服務器渲染。

指令鉤子 - Directive Hooks​

指令定義物件可以提供多個鉤子函數(所有的鉤子函數都是可選的):

const myDirective = {
// 在綁定元素的屬性或事件監聽器應用之前調用
created(el, binding, vnode) {
// 參數詳細信息請參見下文
},
// 在元素插入 DOM 之前調用
beforeMount(el, binding, vnode) {},
// 在綁定元素的父組件及其所有子組件掛載後調用
mounted(el, binding, vnode) {},
// 在父組件更新之前調用
beforeUpdate(el, binding, vnode, prevVnode) {},
// 在父組件及其所有子組件更新後調用
updated(el, binding, vnode, prevVnode) {},
// 在父組件卸載之前調用
beforeUnmount(el, binding, vnode) {},
// 在父組件卸載時調用
unmounted(el, binding, vnode) {}
}

鉤子參數 指令鉤子函數接收以下參數:

  • el: 綁定指令的元素。這可以用來直接操作 DOM。
  • binding: 包含以下屬性的物件。
    • value: 傳遞給指令的值。例如,在 v-my-directive="1 + 1" 中,值為 2。
    • oldValue: 之前的值,僅在 beforeUpdateupdated 鉤子中可用。無論值是否更改都可用。
    • arg: 傳遞給指令的參數(如果有)。例如,在 v-my-directive:foo 中,參數為 "foo"
    • modifiers: 包含修飾符的物件(如果有)。例如,在 v-my-directive.foo.bar 中,修飾符物件為 { foo: true, bar: true }
    • instance: 使用該指令的組件實例。
    • dir: 指令定義物件。
    • vnode: 表示綁定元素的底層 VNode。
    • prevVnode: 之前渲染時表示綁定元素的 VNode。僅在 beforeUpdateupdated 鉤子中可用。

例如,考慮以下指令用法:

<template>
<div v-example:foo.bar="baz"></div>
</template>

binding 參數將是一個如下形狀的物件:

{
arg: 'foo',
modifiers: { bar: true },
value: /* `baz` 的值 */,
oldValue: /* 之前更新時 `baz` 的值 */
}

與內置指令類似,自定義指令的參數也可以是動態的。例如:

<template>
<div v-example:[arg]="value"></div>
</template>

這裡,指令參數將根據組件狀態中的 arg 屬性進行響應式更新。

注意

除了 el 之外,應將這些參數視為只讀,不要修改它們。如果需要在鉤子之間共享信息,建議通過元素的 dataset 來實現。

函數簡寫 - Function Shorthand​

通常,自定義指令在 mountedupdated 時具有相同的行為,且不需要其他鉤子。在這種情況下,我們可以將指令定義為一個函數:

<template>
<div v-color="color"></div>
</template>

<script>
app.directive('color', (el, binding) => {
// 這將在 `mounted` 和 `updated` 時調用
el.style.color = binding.value
})
</script>

物件字面量 - Object Literals

如果你的指令需要多個值,你也可以傳遞一個 JavaScript 物件字面量。記住,指令可以接受任何有效的 JavaScript 表達式。

<template>
<div v-demo="{ color: 'white', text: 'hello!' }"></div>
</template>

<script>
app.directive('demo', (el, binding) => {
console.log(binding.value.color) // => "white"
console.log(binding.value.text) // => "hello!"
})
</script>

在組件上使用 - Usage on Components

不建議

不建議在組件上使用自定義指令。當一個組件有多個根節點時,可能會出現意外行為。

當在組件上使用時,自定義指令將始終應用於組件的根節點,類似於fallthrough屬性

<template>
<MyComponent v-demo="test" />
</template>

<!-- MyComponent 的模板 -->
<template>
<div> <!-- v-demo 指令將應用於此 -->
<span>我的組件內容</span>
</div>
</template>

請注意,組件可能有多個根節點。當應用於多根節點組件時,指令將被忽略,並且會拋出警告。與屬性不同,指令不能通過 v-bind="$attrs" 傳遞給其他元素。

這篇匆匆帶過~還沒有好好吸收~
實務上還沒應用過~實在不太清楚好不好用!
先了解有這個東西好了 www
留言
avatar-img
留言分享你的想法!
avatar-img
卡關的人生
2會員
73內容數
分享生活趣事~
卡關的人生的其他內容
2024/11/10
Vue 提供了多種動畫技術來提升應用程式的互動性,包括基於 CSS 類別的動畫、基於狀態的動畫,以及使用監視器來動畫化數值。基於類別的動畫可通過動態添加 CSS 類別來觸發,像是觸發按鈕搖動效果。基於狀態的動畫則是透過樣式綁定,根據互動動態調整元素的外觀,例如根據滑鼠位置改變背景顏色。
Thumbnail
2024/11/10
Vue 提供了多種動畫技術來提升應用程式的互動性,包括基於 CSS 類別的動畫、基於狀態的動畫,以及使用監視器來動畫化數值。基於類別的動畫可通過動態添加 CSS 類別來觸發,像是觸發按鈕搖動效果。基於狀態的動畫則是透過樣式綁定,根據互動動態調整元素的外觀,例如根據滑鼠位置改變背景顏色。
Thumbnail
2024/11/09
Web Components 是一組網頁原生 API,允許開發者創建可重複使用的自訂元素。Vue 與 Web Components 是互補的技術,Vue 支援整合和創建自訂元素。
Thumbnail
2024/11/09
Web Components 是一組網頁原生 API,允許開發者創建可重複使用的自訂元素。Vue 與 Web Components 是互補的技術,Vue 支援整合和創建自訂元素。
Thumbnail
2024/11/08
Vue 建議使用模板構建應用程式,但在需要 JavaScript 的全程式化功能時,渲染函數可派上用場。渲染函數通過 h() 函數創建 vnode,h 是 hyperscript 的簡寫,能生成 HTML 的 JavaScript。
Thumbnail
2024/11/08
Vue 建議使用模板構建應用程式,但在需要 JavaScript 的全程式化功能時,渲染函數可派上用場。渲染函數通過 h() 函數創建 vnode,h 是 hyperscript 的簡寫,能生成 HTML 的 JavaScript。
Thumbnail
看更多
你可能也想看
Thumbnail
沙龍一直是創作與交流的重要空間,這次 vocus 全面改版了沙龍介面,就是為了讓好內容被好好看見! 你可以自由編排你的沙龍首頁版位,新版手機介面也讓每位訪客都能更快找到感興趣的內容、成為你的支持者。 改版完成後可以在社群媒體分享新版面,並標記 @vocus.official⁠ ♥️ ⁠
Thumbnail
沙龍一直是創作與交流的重要空間,這次 vocus 全面改版了沙龍介面,就是為了讓好內容被好好看見! 你可以自由編排你的沙龍首頁版位,新版手機介面也讓每位訪客都能更快找到感興趣的內容、成為你的支持者。 改版完成後可以在社群媒體分享新版面,並標記 @vocus.official⁠ ♥️ ⁠
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
Composition API 是 Vue 3 的一組 API,允許使用導入的函數編寫 Vue 組件,涵蓋反應性 API、生命週期鉤子和依賴注入。它主要在單文件組件的 <script setup> 語法中使用。
Thumbnail
Composition API 是 Vue 3 的一組 API,允許使用導入的函數編寫 Vue 組件,涵蓋反應性 API、生命週期鉤子和依賴注入。它主要在單文件組件的 <script setup> 語法中使用。
Thumbnail
Vue 插件是自包含的代碼,通過 app.use() 方法安裝,用於擴展應用功能。插件可定義為包含 install() 方法的物件,或簡單的函數。插件用途包括註冊全局組件、自定義指令、資源注入和添加全局屬性。
Thumbnail
Vue 插件是自包含的代碼,通過 app.use() 方法安裝,用於擴展應用功能。插件可定義為包含 install() 方法的物件,或簡單的函數。插件用途包括註冊全局組件、自定義指令、資源注入和添加全局屬性。
Thumbnail
Vue 自定義指令用於擴充功能,需要直接操作 DOM 時使用。常見例子如 v-focus 指令,使元素在插入 DOM 時自動獲得焦點。指令定義物件可提供多個生命週期鉤子函數,例如 mounted、updated 等。指令可以簡寫為函數,當行為在 mounted 和 updated 時相同時特別方便。
Thumbnail
Vue 自定義指令用於擴充功能,需要直接操作 DOM 時使用。常見例子如 v-focus 指令,使元素在插入 DOM 時自動獲得焦點。指令定義物件可提供多個生命週期鉤子函數,例如 mounted、updated 等。指令可以簡寫為函數,當行為在 mounted 和 updated 時相同時特別方便。
Thumbnail
在這個範例中,我們展示了如何使用 Vue 的 v-model 來實現各種表單元件的雙向綁定。範例包括文字輸入框、單選框、多選框、單選按鈕、下拉選單和多選下拉選單。使用 ref 創建響應式變數,並在 template 中使用 v-model 進行雙向綁定。這使得表單元件能夠即時反映和更新數據。
Thumbnail
在這個範例中,我們展示了如何使用 Vue 的 v-model 來實現各種表單元件的雙向綁定。範例包括文字輸入框、單選框、多選框、單選按鈕、下拉選單和多選下拉選單。使用 ref 創建響應式變數,並在 template 中使用 v-model 進行雙向綁定。這使得表單元件能夠即時反映和更新數據。
Thumbnail
使用 v-bind 可以將 HTML 屬性、樣式或類別綁定到 Vue 的數據,實現單向數據綁定。而 v-model 則是用於表單元素的雙向數據綁定,使輸入和數據同步更新。使用 v-bind 可以讓我們綁定非字符串值,例如布爾值或對象,從而在處理更複雜的應用場景時更為靈活。
Thumbnail
使用 v-bind 可以將 HTML 屬性、樣式或類別綁定到 Vue 的數據,實現單向數據綁定。而 v-model 則是用於表單元素的雙向數據綁定,使輸入和數據同步更新。使用 v-bind 可以讓我們綁定非字符串值,例如布爾值或對象,從而在處理更複雜的應用場景時更為靈活。
Thumbnail
這篇文章介紹了在 Vue.js 前端框架中如何有效地綁定 Class 和 Style。透過使用 v-bind 指令,使用者可以動態地切換元素的類別和內聯樣式,這不僅能夠簡化程式碼,還能防止錯誤的發生。文章中探討了物件和陣列綁定的使用情境,以及如何在組件中應用這些技術,從而提升開發效率與程式的可讀性。
Thumbnail
這篇文章介紹了在 Vue.js 前端框架中如何有效地綁定 Class 和 Style。透過使用 v-bind 指令,使用者可以動態地切換元素的類別和內聯樣式,這不僅能夠簡化程式碼,還能防止錯誤的發生。文章中探討了物件和陣列綁定的使用情境,以及如何在組件中應用這些技術,從而提升開發效率與程式的可讀性。
Thumbnail
本文介紹了 Vue 的模板語法及虛擬 DOM 概念。學習如何使用 Vue 進行聲明式渲染,以及模板如何轉換為高效的 JavaScript 代碼。探討各種綁定方法、指令及安全注意事項,幫助開發者構建高效動態用戶界面並提升應用性能。文章深入淺出,適合想進一步瞭解 Vue 的開發者。
Thumbnail
本文介紹了 Vue 的模板語法及虛擬 DOM 概念。學習如何使用 Vue 進行聲明式渲染,以及模板如何轉換為高效的 JavaScript 代碼。探討各種綁定方法、指令及安全注意事項,幫助開發者構建高效動態用戶界面並提升應用性能。文章深入淺出,適合想進一步瞭解 Vue 的開發者。
Thumbnail
平常我們在 html 上常看到的例如 v-for、v-model 等等... 也是VUE已經幫我們定義好的指令,而這次我們可以依這自己的需求來建立。 此功能屬於較進階的功能,因此實戰中會比較少見,市面上還是有不少完善的套件能達到同樣效果,建議可以先往這方面察找
Thumbnail
平常我們在 html 上常看到的例如 v-for、v-model 等等... 也是VUE已經幫我們定義好的指令,而這次我們可以依這自己的需求來建立。 此功能屬於較進階的功能,因此實戰中會比較少見,市面上還是有不少完善的套件能達到同樣效果,建議可以先往這方面察找
Thumbnail
Vue3 筆記,指令進階篇
Thumbnail
Vue3 筆記,指令進階篇
Thumbnail
v-bind v-bind 可以讓 template 內的標籤去綁定 script 內定義的變數,舉個例子 可以改寫成這樣 最後效果是一樣的,在標籤內 v-bind 可以簡寫成 : v-model 上一篇已經提到了,就是可以透過網頁上的操作去改變資料的值,比方說表單、輸入欄等等。 v-for 迴圈,
Thumbnail
v-bind v-bind 可以讓 template 內的標籤去綁定 script 內定義的變數,舉個例子 可以改寫成這樣 最後效果是一樣的,在標籤內 v-bind 可以簡寫成 : v-model 上一篇已經提到了,就是可以透過網頁上的操作去改變資料的值,比方說表單、輸入欄等等。 v-for 迴圈,
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News