Vue的ref每次使用时都会执行DOM查找吗?

时间:2018-06-14 07:59:24

标签: javascript performance vue.js

我目前正在测试Vue.js,并在我的项目中使用了一些 refs 。 我不确定每次在我的方法中调用ref,执行DOM Lookup,或者vue是否存储所有refs然后访问引用。

我无法通过文档或谷歌找到答案。

https://vuejs.org/v2/api/#ref

示例

myDiv = this.$refs.myDiv

我是否需要自己将ref存储在变量中,或者多次调用ref时是否没有性能影响?

3 个答案:

答案 0 :(得分:4)

通过源代码,当启动vue实例时,它将属性$ref = { }设置为空对象。见initLifecycle function

通过检查虚拟节点在registerRef函数中是否具有vm.$refs属性(ref来填充此vnode.data.ref对象。

所以你自己不必这样做。

引用$refs.myRef不会执行DOM查找。它将由虚拟dom补丁程序管理。

答案 1 :(得分:3)

does ref perform a DOM lookup each time?

简短的回答是

这是我粗略的理解:(如果我错了,请纠正我)

Vue使用虚拟DOM。在Vue中,真实DOM的虚拟表示是VNode。 Vue首先根据模板和脚本创建VNode。之后,Vue将虚拟DOM(包含所有VNode的树)与真实DOM进行比较。如果真实和虚拟DOM之间存在差异, Vue使用document.createElement(或其他DOM创建函数)创建DOM元素。 document.createElement返回指向实际DOM元素的指针。在将元素附加到显示之前,指针将保存到Vnode.elm每当创建/更新/销毁Vnode时,Vue都会检查ref属性并将this.$refs.refname设置为Vnode.elm }。

换句话说,从来没有DOM查找。 Vnode已经包含指向真实DOM元素的指针。当您使用ref时,Vue只会将现有的DOM指针分配给$refs

答案 2 :(得分:0)

引用已注册一次并缓存在$refs对象中。你可以直接使用它们,没问题。