Vue前端开发子组件向父组件传参

张裕  金牌会员 | 2024-11-22 03:30:29 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 566|帖子 566|积分 1698

在父组件中,如果必要获取子组件中的数据,有两种方式,一种是在子组件中自定义事件,父组件绑定该事件,当触发自定义事件时,向父组件传入参数;另一种是先通过ref属性给子组件命名,然后在父组件中就可以调用$refs对象,访问命名的子组件中数据。
子组件自定义事件传参

父组件通过绑定子组件中自定义的事件,在触发的事件中,获取传入的数据,这种方式是子组件向父组件传参的紧张方式,接下来通过一个实例来演示它实现的过程。
实例7-2 子向父组件传参
1. 功能描述

在实例7-1的底子之上,向子组件的视图中添加一个“长度”按钮,当点击该按钮时,获取父组件传入数据的长度,并通过自定义的事件,将该长度值传递给父组件,父组件接收该值后,显示在页面中。
2. 实现代码

在项目标components 文件夹中,添加一个名为“Parent”的.vue文件,该文件的保存路径是“components/ch7/part2/”,在文件中到场如清单7-3所示代码。
代码清单7-3 Parent.vue代码
  1. <template>
  2.     <div class="iframe">
  3.         <div class="i-left">
  4.             <span>父组件:</span>
  5.             <input v-model="name" placeholder="请输入用户名" />
  6.         </div>
  7.         <div class="i-right">
  8.             {{ len }}
  9.         </div>
  10.     </div>
  11.     <!-- 在父组件中调用子组件 -->
  12.     <Child :inputName="name" @getLength="onGetLength" />
  13. </template>
  14. <script>
  15. import Child from "./Child.vue"
  16. export default {
  17.     data() {
  18.         return {
  19.             name: "",
  20.             len: 0
  21.         }
  22.     },
  23.     components: {
  24.         Child
  25.     },
  26.     methods: {
  27.         onGetLength(data) {
  28.             this.len = data
  29.         }
  30.     }
  31. }
  32. </script>
  33. <style>
  34. .iframe {
  35.     width: 300px;
  36.     display: flex;
  37.     justify-content: space-between;
  38.     align-items: center;
  39.     padding: 8px;
  40.     border: solid 1px #ccc;
  41. }
  42. .i-left {
  43.     display: flex;
  44.     align-items: center;
  45. }
  46. .iframe input {
  47.     padding: 8px;
  48. }
  49. .iframe:last-child {
  50.     border-top: none;
  51.     padding: 16px 8px;
  52.     background-color: #eee;
  53. }
  54. </style>
复制代码
在父组件中,导入并注册了一个名称为Child的子组件,它的功能是通过自定义的事件向父组件传递数据,并将该数据显示在视图模块中,它的代码如清单7-4所示。
代码清单7-4 Child.vue代码
  1. <template>
  2.     <div class="iframe">
  3.         <div class="i-left">
  4.             <span>子组件:</span>
  5.             <span>{{ inputName }}</span>
  6.         </div>
  7.         <div class="i-right">
  8.             <button @click="onGetLength">长度</button>
  9.         </div>
  10.     </div>
  11. </template>
  12. <script>
  13. export default {
  14.     props: {
  15.         inputName: {
  16.             type: String,
  17.             required: true
  18.         }
  19.     },
  20.     emits: ["getLength"],
  21.     methods: {
  22.         onGetLength() {
  23.             this.$emit("getLength", this.inputName.length)
  24.         }
  25.     }
  26. }
  27. </script>
复制代码
3. 页面效果

保存代码后,页面在Chrome浏览器下实行的页面效果如图7-3所示。

4. 源码分析

在子组件Child的源码中,为了能向父组件传递参数,先在“emits”选项中定义一个名为“getLength”的事件,当点击“长度”按钮时,实行该事件,同时,将inputName数据的长度值作为事件携带的参数。
在父组件Parent的源码中,为了能接收到子组件传入的参数,则在调用子组件时,绑定自定义的“getLength”事件,并在事件实行时,获取携带的参数值,并将该值作为变量,绑定到视图的元素中,从而最终实现子组件向父组件传参的过程。
必要说明的是:自定义事件携带的参数可以是一个变量,也可以是一个对象,如果必要传递多项数据,则可以借助对象的形式向父组件传递。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张裕

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表