一篇搞懂VUE自定义指令

2,249 阅读3分钟

vue自定义指令

自定义指令:

Vue自定义指令和组件一样存在着全局注册和局部注册两种方式。

全局指令

先来看看注册全局指令的方式,通过 Vue.directive( id, [definition] ) 方式注册全局指令,第一个参数为自定义指令名称(指令名称不需要加 v- 前缀,默认是自动加上前缀的,使用指令的时候一定要加上前缀),第二个参数可以是对象数据,也可以是一个指令函数

<body>
    <div id="app">
        <input type="text" v-focus>
    </div>
</body>
<script type="text/javascript" src="js/vue.js"></script>
<script type="text/javascript">
    Vue.directive('focus', {
        insertedfunction(el) {
            //el表示指令所绑定的元素,下面是他绑定的事件
            el.focus();
        }
    })
</script>
  • 自定义指令传参
<body>
    <div id="app">
        <input type="text" v-color="msg">
    </div>
</body>
<script type="text/javascript" src="js/vue.js"></script>
<script type="text/javascript">
    Vue.directive('focus', {
        bindfunction(el, binding) {
            //根据指令的参数设置背景颜色
            el.style.backgroundColor = binding.value.color;
        }
    })
    var vm = new Vue({
        el:'#app',
        data:{
            msg:{
                color:'orange'
            }
        }
    })

小结:以上都是全局指令,还有局部指令

局部指令

  • 注册局部自定义指令,通过在Vue实例中添加 directives 对象数据注册局部自定义指令。
<div id="app" class="demo">
    <!-- 局部注册 -->
    <input type="text" placeholder="我是局部自定义指令" v-focus2>
</div>
<div id="app1" class="demo">
    <!-- 局部注册 -->
    <input type="text" placeholder="我是局部自定义指令1" v-focus2>
</div>
<script>
    new Vue({
        el"#app",
        directives: {
            focus2: {
                insertedfunction(el){
                    el.focus();
                }
            }
        }
    })
</script>

小结:局部指令只作用于他定义的那个vue 实例,上例中,APP1中的input就不会获取焦点,因为该指令创建于app这个实例中,只能在app这个实例中使用

总结:局部指令和全局指令的区别不仅仅是作用范围的区别,在加载阶段页略有不同,全局指令和全局组件一样,根实例创建时就加载,局部是对于懒加载的组件可以随组件一起加载

表单修饰符

  • v-model.number 把值转换为数子
<input type="text" v-model.number='age'>
    //这里的age是number类型。默认是string
  • v-model.trim 把行首尾空格删除
<input type="text" v-model.trim='age'>
    //age里的行首行尾空格会被默认去掉,一般用于表单验证
  • v-model.lazy把input事件切换为change
<input type="text" v-model.lazy='age'>

小结:默认input的值得变化会实时更新,改成lazy后,会等到input失去焦点才更新