vue 热更新的时候,使用 document 获取到的 dom 元素里面包含的内容会消失,但是 ref 获取到的不会消失,这是为什么?为什么在 vue 中获取 dom 使用 ref,而不适用 document,有什么区别吗?

2020-11-04 17:07:38 +08:00
 Pokemon123
1710 次点击
所在节点    程序员
11 条回复
tanranran
2020-11-04 17:11:32 +08:00
vue 中的 dom 都是虚拟 DOM 渲染的,在没有渲染完毕之前 document 是获取不到的
ragnaroks
2020-11-04 17:12:17 +08:00
ref 到的 DOM,应该是内存里面的虚拟 DOM
document 则是实打实的 DOM,渲染的时候被替换成 <!----> 了
Pokemon123
2020-11-04 17:18:27 +08:00
@ragnaroks 也就是说在没有渲染完毕之前,真实的 dom 里面的内容全是<!---->,所以我获取到的 dom 里面的内容是空的?
xiangyuecn
2020-11-04 17:31:18 +08:00
setTimeout 解决一切疑难杂症
Pokemon123
2020-11-04 17:36:15 +08:00
@xiangyuecn 可以再说的详细一些吗☺?
ragnaroks
2020-11-04 17:37:42 +08:00
你看下 vue 的 nexttick 就了解了,有提到 dom
Pokemon123
2020-11-04 17:45:41 +08:00
@ragnaroks 好的,谢谢❀
hongch
2020-11-05 10:24:08 +08:00
可别听楼上的 setTimeout,是有多大的❤️才会用这个蠢办法
azcvcza
2020-11-05 10:31:37 +08:00
ref 里存的应该是 vue 自己的一个对象,有自己的唯一 key 值与实体 dom 做对应,在 vue 更新节点后更新两者之间的联系。setTimeout 的方法是,利用 marco queue 运行比 .nextTick 和 promise 优先级慢的特点,企图在 vue 更新 dom 节点后在去用 document 获取,不是拿不到,html 上的节点怎么可能拿不到。就是不太符合 vue 的思想
meepo3927
2020-11-05 11:21:23 +08:00
在 vue 管理下的 dom 节点是会更新的,
比如你用 var nodeNoRef = document.querySelecotr('.xx-node') 拿到一个节点,
vue 触发热更新(或者是 update)之后,上面的 nodeNoRef 就可能已经不在 document 中了,只是一个即将被回收的对象。
解决方法:
1. 每次使用 DOM 都用 Vue 的$ref 获取 ;
2. 在必要时使用$nextTick 。 常见场景:data 更新后,需要立即获取 DOM,可能需要在$nextTick 中来获取 DOM 。
Pokemon123
2020-11-05 13:33:15 +08:00
@meepo3927 那我使用$ref 获取 dom 的时候,此时页面上还没有渲染真正的 dom 对吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/721784

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX