Vue(九)---自定義指令(directive )


 

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 }
  • 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至右下角

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM