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

 

1.無參數javascript

自定義指令的方式:
1. 使用Vue.directive 來自定義
2. 第一個參數就是 指令名稱 xart
3. el 表示當前的html dom對象
4. 在方法體內就能夠經過 innerHTML style.color 等方式操控當前元素了
html

<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.有參數:vue

<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 框架調用的函數。java

指令定義函數提供了幾個鉤子函數(可選):node

  • bind: 只調用一次,指令第一次綁定到元素時調用,用這個鉤子函數能夠定義一個在綁定時執行一次的初始化動做。express

  • inserted: 被綁定元素插入父節點時調用(父節點存在便可調用,沒必要存在於 document 中)。app

  • update: 被綁定元素所在的模板更新時調用,而不論綁定值是否變化。經過比較更新先後的綁定值,能夠忽略沒必要要的模板更新(詳細的鉤子函數參數見下)。框架

  • componentUpdated: 被綁定元素所在模板完成一次更新週期時調用。dom

  • 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>

相關文章
相關標籤/搜索