你知道Vue平行组件或任意组件间的通信方式吗?

491 阅读1分钟

「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战

在之前的文章中,我们介绍了父子通信和子父通信,详情可以移动到对应的文章:

今天我们将任意组件之间的通信方式

任意间的通信需要时借助事件调渡器var Event = new Vue(),

大概思路是:

通过一个组件触发一个事件并传递通信相关的数据,在另外一个组件里监听该事件的触发并处理接收相关数据。

注意,调度器必须写在mounted之前,其实就是调度器声明赋值要写在调度器使用前。

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>demo</title>
</head>
<body>
	<div id="app">
		<alice></alice>
		<br><br>
		<tom></tom>
	</div>

<script src="vue.js"></script>
<script type="text/javascript">	
	var Event = new Vue();
	
	Vue.component('alice',{
		template:`<div>
				My name is alice:<br>
				<input type="text" v-model="i_say" @keyup="onChanged"><br>
				I say:{{i_say}}
			</div>`,
		data:function(){
			return {
				i_say:'',
			}
		},
		methods:{
			onChanged:function(){
				Event.$emit('alice-say-something',this.i_say);//触发一个事件,并传递数据。可以在其他组件监听该事件
			}
		}
	});
	Vue.component('tom',{

		template:`<div>
				My name is tom:<br>
				alice say:{{aliceSay}}
			</div>`,
		data:function(){
			return {
				aliceSay:'',
			}
		},
		// mounted表示组件挂载完毕的时候,初始化完毕是。可以在这监听看看其他组件说了什么。
		// mounted也叫生命周期的钩子,可以理解为生命周期里的一些关键节点,就像关键帧 里程碑一样。
		//
		mounted:function(){
			var temp = this;
			Event.$on('alice-say-something',function(data){//注意是事件的调度器来监听
				console.log(111);
				temp.aliceSay = data;
			});//监听其他组件的事件
		}
	});
	var vm = new Vue({
		el:'#app'
	});
	
</script>
</body>
</html>

如上代码, 使用一个事件的调渡器来将两个组件的数据联系在一起,如上两个数据i_say和aliceSay

任意组件间的通信的核心是要有一个中间的事件调度器,用来关联两个数据。在一个组件中通过emit来触发事件,并传递数据,我们在另外的一个组件中通过emit来触发事件,并传递数据,我们在另外的一个组件中通过on来监听事件并接受数据。