Vue中$refs的理解
$refs
是一个对象,持有注册过ref attribute
的所有DOM
元素和组件实例。
描述
ref
被用来给元素或子组件注册引用信息,引用信息将会注册在父组件的$refs
对象上,如果在普通的DOM
元素上使用,引用指向的就是DOM
元素,如果用在子组件上,引用就指向组件实例,另外当v-for
用于元素或组件的时候,引用信息将是包含DOM
节点或组件实例的数组。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| <!DOCTYPE html> <html> <head> <title>Vue</title> </head> <body> <div id="app"> <div ref="node">Node</div> <layout-div ref="layout"></layout-div> <div v-for="i in 3" :key="i" ref="nodearr">{{i}}</div> </div> </body> <script src="https://cdn.bootcss.com/vue/2.4.2/vue.js"></script> <script type="text/javascript"> Vue.component("layout-div", { data: function(){ return { count: 0 } }, template: `<div> <div>{{count}}</div> </div>` })
var vm = new Vue({ el: '#app', mounted: function(){ console.log(this.$refs.node); console.log(this.$refs.layout); console.log(this.$refs.nodearr); } }) </script> </html>
|
因为ref
本身是作为渲染结果被创建的,在初始渲染的时候是不能访问的,因为其还不存在,而且$refs
也不是响应式的,因此不应该试图用它在模板中做数据绑定,在初始化访问ref
时,应该在其生命周期的mounted
方法中调用,在数据更新之后,应该在$nextTick
方法中传递回调操作来获取元素或实例,此外一般不推荐直接操作DOM
元素,尽量使用数据绑定让MVVM
的ViewModel
去操作DOM
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| <!DOCTYPE html> <html> <head> <title>Vue</title> </head> <body> <div id="app"></div> </body> <script src="https://cdn.bootcss.com/vue/2.4.2/vue.js"></script> <script type="text/javascript">
var vm = new Vue({ el: '#app', data: function(){ return { msg: 0 } }, template: `<div> <div ref="node">{{msg}}</div> <button @click="updateMsg">button</button> </div>`, beforeMount: function(){ console.log(this.$refs.node); }, mounted: function(){ console.log(this.$refs.node); }, methods: { updateMsg: function(){ this.msg = 1; console.log(this.$refs.node.innerHTML); this.$nextTick(() => { console.log(this.$refs.node.innerHTML); }) } } }) </script> </html>
|
``
参考
1 2 3
| https://cn.vuejs.org/v2/api/#ref https://zhuanlan.zhihu.com/p/50638655 https://juejin.im/post/5da58c54e51d4524e207fb92
|