這次帶給大家Vue.JS的自訂指令應該如何使用,使用Vue.JS的自訂指令的注意事項有哪些,下面就是實戰案例,一起來看一下。
Vue.js 允許你註冊自訂指令,實質上是讓你教 Vue 一些新技巧:怎麼將資料的變化對應到 DOM 的行為。你可以使用Vue.directive(id, definition)的方法傳入指令id和定義物件來註冊一個全域自訂指令。定義物件需要提供一些鉤子函數(全部可選):
bind: 只呼叫一次,當指令第一次綁定元素的時候。
update: 第一次是緊跟在bind 之後調用,獲得的參數是綁定的初始值;以後每當綁定的值發生變化就會被調用,獲得新值與舊值兩個參數。
unbind:只呼叫一次,當指令解綁元素的時候。
範例:
Vue.directive('my-directive', { bind: function () { // 做绑定的准备工作 // 比如添加事件监听器,或是其他只需要执行一次的复杂操作 }, update: function (newValue, oldValue) { // 根据获得的新值执行对应的更新 // 对于初始值也会被调用一次 }, unbind: function () { // 做清理工作 // 比如移除在 bind() 中添加的事件监听器 } })
一旦註冊好自訂指令,你就可以在Vue.js 範本中像這樣來使用它(需要加入Vue.js 的指令前綴,預設為v- ):
<div v-my-directive="someValue"></div>
如果你只需要update 函數,你可以只傳入一個函數,而不用傳定義物件:
Vue.directive('my-directive', function (value) { // 这个函数会被作为 update() 函数使用})
所有的鉤子函數會被複製到實際的指令物件中,而這個指令物件將會是所有鉤子函數的this
上下文環境。指令物件上揭露了一些有用的公開屬性:
el: 指令綁定的元素
vm: 擁有該指令的上下文ViewModel
expression: 指令的表達式 ,不包含參數和過濾器
arg: 指令的參數
raw: 未被解析的原始表達式
name: 不含前綴的指令名
這些屬性是唯讀的,不要修改它們。你也可以給指令物件附加自訂的屬性,但是注意不要覆寫已有的內部屬性。
使用指令物件屬性的範例:
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <title></title> <script src="http://cdnjs.cloudflare.com/ajax/libs/vue/0.12.16/vue.min.js"></script></head><body><div id="demo" v-demo-directive="LightSlateGray : msg"></div><script> Vue.directive('demoDirective', { bind: function () { this.el.style.color = '#fff' this.el.style.backgroundColor = this.arg }, update: function (value) { this.el.innerHTML = 'name - ' + this.name + '<br>' + 'raw - ' + this.raw + '<br>' + 'expression - ' + this.expression + '<br>' + 'argument - ' + this.arg + '<br>' + 'value - ' + value } }); var demo = new Vue({ el: '#demo', data: { msg: 'hello!' } })</script></body></html>
多重子句
同一個特性內部,逗號分隔的多個子句將被綁定為多個指令實例。在下面的範例中,指令會被建立和呼叫兩次:
<div v-demo="color: 'white', text: 'hello!'"></div>
如果想要用單一指令實例處理多個參數,可以利用字面量物件作為表達式:
<div v-demo="{color: 'white', text: 'hello!'}"></div> Vue.directive('demo', function (value) { console.log(value) // Object {color: 'white', text: 'hello!'}})
字面指令
如果在建立自訂指令的時候傳入isLiteral: true ,那麼特性值就會被看成直接字串,並被賦值給該指令的expression。字面指令不會試圖建立資料監視。
範例:
<div v-literal-dir="foo"></div> Vue.directive('literal-dir', { isLiteral: true, bind: function () { console.log(this.expression) // 'foo' } })
動態字面指令
然而,在字面指令含有Mustache 標籤的情況下,指令的行為如下:
指令實例會有一個屬性,this._isDynamicLiteral被設為true;
如果沒有提供update函數,Mustache 表達式只會被求值一次,並將該值賦給this.expression。不會對表達式進行資料監視。
如果提供了update函數,指令將會為表達式建立資料監視,並且在計算結果變化的時候呼叫update。
雙向指令
如果你的指令想向 Vue 實例寫回數據,你需要傳入 twoWay: true 。此選項允許在指令中使用 this.set(value)。
Vue.directive('example', { twoWay: true, bind: function () { this.handler = function () { // 把数据写回 vm // 如果指令这样绑定 v-example="a.b.c", // 这里将会给 `vm.a.b.c` 赋值 this.set(this.el.value) }.bind(this) this.el.addEventListener('input', this.handler) }, unbind: function () { this.el.removeEventListener('input', this.handler) } })
內聯語句
傳入acceptStatement: true 可以讓自訂指令像v-on 一樣接受內聯語句:
<div v-my-directive="a++"></div> Vue.directive('my-directive', { acceptStatement: true, update: function (fn) { // the passed in value is a function which when called, // will execute the "a++" statement in the owner vm's // scope. } })
但請明智地使用此功能,因為通常我們希望避免在模板中產生副作用。
深度資料觀察值
如果你希望在一個物件上使用自訂指令,並且當物件內部嵌套的屬性發生變化時也能夠觸發指令的update 函數,那麼你就要在指令的定義中傳入deep: true。
<div v-my-directive="obj"></div> Vue.directive('my-directive', { deep: true, update: function (obj) { // 当 obj 内部嵌套的属性变化时也会调用此函数 } })
指令優先權
你可以選擇給指令提供一個優先權數(預設是0)。同一個元素上優先權越高的指令會比其他的指令處理得更早。優先權一樣的指令會依照其在元素特性清單中出現的順序依序處理,但是不能保證這個順序在不同的瀏覽器中是一致的。
通常來說身為用戶,你並不需要關心內建指令的優先級,如果你有興趣的話,可以參閱原始碼。邏輯控制指令 v-repeat, v-if 被視為 “終結性指令”,它們在編譯過程中始終擁有最高的優先權。
元素指令
有時候,我們可能想要我們的指令可以以自訂元素的形式被使用,而不是作為一個特性。這與 Angular 的 E 類指令的概念非常相似。元素指令可以看做是一個輕量的自定義元件(後面會講到)。你可以像下面這樣註冊一個自訂的元素指令:
Vue.elementDirective('my-directive', { // 和普通指令的 API 一致 bind: function () { // 对 this.el 进行操作... } })
使用時我們不再用這樣的寫法:
<div v-my-directive></div>
而是寫成:
<my-directive></my-directive>
元素指令不能接受参数或表达式,但是它可以读取元素的特性,来决定它的行为。与通常的指令有个很大的不同,元素指令是终结性的,这意味着,一旦 Vue 遇到一个元素指令,它将跳过对该元素和其子元素的编译 - 即只有该元素指令本身可以操作该元素及其子元素。
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
相关阅读:
一个用Vue.js 2.0+做出的石墨文档样式的富文本编辑器
以上是Vue.JS的自訂指令應該如何使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JavaScript是現代網站的核心,因為它增強了網頁的交互性和動態性。 1)它允許在不刷新頁面的情況下改變內容,2)通過DOMAPI操作網頁,3)支持複雜的交互效果如動畫和拖放,4)優化性能和最佳實踐提高用戶體驗。

C 和JavaScript通過WebAssembly實現互操作性。 1)C 代碼編譯成WebAssembly模塊,引入到JavaScript環境中,增強計算能力。 2)在遊戲開發中,C 處理物理引擎和圖形渲染,JavaScript負責遊戲邏輯和用戶界面。

JavaScript在網站、移動應用、桌面應用和服務器端編程中均有廣泛應用。 1)在網站開發中,JavaScript與HTML、CSS一起操作DOM,實現動態效果,並支持如jQuery、React等框架。 2)通過ReactNative和Ionic,JavaScript用於開發跨平台移動應用。 3)Electron框架使JavaScript能構建桌面應用。 4)Node.js讓JavaScript在服務器端運行,支持高並發請求。

Python更適合數據科學和自動化,JavaScript更適合前端和全棧開發。 1.Python在數據科學和機器學習中表現出色,使用NumPy、Pandas等庫進行數據處理和建模。 2.Python在自動化和腳本編寫方面簡潔高效。 3.JavaScript在前端開發中不可或缺,用於構建動態網頁和單頁面應用。 4.JavaScript通過Node.js在後端開發中發揮作用,支持全棧開發。

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。1)C 用于解析JavaScript源码并生成抽象语法树。2)C 负责生成和执行字节码。3)C 实现JIT编译器,在运行时优化和编译热点代码,显著提高JavaScript的执行效率。

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

Dreamweaver CS6
視覺化網頁開發工具

WebStorm Mac版
好用的JavaScript開發工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。