VUE项目中的父子,兄弟组件之间的传值。

本文详细介绍了Vue项目中父子、兄弟组件间的传值方法,包括父传子的props、子传父的$emit、父子组件双向通信及兄弟组件间通过事件总线通信的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

VUE项目中的父子,兄弟组件之间的传值。

首先说一下父子组件就是在一个vue文件中引入另一个vue文件,被引入vue文件就是子组件,引入vue文件的vue文件就是父组件。而在父组件中是不能直接调用子组件中的变量值的。下面详细说一下,父子组件之间怎么传值。
·
·
·
情况一:父组件给子组件传值方法,使用props

1 组件中的 所有props 中的数据,都是通过父组件传递给子组件的
2 props 中的数据都是只读的,无法重新赋值  

这是关于props具体使用:
https://www.cnblogs.com/planetwithpig/p/11653732.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>父传字</title>
    <script src="../js/vue.js"></script>
  </head>

  <div id="app">
    <my-com :parent-msg="msg"></my-com>
  </div>

  <body>
    <script>
      var vm = new Vue({
        el: "#app",
        data: {
          msg: "123 啊 父组件中的数据"
        },
        methods: {},
        components: {
          MyCom: {
            data() {
              return {
                title: "123",
                content: "qqq",
				comsVal:''
              };
            },
            template: '<h1 @click="change">这是子组件----{{parentMsg}}</h1>',
            props: ["parentMsg"],
            methods:{
                change(){ 
					comsVal =this.parentMsg
					console.log(comsVal)
                }
            },
			 
          }
        }
      });
    </script>
  </body>
</html>

·
·
·
情况二:子组件要给父组件传值方法,使用$emit

第一步:父组件向子组件传递方法,使用事件绑定机制 v-on,自定义一个事件属性,传递给子组件
第二步:在子组件中定义一个方法,在方法中,利用  $emit  触发 父组件传递过来的,挂载在当前实例上的事件,还可以传递参数
第三步:在子组件中调用定义的那个方法,就可以触发父组件传递过来的方法了
<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8" />
		<title>子组件要给父组件传值方法,使用$emit</title>
		<script src="../js/vue.js"></script>
	</head>

	<div id="app">
		<!-- 事件绑定机制,传递给子 -->
		<my-com @func="funshow"></my-com>
	</div>
	<template id="tmpl">
		<div>
			这是子组件
			<input type="button" value="这是子组件的按钮,触发了父传来的" @click="myclick" />
		</div>
	</template>

	<body>
		<script>
			var MyCom = {
				template: "#tmpl",
				data() {
					return {
						sonmsg: {
							name: "小头儿子",
							age: 3
						}
					};
				},
				methods: {
					myclick() {
						//  console.log("ok")
						this.$emit("func", this.sonmsg);
					}
				}
			};

			var vm = new Vue({
				el: "#app",
				data: {
					datamsgFromson: null
				},
				methods: {
					funshow(data) {
						// console.log("调用了父组件身上的show方法====" + data1 + data2);
						console.log("调用了父组件身上的show方法====" + data);
						this.datamsgFromson = data;
						console.log(data);
					}
				},
				components: {
					MyCom
				}
			});
		</script>
	</body>
</html>

·
·
·
情况三:父子组件之间相互传值

