自定义指令
- 除了核心功能默认内置的指令 (v-model 和 v-show),Vue 也允许注册自定义指令。注意,在 Vue2.0 中,代码复用和抽象的主要形式是组件。然而,有的情况下,你仍然需要对普通 DOM 元素进行底层操作,这时候就会用到自定义指令。举个聚焦输入框的例子,如下:
- 当页面加载时,该元素将获得焦点 (注意:autofocus 在移动版 Safari 上不工作)。事实上,只要你在打开这个页面后还没点击过任何内容,这个输入框就应当还是处于聚焦状态
<body>
<div id="app">
<input type="text" v-focus.stop = "info">
<input type="text" v-my-focus >
</div>
<div id="root">
<input type="text" v-focus.stop = "info">
<input type="text" v-my-focus>
</div>
</body>
<script src="../../lib/vue.js"></script>
<script>
Vue.directive('focus',{
bind: function ( el,binding,vnode,oldVnode ) {
console.log('bind')
},
inserted: function ( el,binding,vnode,oldVnode ) {
console.log( 'el', el )
console.log( 'binding',binding )
console.log( 'vnode',vnode )
console.log( 'oldVnode',oldVnode )
console.log( 'inserted' )
el.focus()
console.log("b", b)
if ( binding.modifiers.stop ) {
el.style.background = 'green'
} else {
el.style.background = 'red'
}
el.value = binding.expression
console.log("c - vNode", c)
console.log("d - oldVNode", d)
el.focus()
},
updated () {
},
componentUpdate () {
},
unbind () {
}
})
new Vue({
el: '#app',
data: {
info: '焦点'
},
directives: {
'my-focus': {
bind () {
},
inserted: function ( el ) {
el.focus()
}
}
}
})
new Vue({
el: '#root'
})
</script>
</html>
- 钩子函数
- bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置
- inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)
- update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新
- componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用
- unbind:只调用一次,指令与元素解绑时调用
- 钩子函数参数
- el:指令所绑定的元素,可以用来直接操作 DOM
- binding:一个对象
- vnode:Vue 编译生成的虚拟节点
- oldVnode:上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用
自定义事件
<body>
<div id="app">
<button @click = "myEvent"> 自定义事件 </button>
</div>
</body>
<script src="../../lib/vue.js"></script>
<script>
var vm = new Vue({
el: '#app',
methods: {
myEvent () {
vm.$emit('aa',20000)
},
}
})
vm.$on('aa',function ( val ) {
console.log( 'aa' + val )
})
</script>
</html>