vue.js 是数据绑定的框架,大部分情况下我们都不需要直接操作 DOM Element,但在某些时候,我们还是有获取DOM Element的需求的;http://www.tuicool.com/articles/6Jfiyyz
组件 (component),然后通过 this.$el
去获取,但是在一些很小的项目里,在一些没有使用 webpack 等构建工具的项目中,创建一个组件并不是那么值得,所以 vue 提供了另一种操作DOM元素的方式,就是 自定义指令this
来访问当前 vue 实例,也就无法进一步进行复杂的操作(虽然一般不需要什么复杂的操作),在 vue 的钩子函数 (lifecycle hook) 和方法 (method) 中也无法像 this.$el
不过只要通过一点点变通的做法,就可以突破这个限制:
HTML代码:
<div id="app">
<span class='test' v-run="register('test1')"></span>
<p class='test' v-run="register('test2')"></p>
</div>
JavaScript代码:
vm = new Vue({
el:'#app',
data : {
elements : {}
},
directives : {
run (el, binding) {
if (typeof binding.value == 'function')
binding.value(el);
}
},
methods : {
register (flag) {
return (el)=>{
this.elements[flag] = el;
}
}
},
beforeMount () {
console.log(this.elements.test1); //=> undefined
},
mounted () {
console.log(this.elements.test1); //=> the span DOM Element
console.log(this.elements.test2); //=> the p DOM Element
}
})
run
register
的方法,接收一个 flag 参数,并根据这个参数返回一个用于将传入参数注册到 this.elements
将写好的 run 指令和 register 方法搭配使用,就可以把想要的 DOM 注册进this.elements,并在 hook 或者 method 中十分方便的访问;
beforeMount
钩子中是 无法使用 的,这点也和 this.$el
一致,详情可以查看官方文档中的 生命周期图示 ;
其实也很好理解啦……在 mount 之前,根本就没有这个实际的 DOM 元素,怎么可能访问的到…… (:з)∠)