Vue2-父子组件传值

article/2025/11/9 5:38:28

在日常开发中,我们经常会在一个组件中嵌套另外一个组件,那么如果我们父组件要向子组件传值该怎么办?子组件向父组件通信又该怎么办?本文将详细举例说明这些问题。

父向子通信

问题描述

现在我们有个需求,我们要分别显示父和子的信息,我们当然可以在一个组件中直接显示全部信息,但是万一以后又来一个需求:我们要在母和子的信息,那其实这里就存在冗余了,所以我们把子组件单独封装成一个新的组件。那么这里就会出现一个问题,子组件的信息该如何从父组件传过去呢?

解决方案

使用vue提供的prop属性,下面边看代码边分析:
父组件定义

<template><div class="father">这里是父组件,我们会在这里展示父的信息{{ fatherName }}{{ fatherAge }}<son/></div>
</template><script>import son from "@/components/son";export default {name: "father",components: {son},data() {return {fatherName: "张三",fatherAge: 12}}}
</script>
<style lang="css">.father{border: 1px solid black;}
</style>

子组件定义

<template><div class="son">这里是子组件,我们会在这里展示子的信息</div>
</template><script>export default {name: "son"}
</script><style scoped>.son{margin: 10px;border: 1px solid red;}
</style>

使用:attribute属性向子组件传入值

<template><div class="father">这里是父组件,我们会在这里展示父的信息{{ fatherName }}{{ fatherAge }}<son :sonInfo="sonInfo"/></div>
</template><script>
import son from "@/components/son";export default {name: "father",components: {son},data() {return {fatherName: "张三",fatherAge: 12,sonInfo: {sonName: "王小虎",sonAge: 6}}}
}
</script>
<style lang="css">
.father {border: 1px solid black;
}
</style>

子组件通过props属性接收父组件传过来的值,这里的名字要和父组件传的值对应

<template><div class="son">这里是子组件,我们会在这里展示子的信息{{ sonInfo.sonName }}{{ sonInfo.sonAge }}</div>
</template><script>
export default {name: "son",props: ["sonInfo"]
}
</script><style scoped>
.son {margin: 10px;border: 1px solid red;
}
</style>

测试
在这里插入图片描述

扩展

上述的例子解决了父子组件传值的基本问题,当然prop的用法还有很多,我们可以在vue2官网上看到

Prop的大小写

camelCase (驼峰命名法) 的 prop 名需要使用其等价的 kebab-case (短横线分隔命名) 命名

Vue.component('blog-post', {// 在 JavaScript 中是 camelCase 的props: ['postTitle'],template: '<h3>{{ postTitle }}</h3>'
})
<!-- 在 HTML 中是 kebab-case 的 -->
<blog-post post-title="hello!"></blog-post>

Prop 类型

我们之前使用以字符串数组形式列出的 prop

 props: ["sonInfo"]

我们也可以给每一个prop指定对应的值

props: {title: String,//字符串likes: Number,//数字isPublished: Boolean,//布尔commentIds: Array,//数组author: Object,//对象callback: Function,//函数contactsPromise: Promise //异步延迟对象
}

传递静态或动态 Prop

之前我们传递的是动态的Prop,可以动态赋值

 <son :sonInfo="sonInfo"/>

我们也可以传递静态的

<son :sonInfo="sonInfo" sex="1"/>
  props: ["sonInfo", "sex"]

单向数据流

所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外变更父级组件的状态,从而导致你的应用的数据流向难以理解。
额外的,每次父级组件发生变更时,子组件中所有的 prop 都将会刷新为最新的值。这意味着你应该在一个子组件内部改变 prop。如果你这样做了,Vue 会在浏览器的控制台中发出警告。

官方这段话表明了,我们对于父组件传过来的值最不要直接修改,官方例举了两个常用的变更案例
1.这个 prop 用来传递一个初始值;这个子组件接下来希望将其作为一个本地的 prop 数据来使用

props: ['initialCounter'],
data: function () {return {counter: this.initialCounter}
}

2.这个 prop 以一种原始的值传入且需要进行转换