<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8" />
		<title>父子组件之间相互传值</title>
		<script src="../js/vue.js"></script>
	</head>

	<div id="app"> 
		<!-- 父组件 -->
		<Button type="primary" @click="getData">获取数据</Button>
		<my-com :fdata="data1" :fmessage="data2" @show="showFather"></my-com>
		<!-- fdata :fmessage 注意驼峰法改为横杆--> 
	</div>
	<template id="tmpl">
		<div>
			<h1>子组件</h1>
			<p>下面是父组件传过来的数据</p>
			<p>第一个数据:{{fdata}}</p>
			<p>第二个数据:{{fmessage}}</p>
			<Button type="primary" @click="sonClick">触发父组件方法</Button>
		</div>
	</template>

	<body>
		<script>
			var MyCom = {
				template: "#tmpl",
				props: ['fdata', 'fmessage'],
				data() {
					return { 
						sonMessage: '子组件数据sonMessage',
						sonData: '子组件数据sonData'
					};
				},
				methods: {
					sonClick() {
						console.log("子组件点击 调用@show==>",this.sonMessage, this.sonData) 
						this.$emit('show', this.sonMessage, this.sonData);
					}
				}
			}; 
			var vm = new Vue({
				el: "#app", 
				data: {
					data1: '父组件数据data1',
					data2: '父组件数据data2',
					fromson1: '',
					fromson2: ''
				},
				methods: { 
						showFather (a, b) {  
					      this.fromson1 = a;
					      this.fromson2 = b;
					      console.log('触发了父组件的方法' + '======' + a + '======' + b);
					    },
					    getData () {
						 console.log("调用方法-getData()")
					      console.log(this.fromson1);
					      console.log(this.fromson2);
					    }
				},
				components: {
					MyCom
				}
			});
		</script>
	</body>
</html>

·
·
·

情况四:兄弟组件之间相互传值——>通过 e m i t / emit/ emit/on

通过$emit/$on

这种方法通过一个空的 Vue 实例作为中央事件总线(事件中心),用它来触发事件和监听事件,巧妙而轻量地实现了任何组件间的通信,包括父子、兄弟、跨级
 
具体实现方式:
    var Event=new Vue();
    Event.$emit(事件名,数据);
    Event.$on(事件名,data => {});
<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8" />
		<title>兄弟组件之间相互传值</title>
		<script src="../js/vue.js"></script>
	</head>

	<div id="app">
		<my-a></my-a>
		<my-b></my-b>
		<my-c></my-c>
	</div>
	<template id="a">
		<div>
			<h3>A组件:{{nameA}}</h3>
			<button @click="send">将数据发送给C组件</button>
		</div>
	</template>
	<template id="b">
		<div>
			<h3>B组件:{{nameB}}</h3>
			<button @click="send">将数组发送给C组件</button>
		</div>
	</template>
	<template id="c">
		<div>
			<h3>C组件:{{nameA}}{{nameB}}</h3>
		</div>
	</template> 

	<body>
		<script>
			var Event = new Vue(); //定义一个空的Vue实例 
			var A = {
				template: '#a',
				data() {
					return {
						nameA: '组件A的数据'
					}
				},
				methods: {
					send() {
						Event.$emit('data-a', this.nameA);
					}
				}
			}
			var B = {
				template: '#b',
				data() {
					return {
					   nameB: '组件B的数据'
					}
				},
				methods: {
					send() {
						Event.$emit('data-b', this.nameB);
					}
				}
			}
			var C = {
				template: '#c',
				data() {
					return {
						nameA: '',
						nameB: ""
					}
				},
				mounted() { //在模板编译完成后执行
					Event.$on('data-a', nameA => {
						this.nameA = nameA;
						//箭头函数内部不会产生新的this,这边如果不用=>,this指代Event 
					})
					Event.$on('data-b', nameB => {
						this.nameB = nameB;
					})
				}
			}
			var vm = new Vue({
				el: '#app',
				components: {
					'my-a': A,
					'my-b': B,
					'my-c': C
				}
			});
		</script>
	</body>
</html>

·
·
版本二:

在utils文件夹下面定义一个bus.js,这样一个中央事件总线就定好了,里面内容就这两行:

import Vue from 'vue'
export const Event = new Vue() // 定义一个事件总线

传递方:

import { Event } from '../../utils/bus'  // 引入这个事件总线
export default {
  data() {
    userId: ''
  }
  watch: {
    userId() {  // 监听userId改变时触发事件,当然你可以在所有其他事件去触发$emit
      Event.$emit('changeUser', userId) // $emit接收参数,一个是触发的事件名,一个是携带的参数
    }
 }

接收方:

 import { Event } from '../../utils/bus' // 依然是把bus总线引进来
export default {
created() {
    Event.$on('changeSonRoute',showIndex => {  // $on接收发送方传给我们的数据
      console.log(showIndex)
    })
  }
}

·
·
·
·
·
·
·
··

外部参考链接:
https://www.imooc.com/article/257885
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值