vue里ref ($refs)用法

「爱情、让人受尽委屈。」 2022-11-20 09:44 340阅读 0赞

在项目里经常用到ref操作DOM元素或者调用子组件的方法(啥也不知道,啥都敢用),但是并不明确ref的原理,通过看官网API和各位大佬的总结终于get啦啦!!做个记录。

ref 官网API : https://cn.vuejs.org/v2/api/#ref
$refs 官网API : https://cn.vuejs.org/v2/api/#vm-refs

ref 被用来给元素或子组件注册引用信息。引用信息将会注册在父组件的 $refs 对象上。如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素;如果用在子组件上,引用就指向组件实例。

1. DOM 元素

在普通的 DOM 元素上使用,引用指向的就是 DOM 元素。

  1. <template>
  2. <div id="app">
  3. <ul ref="refUl">
  4. <li v-for="item in number" ref="refLi">{ { item}}</li>
  5. </ul>
  6. </div>
  7. </template>
  8. <script>
  9. export default {
  10. name: 'app',
  11. data(){
  12. return{
  13. number:['1111','222','3333'],
  14. }
  15. },
  16. created(){
  17. this.$nextTick(()=> {
  18. console.log(this.$refs.refLi)
  19. console.log(this.$refs.refUl)
  20. })
  21. console.log(this.$refs.refLi) //undefined
  22. console.log(this.$refs.refUl) //undefined
  23. }
  24. }
  25. </script>

打印结果:
打印结果

注意:
  1. 注册时间说明:因为 ref 本身是作为渲染结果被创建的,在初始渲染的时候你不能访问它们 - 它们还不存在!
    ref 需要在dom渲染完成后才会有,在使用的时候确保dom已经渲染完成。
    比如在生命周mounted(){} 钩子中调用,或者在this.$nextTick(()=>{}) 中调用。
  2. 当 v-for 用于元素或组件的时候,引用信息将是包含 DOM 节点或组件实例的数组。
  3. 当 ref 和 v-for 一起使用的时候,你得到的 ref 将会是一个包含了对应数据源的这些子组件的数组。
    ( 简单理解:如果ref 是循环出来的,有多个重名,那么ref的值会是一个数组 ,此时要拿到单个的ref 只需要循环就可以了。)

2. 子组件

如果用在子组件上,引用就指向组件实例。

访问子组件实例或子元素官方文档

官网示例:实现父级组件调用方法聚焦 < helloWorld >里的输入框
父组件

  1. <template>
  2. <div id="app">
  3. <HelloWorld ref="helloWorld"/>
  4. </div>
  5. </template>
  6. <script>
  7. import HelloWorld from './components/HelloWorld.vue'
  8. export default {
  9. name: 'app',
  10. components: {
  11. HelloWorld
  12. },
  13. created(){
  14. this.$nextTick(()=> {
  15. console.log(this.$refs.helloWorld)
  16. this.$refs.helloWorld.focus()
  17. })
  18. }
  19. }
  20. </script>

子组件

  1. <template>
  2. <div class="hello">
  3. <input ref="input">
  4. </div>
  5. </template>
  6. <script>
  7. export default {
  8. methods: {
  9. // 用来从父级组件聚焦输入框
  10. focus: function () {
  11. this.$refs.input.focus()
  12. }
  13. }
  14. }
  15. </script>

打印结果:
打印结果

注意:
  1. $refs 只会在组件渲染完成之后生效,并且它们不是响应式的。这仅作为一个用于直接操作子组件的“逃生舱”——你应该避免在模板或计算属性中访问 $refs。

发表评论

表情:
评论列表 (有 0 条评论,340人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Vueref和:ref

    前者代表字符串xxx,后者代表变量xxx。 不加冒号表示后面是个字符串,否则表示后面是个js表达式。 ![在这里插入图片描述][watermark_type_ZmFuZ3

    相关 Vueref属性与refs

    ref 被用来给DOM元素或子组件注册引用信息。引用信息会根据父组件的 $refs 对象进行注册。如果在普通的DOM元素上使用,引用信息就是元素; 如果用在子组件上,引用信息