vue解决this.$refs.xx在mounted中获取DOM元素为undefined问题
作者:zxuanxuanz
这篇文章主要介绍了vue解决this.$refs.xx在mounted中获取DOM元素为undefined问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
1.原因
如果在 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
阶段他们根本不存在。
如果说 mounted
阶段是加载阶段,那么 updated
阶段则是完成了数据更新到 DOM 的阶段(对加载回来的数据进行处理),此时,再使用 this.$refs.xx
,就 100% 能找到该 DOM 节点。
updated
与 mounted
不同的是,在每一次的 DOM 结构更新,Vue.js 都会调用一次 updated
钩子函数!而 mounted
钩子函数仅仅只执行一次而已。
2.解决:使用$nextTick
Vue 实现响应式并不是数据发生变化之后 DOM 立即变化,而是按一定的策略进行 DOM 的更新。
$nextTick 是在下次 DOM 更新循环结束之后执行延迟回调,在修改数据之后使用 $nextTick,则可以在回调中获取更新后的 DOM。
3.动态绑定ref并使用v-for,使用this.$refs[refName]无法获取ref
原因
解决
将this.$refs[refName]改为this.$refs[refName][0]即可
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。