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

news/2023/6/7 0:23:26

  在总结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组件的数据通信这么简单!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-4564470.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

7天从代码入门到开发应用,怎样快速提高代码能力?

不论是工作多年的程序员&#xff0c;还是刚刚开始编程生涯的新手程序员&#xff0c;想在编码领域大展身手&#xff0c;代码质量是关键因素&#xff0c;这还关系着程序员们能否写出高质量代码、快速开发新应用、找到好工作。那么除了提升自己代码质量&#xff0c;还能怎么样提高…

在嵌入式开发中如何提高自己的代码水平

在开始学习嵌入式系统或者单片机系统的时候&#xff0c;大多数人的学习方法都是自己找视频教程或书本自己学&#xff0c;有的人也许会掏钱报个培训班什么的跟着老师学。 当自己慢慢的可以独立写代码的时候&#xff0c;就会觉得已经学会了。特别是自己能独立完成一些简单的项目之…

10+年程序员告诉你职场误区,如何快速提升自己?

热文导读 | 点击标题阅读欢迎加入Java和Android架构知识星球吊炸天&#xff01;74款APP完整源码&#xff01;年初离职大潮汹涌&#xff1a;一个7年老员工的离职忠告作者&#xff1a;沐榕休链接&#xff1a;cnblogs.com/sankt/p/8658028.html自己工作10年了&#xff0c;大概5年前…

Java程序员该怎么更好的提升自己

让我们看看今年Java程序员的5个目标&#xff1a; 学习JVM内部原理和Java性能调优 每天写代码 每月分析一次Java应用程序 参与编程挑战 学习Java中的套接字编程 现在&#xff0c;让我们详细了解它们这些解决方案&#xff0c;希望能帮助你们成为更好的开发人员。 1&#xff09;…

如何提高自己的编码水平

如何提高自己的编码水平 好久没写文章了&#xff0c;因为一个特殊的原因&#xff0c;这次讲一些如何提高自己的编码水平&#xff0c;主要是适用于初中级的工程师进阶使用&#xff0c;大佬请绕路。。。。 新手常见的困惑 经常听到一些困惑&#xff0c;比如说 看不懂别人写的什…

laydate 1.0.9 设置min/max范围选择 时分秒不可选bug

在做一期老项目需求时&#xff0c;发现使用的Laydate v1版本存在设置最小值最大值&#xff0c;即使小时大于最小值&#xff0c;分秒仍然处于置灰状态&#xff0c;详见下图 细看源码&#xff0c;发现以下红色框中条件缺失导致 修复如下黄色部分&#xff1a;

痞子衡嵌入式:盘点国内Cortex-M内核MCU厂商高主频产品(2023)

大家好&#xff0c;我是痞子衡&#xff0c;是正经搞技术的痞子。今天痞子衡给大家介绍的是国内Cortex-M内核MCU厂商高主频产品。 在 2021 年初痞子衡写了篇 《盘点国内Cortex-M内核MCU厂商高性能产品》&#xff0c;搜罗了当时市面上主频不低于 96MHz 的 CM 核国产 MCU。如今过去…

(侯捷C++)1.1面向对象高级编程(上)

一.C编程简介 1.C历史 B语言 → C语言 → C语言&#xff08;new C → C with Class → C&#xff09; 面向对象的语言&#xff1a;C、Java、C# 2.C演化 C 98(1.0) → C 03 → C 11(2.0) → C 14 Class两个经典分类&#xff1a;有指针&#xff08;Complex类为例&#xff0…