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