vue中的 ref 和 $refs

举报
青年码农 发表于 2022/08/24 23:46:06 2022/08/24
【摘要】 相信前端开发或者后端开发都用过jquery,因为不是数据驱动,为了获取某些元素的value值,都操作过Dom元素。 // 使用Jquery获取Dom元素值$("#id").text('xxx')  $("#id").value('xxx')  // 使用原生D...

相信前端开发或者后端开发都用过jquery,因为不是数据驱动,为了获取某些元素的value值,都操作过Dom元素。


   
  1. // 使用Jquery获取Dom元素值
  2. $("#id").text('xxx')  
  3. $("#id").value('xxx')  
  4. // 使用原生Dom
  5. document.getElementById("id")  
  6. document.getElementsByClassName("className")

都经历过被Dom操作支配的恐惧,现在很多框架也都帮我们完成了这部分操作,我们不用再去子元素、父元素,只负责数据逻辑即可,如Vue,但是如果我们在某些条件下,依然需要操作Dom时,怎么办呢?Vue提供了ref、$ref。本次,我们就详细讲讲这两个属性。

1.ref

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


   
  1. <!-- `vm.$refs.p` will be the DOM node -->
  2. <p ref="p">hello</p>
  3. <!-- `vm.$refs.child` will be the child component instance -->
  4. <child-component ref="child"></child-component>

1)作用于html标签


   
  1. <template>
  2.   <div class="about">
  3.     <div ref="userName">{{ username }}</div>
  4.     <button @click="clickBtn">点击</button>
  5.   </div>
  6. </template>
  7. <script>
  8. export default {
  9.   data() {
  10.     return { username: "测试" };
  11.   },
  12.   methods: {
  13.     clickBtn() {
  14.       console.log(this.$refs.userName);
  15.     }
  16.   }
  17. };
  18. </script>

509f3543e86d1323858e3d9ed61fb538.png

点击按钮,我们可以拿到绑定的Dom

2)作用于组件

子组件


   
  1. <template>
  2.     <div>{{msg}}</div>
  3. </template>
  4. <script>
  5. export default {
  6.   data() {
  7.     return {
  8.       msg: '我是子组件'
  9.     }
  10.   },
  11.   methods: {
  12.     changeMsg() {
  13.       this.msg = '变身'
  14.     }
  15.   }
  16. }
  17. </script>

父组件


   
  1. <template>
  2.   <div @click="parentMethod">
  3.     <children ref="children"></children>
  4.   </div>
  5. </template>
  6. <script>
  7. import children from 'components/children.vue'
  8. export default {
  9.   components: { 
  10.     children 
  11.   },
  12.   data() {
  13.     return {}
  14.   },
  15.   methods: {
  16.     parentMethod() {
  17.       //返回一个对象
  18.       this.$refs.children  
  19.       // 调用children的changeMsg方法
  20.       this.$refs.children.changeMsg() 
  21.     }
  22.   }
  23. }
  24. </script>

这种方式我们可以通过$refs直接调用子组件方法

2.$refs

一个对象,持有注册过 ref attribute 的所有 DOM 元素和组件实例。


   
  1. <template>
  2.   <div class="about">
  3.     <div ref="userName">{{ username }}</div>
  4.     <div ref="age">{{ age }}</div>
  5.     <button @click="clickBtn">点击</button>
  6.   </div>
  7. </template>
  8. <script>
  9. export default {
  10.   data() {
  11.     return {
  12.       username: "测试",
  13.       age: 11
  14.     };
  15.   },
  16.   methods: {
  17.     clickBtn() {
  18.       console.log(this.$refs);
  19.     }
  20.   }
  21. };
  22. </script>

b8474f520beee540ab72e0013576d9c3.png

可以看到是个对象,里边包含了我们的定义的两个,可以通过下面方式,获取Dom实例进行后续操作。


   
  1. this.$refs.userName
  2. this.$refs.age

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

文章来源: blog.csdn.net,作者:NMGWAP,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/NMGWAP/article/details/125067039

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。