三种简洁易行的方法解决基于Vue.js的组件通信

  在总结Vue组件化编程的数据通信方面,看了网上的很多资料,都是讲父子组件的数据交互也就是参数传递,在组件的通信方面分几种情况,比如父子组件、非父子的兄弟组件、非父子的其他组件等等,这样看来,基于Vue.js的组件通讯非常繁琐。

  可是我们在C/S下的组件通信并没有这些麻烦,通常情况下,我们怎样设计组件通信?

  在组件上声明事件,可以是截获系统事件的,也可以是自定义事件,在这个事件中,我们就可以对外进行数据通信。

  沿着这个思路,就可以解决Vue组件化编程的组件通信,很简单了。

  另外,在Windows中的消息队列中,我们也可以通过捕获事件的方式来得到组件的操作和数据,也同样可以实现Vue组件化编程的组件通信。

  最简单的,当然是组件中的数据直接对外进行数据绑定,这样也就可以实现组件通信了。

  所以总结基于Vue.js的组件通信,比较简单易用的三种方式:通过数据绑定与数据监听、通过组件的自定义函数(事件)、通过事件捕获

  下面针对这三种情况分别举例说明。

  用于演示的基本数据结构:

personList:[
    {name:'小明',score:97},
    {name:'小丽',score:88},
	{name:'小英',score:95},
]

  假设现在需要计算score的总和,并且总分也要随着这些分数值的变化而变化。

  1、通过数据绑定与数据监听

  首先,在Vue实例的data中定义用于计算总和的数据项total以及personList,再定义组件放置姓名和分数(input输入框),然后组件的数据项与personList绑定,最后监听personList数据变化就可以得到总和,并且每个input框的分数变化后总分也随之变化。

  完整网页代码:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>Vue.js的组件化编程:组件通信</title>
		<script src="./js/vue2.js"></script>
	</head>
	<body>
		<div id="app">
			<h2>人员表</h2>
			<my-person v-for="(p,index) in personList" :key="index" :my-person="personList[index]"></my-person>
			<p>总分:{{ total }}</p>
		</div>
		<script type="text/javascript">
			Vue.component("myPerson",{
				props:['myPerson'],
				template:`<div>
						姓名:{{ myPerson.name }}
						分数:<input type="number" v-model="myPerson.score"/>
					</div>`,
			});
			var vm=new Vue({
				el:"#app",
				data:{
					total:0,
					personList:[
						{name:'小明',score:97},
						{name:'小丽',score:88},
						{name:'小英',score:95},
					]
				},
				methods:{
					ScoreChange(){
						this.total = this.personList.reduce((prev, curr) => {
							return parseInt(prev) + parseInt(curr.score)
						}, 0)
					}
				},
				watch:{
					personList:{
						handler:'ScoreChange',
						deep:true,//深度监听
						immediate:true,//有初始值
            		}
				}
			});
		</script>
	</body>
</html>

  显示输出:

  2、通过组件的自定义函数(事件)

  直接叙述就是在组件的响应事件中调用其他组件的数据或者方法,不用区分父子关系。

  完整的代码示例:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>Vue.js的组件化编程:组件通信</title>
		<script src="./js/vue2.js"></script>
	</head>
	<body>
		<div id="app">
			<h2>人员表</h2>
			<my-person :my-name="'小明'" :my-score="'99'"  ref="S1"></my-person>
			<my-person :my-name="'小丽'" :my-score="'87'"  ref="S2"></my-person>
			<p>总分:{{total}}</p>
		</div>
		<script type="text/javascript">
			Vue.component("myPerson",{
				props:['myName','myScore'],
				data(){
					return {
							person:{
								name:"",
								score:0
							}
					}
				},
				mounted() {
					this.person.name=this.myName;
					this.person.score=this.myScore;
				},
				template:`<div>
						姓名:{{ person.name }}
						分数:<input type="number" v-model="person.score" @input="dataChange()"/>
					</div>`,
				methods:{
					dataChange(){
						this.$parent.total=parseInt(this.$parent.$refs.S1.person.score) + parseInt(this.$parent.$refs.S2.person.score);
					}
				}
			});
			var vm=new Vue({
				el:"#app",
				data:{
					total:0
				}
			});
		</script>
	</body>
