vue使用refs获取dom获取不到问题
之前在公司做项目,一直感觉用ref来定位dom节点挺方便的。但是期间遇到了一个问题,就是在mounted(){}钩子里面使用this.$refs.xxx,打印出来的却是undefined?于是我就对比了一下之前使用ref定位的.vue文件,发现了他们之间的区别。我们要想知道为什么会定位不到某个DOM节点,我们首先要理解mounted(){}这个钩子函数是用来做什么的。下面是vue官方给出的vue生
之前在公司做项目,一直感觉用ref
来定位dom节点挺方便的。但是期间遇到了一个问题,就是在mounted(){}
钩子里面使用this.$refs.xxx
,打印出来的却是undefined
?
于是我就对比了一下之前使用ref
定位的.vue
文件,发现了他们之间的区别。
我们要想知道为什么会定位不到某个DOM节点,我们首先要理解mounted(){}
这个钩子函数是用来做什么的。
下面是vue官方给出的vue生命周期(部分),正如官方所说的一样,一开始不必先理解,不过随着你的学习与使用,他的参考价值会越来越高。
原来,mounted
阶段,DOM
结构准备就绪,但是这里的准备就绪需要特别说明一下:
DOM
结构已经出来了,但是如果在DOM
结构中的某个DOM
节点使用了v-if、v-show
或者v-for
(即根据获得的后台数据来动态操作DOM,即响应式),那么这些DOM
是不会再mounted
阶段找到的。
此时的mounted
阶段,一般是用于发起后端请求,拿回数据,配合路由钩子做一些事情,简单来说就是在mounted
钩子中加载数据而已,加载回来的数据是不会再这个阶段更新的DOM中的,所以如果在mounted
钩子中使用$refs
,如果ref
是定位在有v-if、v-for、v-show
中的DOM
节点,返回来的只能是undefined
,因为在mounted
阶段他们根本不存在!!
经过检验——上面文字是错误的,$refs
定位不到的主要原因是因为v-if、v-for、v-show
这些语句如果依赖父组件传来的参数的话,该该参数是在mounted()
阶段子还没获取得到~~~~!!!!
如果想要真正地在DOM
加载完成后拿到数据,就需要调用VUE的全局api :this.$nextTick(() => {})
如果说mounted
阶段是加载阶段,那么updated
阶段则是完成了数据更新到DOM
的阶段(对加载回来的数据进行处理),此时,ref
数据等等全部都挂载到DOM结构上去,在updated
阶段使用this.$refs.xxx
,就100%能找到该DOM
节点。
updated
与mounted
不同的是,在每一次的DOM结构更新,vue都会调用一次updated(){}
钩子函数!,而mounted
仅仅只执行一次而已。
简单来说,只要在调试的时候,能看到元素的存在,在updated
阶段都可以使用this.$refs.xxx
找到对应的DOM
节点!
关于$refs
的使用,官方文档特别给出了以下提示:
更多推荐
所有评论(0)