详解Vue组件之间的数据通信实例
发布时间 - 2026-01-11 01:55:39 点击率:次最近在用vue做项目,学习了不少东西,但是有时候光顾着做项目却忘记要找个时间来整理一下最近的一些学习新得,因为是新手,所以可能会有错误的地方,欢迎指出和交流呀~~~

关于父子组件以及非父子组件之间的数据通信
1 父子组件之间数据通信
一般父组件向子组件传递数据用prop进行传递,注意,子组件不能对prop中的数据进行更改,vue中规定是防止子组件对父组件中的数据进行窜改。而子组件向父组件进行数据传递则可以通过事件触发父组件的事件来实现数据的传递。(是不是有点懵逼了,看个例子吧 )
(这里我就直接摘取一段项目中的例子代码来说明)
使用prop进行数据传递:
//这是父组件中的部分代码,父组件向子组件<handle-Employee><handle-Employee>传递数据(method,dialogFormvisible)
// 父组件的部分代码
<!--添加员工模块-->
<div class="add">
<el-button type="primary" icon="edit" @click="handleAdd">新增员工</el-button>
<handle-Employee :method="method"
:dialogFormVisible="dialogFormVisible" @close="closeDialog" @getEmployee="getEmployee"></handle-Employee>
</div>
</div>
// 父组件的script代码
export default {
data () {
return {
method:{handle: 'add‘, title: '增加员工'}
dialogFormvisible: false
}
}
}
// 子组件中则需要加prop属性数据 ,如下所示:
export default {
props: [ 'method', 'dialogFormVisible']
}
//所以只要父组件中的数据变化修改,子组件中的数据也会跟这修改;
在chrome中用vue-devtool其实也可以看到相关的数据属性;
当然,子组件做完相关操作之后,需要时间的是将属性值dialogFormVisible重新修改为false。若是直接在子组件进行修改的话,就会报错,因为会影响到父组件的数据,vue中规定不能直接对prop的属性值进行修改。那么就可以用事件触发来实现子组件向父组件传递数据了。
///父组件监听子组件的事件,通过@close="closeDialog"和@getEmployee="getEmployee"来实现监听;
一旦子组件中的事件close和getEmployee发生之后,就会触发父组件中的事件closeDialog和getEmployee事件。
// 父组件的部分代码
<div class="add">
<el-button type="primary" icon="edit" @click="handleAdd">新增员工</el-button>
<handle-Employee :method="method" :dialogFormVisible="dialogFormVisible" @close="closeDialog" ></handle-Employee>
</div>
//子组件中的事件分发
export default {
methods: {
// 关闭弹出框
closeDialog () {
this.$emit('close', false) //这里就是直接触发子组件的close事件,一旦这个执行,父组件中的对应方法就会执行。
}
}
}
// 当那边触发关闭事件的时候,这边的显示值就要关闭,那边会传过来一个false
// 父组件的事件
export default {
methods: {
// 当那边触发关闭事件的时候,这边的显示值就要关闭,那边会传过来一个false
closeDialog (val) {
this.dialogFormVisible = val
}
}
}
这样就实现了父子组件之间的数据传递;
2 实现非父子组件之间的数据传递
通过建立中间的事件bus总线。实现非父子组件之间的数据通信。
- 首先建立事件bus,我会新建一个bus.js文件;注册bus。
- 分别在组件中使用emit和on实现数据之间的通信;
1 bus.js文件
//bus.js,注册Bus import Vue from 'vue' export default new Vue()
2 组件emit触发事件
<template>
<div class="add-task" :class="{'ishide':isAdding}" @click="addtask()">
<i class="fa fa-plus-circle" aria-hidden="true"></i>
添加任务
</div>
</template>
<script>
import Bus from '@/bus'
export default {
methods: {
props: ['index'],
data () {
return {
isAdding: false
}
},
addtask () {
this.isAdding = true
Bus.$emit('adding-task', this.isAdding, this.index) // 这里触发的事件是'adding-task',
传递了两个参数,分别是this.isAdding和this.index
this.$emit('addtask')
}
}
}
3 另外一个组件on接收事件
// 模板中的代码就不展示了。
主要展示的是script中的代码
export default{
data() // 这里的数据也不一一显示啦;
created () {
// 这里使用on监听了adding-task事件,接收到两个参数。所以一旦上面的组件中的adding-task事件触发,这里就会监听到。
Bus.$on('adding-task', (state, index) => {
if (this.index === index) {
this.isShow = state
}
})
}
}
缺点:
有时候小的子组件在页面中有很多个,需要复用,那么为了防止每一次触发相应的事件的时候,都会影响到监听的对应组件,如下图所示。我的解决方案就是给每一个循环的子组件赋值一个index的值;
//这里我会在每一次组件emit的时候传递一个index的值,另外一个组件on之后接受参数,会先判断该index是不是与自己的index相等,如果相等才执行相应的数据改变操作。
Bus.$on('adding-task', (state, index) => {
if (this.index === index) {
this.isShow = state
}
今天先到这里,困了。还有更复杂的数据通信是用vuex,不过我现在的项目应该是暂时还不会用到,所以以后用到再去深入了解。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# vue
# 组件之间通信
# vue组件之间的通信
# vue2.0
# Vue非父子组件之间的通信方式详解
# Vue3.2+Ts组件之间通信的实现
# vue中组件之间相互通信传值的几种方法详解
# vue中的$emit 与$on父子组件与兄弟组件的之间通信方式
# vue2.0组件之间传值、通信的多种方式(干货)
# Vue2.0基于vue-cli+webpack同级组件之间的通信教程(推荐)
# Vue 组件之间的通信方式详解
# 就会
# 数据通信
# 的是
# 来实现
# 所示
# 另外一个
# 影响到
# 自己的
# 这是
# 我就
# 我会
# 就不
# 我现在
# 可以用
# 中有
# 会在
# 弹出
# 可以看到
# 再去
# 报错
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】
Laravel怎么发送邮件_Laravel Mail类SMTP配置教程
文字头像制作网站推荐软件,醒图能自动配文字吗?
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
js代码实现下拉菜单【推荐】
javascript基本数据类型及类型检测常用方法小结
linux top下的 minerd 木马清除方法
如何在自有机房高效搭建专业网站?
如何快速搭建支持数据库操作的智能建站平台?
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】
网站页面设计需要考虑到这些问题
如何快速搭建虚拟主机网站?新手必看指南
高端建站三要素:定制模板、企业官网与响应式设计优化
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
lovemo网页版地址 lovemo官网手机登录
ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】
如何用西部建站助手快速创建专业网站?
Laravel如何与Pusher实现实时通信?(WebSocket示例)
如何用低价快速搭建高质量网站?
nodejs redis 发布订阅机制封装实现方法及实例代码
Internet Explorer官网直接进入 IE浏览器在线体验版网址
如何在云主机快速搭建网站站点?
简单实现jsp分页
UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】
开心动漫网站制作软件下载,十分开心动画为何停播?
移动端脚本框架Hammer.js
如何挑选最适合建站的高性能VPS主机?
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
如何在景安服务器上快速搭建个人网站?
三星网站视频制作教程下载,三星w23网页如何全屏?
中山网站制作网页,中山新生登记系统登记流程?
如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
Laravel怎么清理缓存_Laravel optimize clear命令详解
Laravel Admin后台管理框架推荐_Laravel快速开发后台工具
html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】
Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用
Laravel如何使用查询构建器?(Query Builder高级用法)
制作企业网站建设方案,怎样建设一个公司网站?
Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤
详解jQuery停止动画——stop()方法的使用
INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】
Swift中switch语句区间和元组模式匹配
linux写shell需要注意的问题(必看)
Laravel怎么为数据库表字段添加索引以优化查询
在Oracle关闭情况下如何修改spfile的参数
Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】
如何在阿里云虚拟主机上快速搭建个人网站?