</html>

  输出结果:

  说明:

  ⑴ 数据绑定可以在created或者mounted中进行;

  ⑵ 绑定的时候不能少写this,否则会提示找不到数据项;

  ⑶ 关键在事件中的处理,即this.$parent.$refs包含了组件数据,所以在放置组件的时候要写ref属性值(不能重复)。

  3、通过事件捕获

  直接叙述就是声明另外一Vue实例进行事件挂载与事件捕获,就是组件的事件在Vue实例上进行注册,在另外组件上需要处理的时候就捕获这个事件即可。

  完整的代码示例:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>Vue.js的组件化编程:组件通信</title>
		<script src="./js/vue2.js"></script>
	</head>
	<body>
		<div id="app">
			<h2>人员表</h2>
			<my-person :my-name="'小明'" :my-score="'99'"  ref="S1"></my-person>
			<my-person :my-name="'小丽'" :my-score="'87'"  ref="S2"></my-person>
			<my-total></my-total>
		</div>
		<script type="text/javascript">
			eventBus=new Vue();
			Vue.component("myPerson",{
				props:['myName','myScore'],
				data(){
					return {
							person:{
								name:"",
								score:0
							}
					}
				},
				mounted() {
					this.person.name=this.myName;
					this.person.score=this.myScore;					
				},
				template:`<div>
						姓名:{{ person.name }}
						分数:<input type="number" v-model="person.score" @input="myDataChange()"/>
					</div>`,
				methods:{
					myDataChange(){
						eventBus.$emit('DataChange',this.person);						
					}
				}
			});

			Vue.component("myTotal",{
				data(){
					return {
						total:0,
						personList:[]
					}
				},
				mounted() {
					eventBus.$on('DataChange',(p)=>{
						this.total=0;
						if( !this.personList.find(obj=>obj.name==p.name) ){
							this.personList.push(p);
						}
						this.personList.forEach(element => {
							this.total+=parseInt(element.score);
						});							
					})
				},
				template:`<div>总数:{{ total }}</div>`
			});
			var vm=new Vue({
				el:"#app"
			});
		</script>
	</body>
</html>

  结果输出:

   说明:

  ⑴ 需要声明另外一个Vue实例,名称可以根据自己需要设定;

  ⑵  组件的数据绑定可以在created或者mounted中进行;

  ⑶ 组件的事件触发eventBus.$emit('DataChange',this.person),DataChange可以被其他组件进行捕获处理;

  ⑷ 其他组件捕获事件

eventBus.$on('DataChange',(p)=>{
    //p是传递过来的参数
    //......
})

  原来Vue组件的数据通信这么简单!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript是一种流行的编程语言,被广泛用于网页开发。Vue.js是一个基于JavaScript前端开发框架,它提供了一套简洁、灵活的工具,使得开发者可以更轻松地构建交互式的Web应用程序。 Vue.js具有以下特点: 1. 渐进式:Vue.js采用渐进式的设计,可以逐步引入到现有的项目中,也可以通过逐步学习来适应各种开发需求。 2. 轻量级:Vue.js的核心库只有约21KB,加载速度快,非常适合于移动端开发。 3. 组件化:Vue.js支持组件化的开发方式,开发者可以根据需要构建复用性高、可维护性好的组件,提高开发效率。 4. 响应式:Vue.js采用了响应式的设计,当数据发生变化时,对应的页面会自动更新,大大减少了处理DOM操作的工作。 5. 单文件组件Vue.js支持单文件组件的开发方式,将HTML、CSS、JS代码封装在同一个文件中,提高了代码的可读性和可维护性。 一个使用Vue.js的Web开发案例教程可能包含以下内容: 1. 环境搭建:介绍如何安装配置开发Vue.js的环境,如Node.jsVue CLI。 2. 基础语法:引导学习者了解Vue.js的基本语法和常用指令,如数据绑定、事件处理、条件渲染等。 3. 组件开发:讲解如何使用Vue.js构建组件,如何进行组件通信、数据传递等。 4. 路由管理:介绍Vue Router,帮助学习者构建单页应用程序,实现页面之间的切换和导航。 5. 状态管理:介绍Vuex,帮助学习者管理应用程序的状态,实现数据的集中管理和共享。 6. 前后端交互:介绍如何使用Axios等工具,与后端服务器进行数据交互。 7. 实战项目:引导学习者完成一个完整的Vue.js项目,如博客系统、电子商务网站等。 通过这样的案例教程,学习者可以逐步了解和掌握Vue.js的开发思想和技术,提高自己的Web开发能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值