vue:自定义指令

160 阅读1分钟

自定义指令

分类

  • 私有自定义指令
  • 全局自定义指令

私有自定义指令

在每个vue组件中,可以再directives节点下声明私有自定义指令,只有该组件自身可用,
子组件也无法使用
<script>
export default{
    directives:{
        color:{        //调用时:v-color
            //为绑定到的html元素设置红色字体
            //当指令第一次被绑定在元素上的时候,会自动触发bind函数
            bind(el){
                //形参el:绑定此指令的原生dom对象
                el.style.color = 'red'
            }
        }    
    },
​
}
    
</script>

自定义指令接收的值

<p v-color="color">123</p>  
<p v-color="'blue'">123</p>    //接收的值为字符串,多加一层引号
<script>
export default{
    data:{
        return {
            color:'red'
        }
    }
    directives:{
        color:{        //调用时:v-color
            //为绑定到的html元素设置红色字体
            //当指令第一次被绑定在元素上的时候,会自动触发bind函数
            bind(el,binding){
                //形参el:绑定此指令的原生dom对象,
                //binding:官方名称,名称可自定义,接受一个对象
                el.style.color = binding.value
            }
        }    
    },
​
}
    
</script>

update函数

bind函数只有在第一次绑定的时候会被调用,当Dom更新的时候bind函数不会触发

update函数会在每次Dom更新的时候被调用,但第一次绑定时不会调用

<p v-color="color">123</p>  
<button @click="color='blue'"> </button>  //修改color的值
<script>
export default{
    data:{
        return {
            color:'red'
        }
    }
    directives:{
        color:{  
​
            //bind只有当指令第一次被绑定在元素上的时候,会自动触发bind函数,之后若更改color的值也不会更新
            bind(el,binding){
                //形参el:绑定此指令的原生dom对象,
                //binding:官方名称,名称可自定义,接受一个对象
                el.style.color = binding.value
            },
                
            //在每次dom更新时都会触发,但第一次绑定的时候不会触发
            update(el,binding){
                //形参el:绑定此指令的原生dom对象,
                //binding:官方名称,名称可自定义,接受一个对象
                el.style.color = binding.value
            }
        }    
    },
​
}
    
</script>

函数指令的简写形式

bind函数和update函数内容一致时,可以进行简写
<p v-color="color">123</p>  
<button @click="color='blue'"> </button>  //修改color的值
<script>
export default{
    data:{
        return {
            color:'red'
        }
    }
    directives:{
        //简写
        color(el,binding){
            el.style.color=binding.value
        }
    },
​
}
    
</script>

全局自定义组件

需要通过vue.directive()进行声明

注意:全局声明的指令或过滤器需要放在main.js文件中

Vue.directive('color',
              {
        bind(el,binding){el.style.color=binding.value},
        update(el,binding){el.style.color=binding.value}
    })
​
//简写
Vue.directive('color',function(el,binding){
    el.style.color=binding.value
})

\