props: ['size'],
computed: {normalizedSize: function () {return this.size.trim().toLowerCase()}
}

类型校验

之前我们使用字符串数组形式列出的 prop,父组件不知道子组件prop值的类型,可能传值的时候传错,所以我们可以给值指定类型。如果有一个需求没有被满足,则 Vue 会在浏览器控制台中警告你

Vue.component('my-component', {props: {// 基础的类型检查 (`null` 和 `undefined` 会通过任何类型验证)propA: Number,// 多个可能的类型propB: [String, Number],// 必填的字符串propC: {type: String,required: true},// 带有默认值的数字propD: {type: Number,default: 100},// 带有默认值的对象propE: {type: Object,// 对象或数组默认值必须从一个工厂函数获取default: function () {return { message: 'hello' }}},// 自定义验证函数propF: {validator: function (value) {// 这个值必须匹配下列字符串中的一个return ['success', 'warning', 'danger'].includes(value)}}}
})

当 prop 验证失败的时候,(开发环境构建版本的) Vue 将会产生一个控制台的警告

子向父通信

问题描述

既然父可以向子传值,那么子是否可以通信父呢?当然可以,这时候我们要借助vue的 e m i t 和 emit和 emiton,下面我们看代码:

解决方案

子组件

<template><div class="son">这里是子组件<button @click="emit">使用emit向父组件通信</button></div>
</template><script>
export default {name: "son",methods:{emit(){this.$emit('sayHi',"tom")}}
}
</script><style scoped>
.son {margin: 10px;border: 1px solid red;
}
</style>

父组件

<template><div class="father">这里是父组件<son sex="1" @sayHi="sayHi"/></div>
</template><script>
import son from "@/components/son";export default {name: "father",components: {son},data() {return {}}, methods: {sayHi(name) {console.log("sayHi:"+name)}}
}
</script>
<style lang="css">
.father {border: 1px solid black;
}
</style>

测试
点击按钮,控制台输出sayHi tom

分析

这里首先介绍一下vue提供的两个重要函数emit和on

on

监听当前实例上的自定义事件。事件可以由 $emit 触发。回调函数会接收所有传入事件触发函数的额外参数。
上述例子的 @sayHi="sayHi"就是在监听sayHi事件,这里采用了简写形式,完整形式是v-on:sayHi=“sayHi”,我们平时用的比较多的就是监听点击事件,而这里我们就是监听了我们自定义的事件

emit

触发当前实例上的事件。附加参数都会传给监听器回调。
当我们监听了自定义事件,我们就可以在子组件中触发事件,this.$emit(‘sayHi’,“tom”),这样就会调用监听的回调函数,并且将附加参数tom传入回调函数

非父子通信

除了上述的父子组件通信,我们最后还可以在非父子组件之间传值,某些场景下会用到。下面看代码:
事件总线

import Vue from "vue";
export default new Vue;

组件B

<template><div>组件B{{ value }}</div>
</template><script>
import bus from "@/components/bus";export default {name: "ComponentB",data() {return {value: "oldVal"}}, created() {bus.$on("changeVal", newVal => {this.value = "newVal"})}
}
</script><style scoped></style>

组件A

<template><div>组件A<button @click="communicate">组件A->组件B</button></div>
</template><script>
import bus from "@/components/bus";
export default {name: "ComponentA",methods:{communicate(){bus.$emit("changeVal","newVal")}}
}
</script><style scoped></style>

测试
组件B的值由oldVal->newVal

分析

这里引入了事件总线(event bus)的概念,事件总线:事件发送者将事件消息发送到一个事件总线上,事件订阅者向事件总线订阅和接收事件,然后再处理接收到的事件
而我们这里的事件总线的载体就是一个Vue的实例对象,因为在emit和on都是Vue的一个实例方法。
当然我们还可以使用$attrs / listeners来实现类似效果,这里就不多做介绍了,有兴趣的读者可以自行了解
但是如果学过Vuex的话,利用Vuex来传值会很方便,Vuex之后会慢慢讲,不急。学习是个漫长的过程,慢慢来

由于作者能力有限,若有错误或者不当之处,还请大家批评指正,一起学习交流!


http://chatgpt.dhexx.cn/article/8Xu7GC5v.shtml

相关文章

Vue父子组件传值的方法

1.父向子传值props 父组件&#xff1a;<child :inputName"name"> 子组件&#xff1a; &#xff08;1&#xff09;props: { inputName: String, required: true } &#xff08;2&#xff09;props: ["inputName"] 2.子组件向父组件传值$emit 子组…

Vue中父子组件传值的多种方式

vue中父子组件传值 vue中的父子组件传值&#xff0c;值得注意的是要遵守单向数据流原则。所谓单向数据流原则&#xff0c;简单的说就是父组件的数据可以传递给子组件&#xff0c;子组件也可以正常获取并使用由父组件传过来的数据&#xff1b;但是&#xff0c;子组件中不能直接修…

vue父子组件传值

记录一下项目中遇到的问题。 因为一个流程对应一种单据&#xff0c;所以每次点击单据详情&#xff0c;应该出现相应的单据内容。在另一个页面&#xff0c;也需要调用这个单据内容。 因为vue不能直接调用弹出框&#xff0c;所以老师把单据内容写成了组件&#xff0c;在另一个页…

Vue中父子组件如何传值

关键词&#xff1a;props、$emit()、绑定的数据和事件 文章目录 前言一、将子组件引入父组件二、父组件如何传值给子组件三、子组件如何接收父组件传过来的值并使用(props)四、子组件如何传值给父组件($emit)五、父组件使用子组件传过来的值总结 前言 提示&#xff1a;这里可以…

父子组件之间的传值

&#xff08;1&#xff09;子组件给父组件传值 子组件 &#xff08;1.1&#xff09;子组件Child.vue&#xff0c;在button按钮上通过点击passToparent事件&#xff0c;在子传父的this.$emit方法上自定义事件名&#xff0c;以及需要传递的值&#xff08;可以是数组、对象、字符…

父子组件传值

1.父组件——子组件 想象一下&#xff0c;父子组件传值&#xff0c;就类似于父亲给儿子东西&#xff0c;父亲给儿子的东西要有名字吧&#xff0c;名字就是属性&#xff0c;父亲给儿子东西&#xff0c;儿子要用手接过来&#xff0c;那手就相当于子组件里的props。 用个例子来更…

组件之间父子组件传值

组件之间父子组件传值 在components新建父组件和子组件 在父组件里引入子组件 子组件接收父组件中的数据,用props 在子类props里定义接收的参数 在子组件标签上引用 然后在父组件写上准备传递的参数 子组件拿到父组件的背景颜色,就会去覆盖默认的背景颜色

Stanford UFLDL教程 独立成分分析

独立成分分析 Contents [hide] 1概述2标准正交ICA3拓扑ICA4中英文对照5中文译者 概述 试着回想一下&#xff0c;在介绍 稀疏编码算法中我们想为样本数据学习得到一个超完备基&#xff08;over-complete basis&#xff09;。具体来说&#xff0c;这意味着用稀疏编码学习得到…

降维算法原理篇:主成分分析PCA、奇异值分解SVD、因子分析法FA、独立成分分析ICA等原理详推

前言&#xff1a;若需获取本文全部的手书版原稿资料&#xff0c;扫码关注公众号&#xff0c;回复: 降维算法综述 即可获取。 原创不易&#xff0c;转载请告知并注明出处&#xff01;扫码关注公众号【机器学习与自然语言处理】&#xff0c;定期发布知识图谱&#xff0c;自然语言…

独立成分分析算法(ICA)

ICA算法 考虑这样的一个问题,叫做”鸡尾酒派对问题”。这里&#xff0c;在派对上&#xff0c;有n个说话的人单独地说话&#xff0c;并且所有在房间里的麦克分只能收到n个说话人的重叠的声音。但是我们说有n个不同的麦克分位于房间里&#xff0c;因为每个麦克分距离每个说话者的…

独立成分分析(ICA)降噪应用时存在哪些问题?

关注“心仪脑”查看更多脑科学知识的分 关键词&#xff1a;降噪、ICA 对经常处理脑电信号的朋友来说&#xff0c;降噪是必不可少的环节。眼动、眨眼、肌肉运动、脉搏等噪声会严重污染脑电&#xff0c;严重影响脑电的后续分析。2001年提出的FastICA算法使ICA可以真正稳定地分析…

因子分析_主成分分析_独立成分分析_斯坦福CS229_学习笔记

Part VIII 因子分析 主成分分析 独立成分分析 在上个部分介绍了EM算法&#xff0c;在此部分因子分析中&#xff0c;我们会再次应用到。 因子分析、主成分分析和独立成分分析都作为对于数据维度进行处理的手段&#xff0c;对于我们理解数据、更好的表示数据都起到或多或少的作用…

Python专栏 | 独立成分分析(ICA)的实例应用:消除伪影信号

关注微信公众号&#xff1a;脑机接口研习社 了解脑机接口最近进展 系列文章目录 Python专栏 | 脑电图和脑磁图(EEG/MEG)的数据分析方法之载入数据 Python专栏 | MNE脑电数据(EEG/MEG)可视化 Python专栏 | MNE数据预处理方法——独立成分分析 持续更新中…… 文章目录 系列文…

【医学信号处理与MATLAB(5)】独立成分分析法-ICA

接着上一节PCA的内容&#xff0c;我们来谈一下ICA为何同样重要。 目录 引入&#xff1a;鸡尾酒会问题独立成分分析法中心极限定理中心极限定理的MATLAB代码实现 测量非高斯程度(Kurtosis峰度)独立成分分析法处理流程使用FASTICA找出独立成分MATLAB代码实现 引入&#xff1a;鸡…

ICA独立成分分析去除EEG伪影

目录 介绍ICA假设方法组件投影实验数据样本移除眨眼和肌肉伪影一些严重污染的脑电数据 本分享为脑机学习者Rose整理发表于公众号&#xff1a;脑机接口社区 .QQ交流群1&#xff1a;903290195(已满&#xff0c;请加群2)&#xff0c;群2&#xff1a;941473018 介绍 眼动&#x…

fMRI独立成分分析方法(ICA)工具GIFT

软件下载连接&#xff1a; Software - TReNDS (trendscenter.org)https://trendscenter.org/software/下载完成后&#xff0c;在MATLAB中添加其路径即可。 在MATLAB命令行输入gift。打开窗口页面&#xff1a; 1、点击setup ICA Analysis 新建一个gica文件夹&#xff0c;存储…

《大话脑成像》之:独立成分分析

少年&#xff0c;我看你骨骼精奇&#xff0c;是万中无一的武学奇才&#xff0c;维护世界和平就靠你了&#xff0c;我这有本武林秘籍《九阴真经之万军丛中听声辩位分筋错骨取敌将首级之盲源分离大法》&#xff0c;简称&#xff0c;《独立成分分析》&#xff0c;见与你有缘&#…

独立成分分析(Independent Component Analysis,ICA)模型介绍

独立成分分析ICA模型 1 历史背景2 ICA基本模型3 独立与不相关 \qquad 1 历史背景 \qquad 独立成分分析思想和方法最早源于上世纪八十年代几个法国学者的研究工作,尽管当时他们并没有命名其为ICA&#xff1b;在1986年举行的神经网络计算会议上&#xff0c;法国学者Heraull和Jutt…

【详细版】独立成分分析:算法和应用(一)

独立成分分析&#xff1a;算法和应用 翻译原文自己的理解 原文&#xff1a;Independent component analysis: algorithms and applications 作者&#xff1a;A. Hyvarinen, E. Oja 时间&#xff1a;2000年 注&#xff1a;详细版原文太长&#xff0c;分两篇来写&#xff1b;另外…

Python专栏 | MNE数据预处理方法——独立成分分析

关注微信公众号&#xff1a;脑机接口研习社 了解脑机接口最近进展 系列文章目录 Python专栏 | 脑电图和脑磁图(EEG/MEG)的数据分析方法之载入数据 Python专栏 | MNE脑电数据(EEG/MEG)可视化 文章目录 系列文章目录预处理&#xff08;Preprocessing&#xff09; 预处理&#x…