vue中使用refs定位dom出现undefined?

  之前在公司做项目,一直感觉用ref来定位dom节点挺方便的。但是期间遇到了一个问题,就是在mounted(){}钩子里面使用this.$refs.xxx,打印出来的却是undefined?

  于是我就对比了一下之前使用ref定位的.vue文件,发现了他们之间的区别。

  我们要想知道为什么会定位不到某个DOM节点,我们首先要理解mounted(){}这个钩子函数是用来做什么的。

  下面是vue官方给出的vue生命周期(部分),正如官方所说的一样,一开始不必先理解,不过随这你的学习与使用,他的参考价值会越来越高。

 

  原来,mounted阶段,DOM结构准备就绪,但是这里的准备就绪需要特别说明一下:

  DOM结构已经出来了,但是如果在DOM结构中的某个DOM节点使用了v-ifv-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结构上去,在update阶段使用this.$refs.xxx,就100%能找到该DOM节点。

  updated与mounted不同的是,在每一次的DOM结构更新,vue都会调用一次updated(){}钩子函数!,而mounted仅仅只执行一次而已

  简单来说,只要在调试的时候,能看到元素的存在,在updated阶段都可以使用this.$refs.xxx找到对应的DOM节点!

 

  关于$refs的使用,官方文档特别给出了以下提示:

   使用的时候就注意咯- - 

 

  启发、参考博客:

http://www.cnblogs.com/zenghaiming/p/6650381.html                     

http://www.cnblogs.com/wxb-it/p/7138364.html#commentform                     

http://www.cnblogs.com/xumqfaith/p/7743387.html

转载于:https://www.cnblogs.com/pengshengguang/p/7929367.html

QianKun是一个Vue.js的框架,它通常用于构建大型单页应用(SPA)或多页面应用(MPA),特别是在微前端架构。当在子组件尝试访问父组件的`$refs`时,可能会遇到`undefined`问题,因为`$refs`是在DOM渲染完成后才可用的,而在子组件初始化阶段,父组件的DOM还没有完全生成。 解决这个问题有几种常见的方法: 1. **延迟引用**:如果你需要立即使用某个元素,可以在子组件的`mounted`生命周期钩子获取`$refs`,比如: ```javascript export default { mounted() { this.$nextTick(() => { const parentElement = this.$refs.parentRef; // ... 使用parentElement }); } } ``` 这里通过`this.$nextTick`确保在DOM更新完毕后再去获取元素。 2. **传递ref**:如果子组件需要频繁地获取到父组件的元素,可以将父组件的ref作为props传递给子组件: ```html <template> <div ref="parentRef"> <child-component :parent-ref="parentRef" /> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent, }, methods: { getRef() { return this.$refs.parentRef; }, }, }; </script> ``` 然后在子组件里使用`props.parentRef`。 3. **使用自定义指令**:对于复杂的场景,还可以创建自定义指令来动态获取并传递`$refs`。 注意,在实际使用,应尽量避免过度依赖`$refs`,因为它并不是一种推荐的最佳实践,尤其是随着组件树复杂度增加。优先考虑数据驱动的解决方案会更稳定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值