1.無參數
自定義指令的方式:
1. 使用Vue.directive 來自定義
2. 第一個參數就是 指令名稱 xart
3. el 表示當前的html dom對象
4. 在方法體內就可以通過 innerHTML style.color 等方式操控當前元素了
<body> <div id="app"> <div v-xxx> 商店 </div> </div> <script type="text/javascript"> Vue.directive('xxx',function(el){ el.innerHTML = el.innerHTML + ' ------------ ' el.style.color = 'blue' }) new Vue({ el:'#app' }) </script> </body>
2.有參數:
<body> <div id="app"> <div v-xxx='{color:"red"}'> 商店 </div> </div> <script type="text/javascript"> Vue.directive('xxx', function (el,binding) { el.innerHTML = el.innerHTML + '( ' + binding.value.color + ' )' el.style.color = binding.value.color }) new Vue({ el:'#app' }) </script> </body>
3.鈎子函數:又叫做回調函數,或者事件響應函數。 指的是,一個指令在創建過程中,經歷不同生命周期的時候,vue.js 框架調用的函數。
指令定義函數提供了幾個鈎子函數(可選):
-
bind
: 只調用一次,指令第一次綁定到元素時調用,用這個鈎子函數可以定義一個在綁定時執行一次的初始化動作。 -
inserted
: 被綁定元素插入父節點時調用(父節點存在即可調用,不必存在於 document 中)。 -
update
: 被綁定元素所在的模板更新時調用,而不論綁定值是否變化。通過比較更新前后的綁定值,可以忽略不必要的模板更新(詳細的鈎子函數參數見下)。 -
componentUpdated
: 被綁定元素所在模板完成一次更新周期時調用。 -
unbind
: 只調用一次, 指令與元素解綁時調用。
鈎子函數參數
鈎子函數的參數有:
- el: 指令所綁定的元素,可以用來直接操作 DOM 。
- binding: 一個對象,包含以下屬性:
- name: 指令名,不包括
v-
前綴。 - value: 指令的綁定值, 例如:
v-my-directive="1 + 1"
, value 的值是2
。 - oldValue: 指令綁定的前一個值,僅在
update
和componentUpdated
鈎子中可用。無論值是否改變都可用。 - expression: 綁定值的表達式或變量名。 例如
v-my-directive="1 + 1"
, expression 的值是"1 + 1"
。 - arg: 傳給指令的參數。例如
v-my-directive:foo
, arg 的值是"foo"
。 - modifiers: 一個包含修飾符的對象。 例如:
v-my-directive.foo.bar
, 修飾符對象 modifiers 的值是{ foo: true, bar: true }
。
- name: 指令名,不包括
- vnode: Vue 編譯生成的虛擬節點。
- oldVnode: 上一個虛擬節點,僅在
update
和componentUpdated
鈎子中可用。
<script src="https://how2j.cn/study/vue.min.js"></script> <div id="div1"> <div v-xart:hello.a.b="message"> </div> </div> <script> Vue.directive('xart', { bind: function (el, binding, vnode) { var s = JSON.stringify el.innerHTML = 'name: ' + s(binding.name) + '<br>' + 'value: ' + s(binding.value) + '<br>' + 'expression: ' + s(binding.expression) + '<br>' + 'argument: ' + s(binding.arg) + '<br>' + 'modifiers: ' + s(binding.modifiers) + '<br>' + 'vnode keys: ' + Object.keys(vnode).join(', ') }, update: function (newValue, oldValue) { // 值更新時的工作 // 也會以初始值為參數調用一次 }, unbind: function () { // 清理工作 // 例如,刪除 bind() 添加的事件監聽器 } }) new Vue({ el: '#div1', data:{ message:'hello vue.js' } }) </script>
demo:
index.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <style> .card{ background-color: aquamarine; padding: 5px; border: 1px solid; width: 200px; margin: 5px; } </style> </head> <body> <div id="app"> <div v-pin:foo.bottom.right='card1.pined' class="card"> <button v-on:click="card1.pined =!card1.pined">定住/取消</button> red flower,red flower,red flower,red flower,red flower,red flower,red flower,red flower,red flower,red flower,red flower,red flower </div> </div> <div v-pin='card2.pined' class="card"> red flower,red flower,red flower,red flower,red flower,red flower,red flower,red flower,red flower,red flower,red flower,red flower </div> </div> <div > red flower,red flower,red flower,red flower,red flower,red flower,red flower,red flower,red flower,red flower,red flower,red flower ,red flower,red flower,red flower,red flower,red flower,red flower,red flower,red flower,red flower,red flower </div> <div > red flower,red flower,red flower,red flower,red flower,red flower,red flower,red flower,red flower,red flower,red flower ,red flower,red flower,red flower,red flower,red flower,red flower,red flower,red flower,red flower </div> </div> <script src="js/vue.js"></script> <script src="js/main.js"></script> </body> </html>
main.js
Vue.directive('pin',function(el,binding, vnode){
console.log(binding)
var pin=binding.value;
console.log(pin)
var position=binding.modifiers;
console.log(position)
var arg=binding.arg;
console.log(arg)
if(pin){
el.style.position='fixed';
for(var key in position){
if(position[key]){
el.style[key]='10px'
}
}
if(arg === 'foo'){
el.style.background='yellow'
}
}else{
el.style.position='static',
el.style.background='aquamarine'
}
})
new Vue({
el:'#app',
data:{
card1:{
pined:false
},
card2:{
pined:false
}
}
})
點擊按鈕position至右下角