详解在Vue中通过自定义指令获取dom元素
vue.js是数据绑定的框架,大部分情况下我们都不需要直接操作DOMElement,但在某些时候,我们还是有获取DOMElement的需求的;
在vue.js中,获取某个DOMElement常用的方法是将这个元素改成一个组件(component),然后通过this.$el去获取,但是在一些很小的项目里,在一些没有使用webpack等构建工具的项目中,创建一个组件并不是那么值得,所以vue提供了另一种操作DOM元素的方式,就是自定义指令(directive);
自定义指令功能在DOMElement的生命周期内提供了不同的钩子函数,并允许我们监听指令绑定的数据的变化,但是它也是有缺点的,就是在指令的钩子函数内无法通过this来访问当前vue实例,也就无法进一步进行复杂的操作(虽然一般不需要什么复杂的操作),在vue的钩子函数(lifecyclehook)和方法(method)中也无法像this.$el那样轻易的访问到自定义指令绑定的DOM元素;
不过只要通过一点点变通的做法,就可以突破这个限制:
HTML代码:
JavaScript代码:
constvm=newVue({ el:'#app', data:{ elements:{} }, directives:{ run(el,binding){ if(typeofbinding.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);//=>thespanDOMElement console.log(this.elements.test2);//=>thepDOMElement } })
如代码所示,建立一个名为run的自定义指令,运行绑定的方法,并将当前DOMElement作为参数传入;
同时建立一个名为register的方法,接收一个flag参数,并根据这个参数返回一个用于将传入参数注册到this.elements对象中的闭包函数;
将写好的run指令和register方法搭配使用,就可以把想要的DOM注册进this.elements,并在hook或者method中十分方便的访问;
注意:自定义指令将会在DOM元素插入Document时,也就是组件mount时首次执行,所以在此之前,比如beforeMount钩子中是无法使用的,这点也和this.$el一致,详情可以查看官方文档中的生命周期图示;
其实也很好理解啦……在mount之前,根本就没有这个实际的DOM元素,怎么可能访问的到……(:з)∠)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。