Vue自定義指令詳解
在 AngularJs 中,它的指令使用 directive ( name,factor_function)來(lái)實(shí)現(xiàn):
angular.module( 'myapp' ,[])
.directive (myDirective,function (){
return{
template : '',
restrict: '',
replace: '',
........
}
})
除了內(nèi)置指令,Vue.js 也允許組件自定義指令。
+ 自定義指令提供一種機(jī)制將數(shù)據(jù)的變化映射為 DOM 行為
+ Vue.js 用 directive ( id,definition) 方法注冊(cè)一個(gè)全局的自定義指令
+ 自定義的指令接受兩個(gè)參數(shù): 指令 ID 與定義對(duì)象
+ 也可以用組件的 directives 注冊(cè)一個(gè)局部自定義指令 (此方法相當(dāng)于 AngularJs restrict 屬性為A)
1. 鉤子函數(shù)
+ 鉤子函數(shù)是 Windows 消息處理機(jī)制的一部分
+ 通過(guò)設(shè)置“鉤子”,應(yīng)用程序可以在系統(tǒng)級(jí)對(duì)所有消息、事件進(jìn)行過(guò)濾,訪問(wèn)在正常情況下無(wú)法訪問(wèn)的消息。
+ 鉤子的本質(zhì)是一段用以處理系統(tǒng)消息的程序,通過(guò)系統(tǒng)調(diào)用,把它掛入系統(tǒng)。
+ Windows 的鉤子函數(shù)可以認(rèn)為是 Windows 的主要特性之一。利用它們,您可以捕捉您自己進(jìn)程或其它進(jìn)程發(fā)生的事件。
+ 通過(guò)“鉤掛”,您可以給 Windows 一個(gè)處理或過(guò)濾事件的回調(diào)函數(shù),該函數(shù)也叫做“鉤子函數(shù)”,當(dāng)每次發(fā)生您感興趣的事件時(shí),WINDOWS 都將調(diào)用該函數(shù)。
angularjs 提供了兩個(gè)函數(shù): compile 和 link ,其中編譯函數(shù)主要負(fù)責(zé)將作用域和 DOM 進(jìn)行鏈接;鏈接函數(shù)用來(lái)創(chuàng)建可以操作 DOM 的指令
注意: compile 和 link 是互斥的,入如果同時(shí)設(shè)置這兩個(gè)選項(xiàng),則會(huì)把 compile 返回函數(shù)當(dāng)做 link 函數(shù),而忽略 link 選項(xiàng)本身
Vue.js 同樣也提供了幾個(gè)鉤子函數(shù)都是可選的,相互之間沒(méi)有制約關(guān)系
鉤子函數(shù):主要負(fù)責(zé)將作用域和 DOM 進(jìn)行鏈接;鏈接函數(shù)用來(lái)創(chuàng)建可以操作 DOM 的指令
+ bind — 只調(diào)用一次,在指令第一次綁定到元素上的時(shí)候調(diào)用,用這個(gè)鉤子函數(shù)可以定義一個(gè)在綁定時(shí)執(zhí)行一次的初始化動(dòng)作
inserted — 被綁定元素插入父節(jié)點(diǎn)時(shí)調(diào)用(父節(jié)點(diǎn)存在即可調(diào)用,不必存在于 document 中)
update — 在 bind 之后立即以初始值為參數(shù)第一次調(diào)用,之后每當(dāng)被綁定元素所在的模板更新時(shí)調(diào)用,而不論綁定值是否變化。通過(guò)比較更新前后的綁定值,可以忽略不必要的模板更新,參數(shù)為新值與舊值。
componentUpdated — 被綁定元素所在模板完成一次更新周期時(shí)調(diào)用
unbind — 只調(diào)用一次,在指令從元素上解綁時(shí)調(diào)用
Vue.directive('my-directive', {
bind: function(){
//做綁定的準(zhǔn)備工作
//比如添加事件監(jiān)聽(tīng)器,或是其他只需要執(zhí)行一次的復(fù)雜操作
},
inserted: function(){
//...
},
update: function(){
//根據(jù)獲得的新值執(zhí)行對(duì)應(yīng)的更新
//對(duì)于初始值也會(huì)調(diào)用一次
},
componentUpdated: function(){
//...
},
unbind: function(){
//做清理操作
//比如移除bind時(shí)綁定的事件監(jiān)聽(tīng)器
}
})
在注冊(cè)之后,便可以在 Vue.js 模板中這樣寫(xiě)(記得添加前綴 v-):
<div v-my-directive = 'someValue'></div>
當(dāng)只需要 update 函數(shù)時(shí),可以傳入函數(shù)替代定義對(duì)象:
Vue.directive( 'my-directive',function (value) {
// 這個(gè)函數(shù)作用 update()
})
2. 指令實(shí)例屬性
所有鉤子函數(shù)都將被賦值到實(shí)際的指令對(duì)象中,在鉤子內(nèi) this 指向這個(gè)指令對(duì)象。
這個(gè)對(duì)象暴露了一些有用的屬性:
鉤子函數(shù)的參數(shù):
el — 指令綁定的元素,可以用來(lái)直接操作 DOM 。
binding — 一個(gè)對(duì)象,包含以下屬性:
name — 指令的名字,不包含前綴
value —指令的綁定值, 例如: v-my-directive=”1 + 1”,value 的值是 2。
oldValue — 指令綁定的前一個(gè)值,僅在 update 和 componentUpdated 鉤子中可用。無(wú)論值是否改變都可用。
expression — 指令的表達(dá)式,不包括參數(shù)和過(guò)濾器,綁定值的字符串形式。 例如 v-my-directive=”1 + 1” , expression 的值是 “1 + 1”
arg — 傳給指令的參數(shù)。例如 v-my-directive:foo, arg 的值是 “foo”。
modifiers — 一個(gè)對(duì)象,包含指令的修飾符。例如: v-my-directive.foo.bar, 修飾符對(duì)象 modifiers 的值是 { foo: true, bar: true }。
vm — 擁有該指令上下文 ViemModel
vnode — Vue 編譯生成的虛擬節(jié)點(diǎn)。
oldVnode: 上一個(gè)虛擬節(jié)點(diǎn),僅在 update 和 componentUpdated 鉤子中可用。
desciiptor — 一個(gè)對(duì)象,包含指令的解析結(jié)果
注意:我們應(yīng)當(dāng)將這些屬性視為只讀,不要修改它們,我們也可以給指令對(duì)象添加自定義屬性,但是注意不要覆蓋已有的內(nèi)部屬性
下面將講解一個(gè)簡(jiǎn)單的例子,當(dāng)頁(yè)面加載時(shí),input輸入框?qū)⒆詣?dòng)聚焦。
代碼如下:
//注冊(cè)一個(gè)全局自定義指令v-focus
// 當(dāng)綁定元素插入到DOM中
// 聚焦元素
<div id="app">
<input v-focus>
/div>
Vue.directive('focus', {
inserted: function (el) {
el.focus() }
});
var app = new Vue({
el: '#app'
});
下面將講解一個(gè)使用鉤子函數(shù)參數(shù)的例子,將元素的字體色設(shè)置為 #fff,將背景色設(shè)置為傳入指令的參數(shù) red,并將指令名指令綁定值,指令綁定值的表達(dá)式,傳入指令的參數(shù)顯示在中。
代碼如下:
<div id="example" v-demo-directive:red="message"></div>
<script>
Vue.directive('demoDirective', {
bind: function(el, binding, vnode){
el.style.color = '#fff'
el.style.backgroundColor = binding.arg
el.innerHTML =
'指令名 name:' + binding.name + '<br>' +
'指令綁定值 value:' + binding.value + '<br>' +
'指令綁定表達(dá)式expression:' + binding.expression + '<br>' +
'傳入指令的參數(shù)argument - ' + binding.arg + '<br>'
},
});
var demo = new Vue({
el: '#example',
data: {
message: 'hello!'
}
})
</script>
3. 對(duì)象字面量
+ 如果指令需要多個(gè)值,則可以傳入一個(gè) javascript 對(duì)象字面量
+ 指令可以使用任意合法的 javascript 表達(dá)式
<div id="app" v-demo-directive="{ color: 'white', text: 'hello!' }"></div>
Vue.directive('demoDirective', function(el, binding, vnode){
console.log(binding.value.color);
console.log(binding.value.text);
});
var demo = new Vue({
el: '#app'
})
4. 字面指令
+ 當(dāng)指令使用了字面修飾符時(shí),它的值將按普通字符串處理并傳遞給 update 方法
+ update 方法將只調(diào)用一次,因?yàn)槠胀ㄗ址荒苡绊憯?shù)據(jù)變化
+ 若在創(chuàng)建自定義指令時(shí),設(shè)置 inListerral: true 則特性值將被視作字符串,并將賦值給該指令的expression,字面指令不會(huì)建立數(shù)據(jù)監(jiān)視。
div id="isExample" v-myEx.literal = 'foo bar baz'></div>
Vue.directive('myEx',function(el, binding, vnode){
console.log(binding.value.literal)
})
var hah = new Vue({
el: '#isExample'
})
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue動(dòng)態(tài)綁定圖標(biāo)的完整步驟
動(dòng)態(tài)綁定是我們?nèi)粘i_(kāi)發(fā)中經(jīng)常遇到的一個(gè)需求,下面這篇文章主要給大家介紹了關(guān)于vue動(dòng)態(tài)綁定圖標(biāo)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-05-05
前端Vue頁(yè)面中展示本地圖片簡(jiǎn)單代碼示例
今天遇到一個(gè)在vue文件中引入本地圖片的問(wèn)題,于是有了這篇文章,本文主要給大家介紹了關(guān)于前端Vue頁(yè)面中展示本地圖片的相關(guān)資料,需要的朋友可以參考下2023-12-12
vue項(xiàng)目使用CDN引入的配置與易出錯(cuò)點(diǎn)
在日常開(kāi)發(fā)過(guò)程中,為了減少最后打包出來(lái)的體積,我們會(huì)用到cdn引入一些比較大的庫(kù)來(lái)解決,下面這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目使用CDN引入的配置與易出錯(cuò)點(diǎn)的相關(guān)資料,需要的朋友可以參考下2022-05-05
Element-Plus Select組件實(shí)現(xiàn)滾動(dòng)分頁(yè)加載功能
Element-Plus的select組件并沒(méi)有自帶滾動(dòng)分頁(yè)加載的功能,其雖然提供了自定義下拉菜單的底部的方式可以自定義上一頁(yè)及下一頁(yè)操作按鈕的方式進(jìn)行分頁(yè)加載切換,這篇文章主要介紹了Element-Plus Select組件實(shí)現(xiàn)滾動(dòng)分頁(yè)加載功能,需要的朋友可以參考下2024-03-03
vue實(shí)現(xiàn)自定義"模態(tài)彈窗"組件實(shí)例代碼
頁(yè)面中會(huì)有很多時(shí)候需要彈窗提示,我們可以寫(xiě)一個(gè)彈窗組件,下面這篇文章主要給大家介紹了關(guān)于vue實(shí)現(xiàn)自定義"模態(tài)彈窗"組件的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-12-12
Vue+elementUI?el-input輸入框手機(jī)號(hào)校驗(yàn)功能
這篇文章主要介紹了Vue+elementUI?el-input輸入框手機(jī)號(hào)校驗(yàn)功能,限制input框內(nèi)只能輸入數(shù)字,且為11位,通過(guò)實(shí)例代碼介紹了對(duì)輸入手機(jī)號(hào)做校驗(yàn)的方法,感興趣的朋友跟隨小編一起看看吧2023-10-10
SpringBoot結(jié)合Vue3實(shí)現(xiàn)簡(jiǎn)單的前后端交互
本文主要介紹了SpringBoot結(jié)合Vue3實(shí)現(xiàn)簡(jiǎn)單的前后端交互,結(jié)合實(shí)際案例,說(shuō)明了如何實(shí)現(xiàn)前后端數(shù)據(jù)的交互,具有一定的?參考價(jià)值,感興趣的可以了解一下2023-08-08
Vue?通過(guò)this.$emit()方法子組件向父組件傳值(步驟分享)
這篇文章主要介紹了Vue?this.$emit()方法通過(guò)子組件向父組件傳值,第一步在父組件中引入子組件,第二步子組件向父組件傳值,本文通過(guò)需要的朋友可以參考下2022-11-11

