vue 必须使用refs获取元素吗_vue使用this.$refs.xx在mounted中获取DOM元素为undefined

this.$refs.xxx为undefined的几种情况:

1.在created里钩子函数中调用

原因:created()在实例创建完成后被立即调用。在这一步,实例已完成以下的配置:数据观测 (data observer),属性和方法的运算,watch/event 事件回调。然而,挂载阶段还没开始,$el 属性目前不可见。所以this.$refs压根就调不到那个dom,因为页面还没有挂载上去。

2.数据或条件渲染(v-if, v-show)之后的调用

原因:

ref本身作为渲染结果被创建,在初始渲染的时候不能访问他们,是不存在的

$refs不是响应式的,所有的动态加载的模板更新它都无法相应的变化,只在组件渲染完成后才填充。

用于元素或子组件注册引用信息,注册完成,将会注册在父组件$refs对象上

原因:

如果在 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 钩子函数仅仅只执行一次而已。

解决:使用$nextTick

Vue 实现响应式并不是数据发生变化之后 DOM 立即变化,而是按一定的策略进行 DOM 的更新。

$nextTick 是在下次 DOM 更新循环结束之后执行延迟回调,在修改数据之后使用$nextTick,则可以在回调中获取更新后的 DOM。

在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。

c31e853da6fba269ed177cea5a3b5b74.png

bef79e43807dfa1c73d07eccdac52672.png

数据更新后,使用setTimeout也可

setTimeout(() => {

console.log(this.$refs.***)

}, 0)

动态绑定ref并使用v-for,使用this.$refs[refName]无法获取ref

原因:

bcbdb7a9b4ca0603263790e079f4e890.png

解决:

将this.$refs[refName]改为this.$refs[refName][0]即可

原文:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值