vue 自定义指令

53 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第30天,点击查看活动详情

自定义指令

单文件组件中的局部自定义指令

  • 创建局部自定义指令:

    // 创建局部指令
    directives: {
        指令名称:{
            inserted(el,binding,Vnode){
    ​
            }
        }
    }
    
  • 特点:在组件内部创建的局部自定义指令只有在当前组件中可以使用,在组件外部无法使用

    • 使用说明

      • 参数说明

        • 指令id可由程序员自行定义,注意和系统指令名称有所区别,例如:focus,在某个元素上具体使用的时候请在 指令id前面再加上v-,例如<input v-focus>

        • 第二个参数是一个对象,其中inserted是一个函数,表示 “被绑定元素插入父节点时调用”

          • inserted的参数:
          • el参数:表示使用此自定义指令的dom对象

            • binding参数:一个对象,包含以下属性:

              • name:指令名,不包括 v- 前缀。
              • value:指令的绑定值,例如:v-focus="colorvalue", value 的值是colorvalue这个变量的值,colorvalue定义在data(){}中
              • expression:绑定值的字符串形式。例如 v-focus="colorvalue" ,expression 的值是 "colorvalue"
    • 使用局部自定义指令v-focus实现光标自动定位

        1、定义指令color
          Vue.directive('color',{
              inserted:function(el,binding){
                //将颜色设置给使用v-color指令的元素上
                el.style.color=binding.value;
              }
          });
      ​
      ​
        2、 在dom元素上使用指令,注意加上前缀 v-
        编号:<input type="text" v-model="product.id" v-color="colorvalue">
      ​
        3、在Vue对象实例中的data(){}中定义colorvalue
        data: {
            colorvalue:'red'
        }
      

全局自定义指令

  • 创建方式:Vue.deriective(指令名称,配置)

  • inserted钩子函数:当元素解析完毕,添加到dom树的时候触发

  • 全局自定义在vm实例外创建(main.js文件中创建)

  • 如何使用自定义指令

    • v-自定义指令的名称
    // 创建全局的自定义
    Vue.directive('focus',{
        // 添加inserted钩子函数
        // el:就是当前添加了这个指令的元素
        inserted(el){
            // 获取元素
            // 设置获取焦点
            el.focus()
        }
    })
    --------------使用------------------
    <input type="text" v-model='userdata.id' v-focus> 
    
  • 细节:关于命名:

    • 如果命名是采用cemal命名法那么后期使用指令的时候需要使用-连接每一个单词
    • 建议:指令小写
  • 指令参数传递

    • 使用的时候为自定义指令赋

      <input type="text" v-model='userdata.name' v-setcolor='color'>
      
    • 在定义的时候,通过inserted钩子函数的第二个参数binding获取数据

      inserted(el,binding,vnode){
          el.style.color = binding.value
          console.log(binding)
          console.log(vnode)
      }