自定义指令

自定义指令的注册方法分为全局注册局部注册,比如注册一个v-focus指令,用于在<input><textarea>元素初始化时自动获得焦点,两种写法分别是:

//全局注册
Vue.directive('focus', {});

//局部注册
new Vue({
    el: '#app',
    directives: {
        focus: {}
    }
});

自定义指令的选项是由几个钩子函数组成,每个都是可选的:

可以根据需求在不同的钩子函数内完成逻辑代码。在元素插入父节点时就调用,用到的最好是inserted

<div id="app">
    <input type="text" v-focus>
</div>

Vue.directive('focus', {
    inserted(el) {
        el.focus();
    }
});
new Vue({
    el: '#app',
});

打开页面,input输入框自动获得焦点,成为可输入状态。

每个钩子函数都有几个参数可用:

See the Pen Vue-自定义指令 by whjin (@whjin) on CodePen.

如果需要多个值,自定义指令可以传入一个JavaScript对象字面量。

<div id="app">
    <div v-test="{msg:'hello',name:'Andy}"></div>
</div>

开发一个实时时间转换指令v-time

See the Pen Vue-实时时间转换指令 by whjin (@whjin) on CodePen.

Time.getFormatTime()方法就是自定义指令v-time所需要的,入参为毫秒级时间戳,返回已经整理好时间格式的字符串。

bind钩子里,将指令v-time表达式的值binding.value作为参数传入TimeFormatTime()方法得到格式化时间,再通过el.innerHTML写入指令所在元素。定时器el.__timeout__每分钟触发一次,更新时间,并且在unbind钩子里清除掉。

总结:在编写自定义指令时,给DOM绑定一次性事件等初始动作,建议在bind钩子内完成,同时要在unbind内解除相关绑定。