详解vue组件通信的三种方式

发布时间 - 2026-01-11 02:07:42    点击率:

1. 第一种方式就是官方推荐的

官方推荐方式

有时候两个组件也需要通信(非父子关系)。在简单的场景下,可以使用一个空的 Vue 实例作为中央事件总线。

本质是通过派发事件然后监听事件从而更改值,(父子组件通信也可用这个方式,但是不同的一点就是父子组件通信的时候可以不用一个空的Vue实例来做中转,这种方式我这里就不做演示的了,因为我的题目是非父子通信)

空的Vue实例 bus

import Vue from 'vue'

const bus = new Vue()
export default bus

组件add

<!--html结构-->
<template>
 <div>
  <p>我是add组件的num:{{num}} </p>
  <button @click='add'>增加</button>
 </div>
</template>
// js
<script>
import bus from '../bus.js'
export default {
 data() {
  return {
   num: ''
  }
 },
 methods: {
  add() {
   if (this.num) {
    this.num++
    bus.$emit('num-change', this.num)
   } else {
    this.num = 1
    bus.$emit('num-change', this.num)
   }
  }
 }
}
</script>

组件sub

<!--html结构-->
<template>
 <div>
  <p>我是sub组件的num:{{num}}</p>
 </div>
</template>
// js
<script>
import bus from '../bus.js'
export default {
 data() {
  return {
   num: ''
  }
 },
 created() {
  bus.$on('num-change', num => {
   this.num = num
  })
 }
}
</script>

2.通过vuex来进行状态管理

官方状态管理

vuex我这里就不详细说了,网上教程太多。

3.取巧利用js中的对象的特性(指针)

Object在内存中存储只是保留指针,所以父组件通过props来给兄弟组件传递同一个对象,兄弟组件接收的对象跟父组件的对象都是指向同一个内存地址,故不管在哪里修改都能保持一致。

上代码,父组件把同一个对象传递给add组件和sub组件,那么add组件和sub组件接收到的对象也是指向父组件app的对象都是指向同一个内存地址。add组件对传入的对象进行+1的操作,sub组件进行-1的操作。

父组件 app.vue

<!--html结构-->
<template>
 <div id="app">
  <h1>我是app父组件的newNum:{{share.newNum}}</h1>
  <hr>
  <!--将同一个对象同时传给两个子组件-->
  <addnum :share1='share'></addnum>
  <hr>
  <subnum :share2='share'></subnum>
 </div>
</template>
// js
import addnum from './components/add'
import subnum from './components/sub'

export default {
 data() {
  return {
   share: {
    newNum: 1
   }
  }
 },
 components: {
  addnum, subnum
 }
}

子组件add.vue

<!--html结构-->
<template>
 <div>
  <p>我是add组件的newNum:{{share1.newNum}} </p>
  <button @click='add'>增加</button>
 </div>
</template>
//js
<script>
export default {
 methods: {
  add() {
   this.share1.newNum++
  }
 },
 props: {
  share1: {
   type: Object,
  }
 }
}
</script>

子组件sub.vue

<!--html结构-->
<template>
 <div>
  <p>我是sub组件的newNum:{{share2.newNum}}</p>  
  <button @click='numSub'>减少</button>
 </div>
</template>
// js
<script>
export default {
 methods: {
  numSub() {
   this.share2.newNum--
  }
 },
 props: {
  share2: {
   type: Object,
  }
 }
}
</script>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# vue组件通信  # vue组件间通信  # vue组件之间的通信  # Vue.js每天必学之组件与组件间的通信  # Vuejs第十篇之vuejs父子组件通信  # vue中组件通信的八种方式(值得收藏!)  # vue 组件间的通信之子组件向父组件传值的方式  # Vue 之孙组件向爷组件通信的实现  # 详解vue跨组件通信的几种方法  # 深入探讨Vue.js组件和组件通信  # Vue3的7种种组件通信详情  # 详细聊聊vue组件是如何实现组件通讯的  # 我是  # 都是  # 太多  # 就不  # 说了  # 都能  # 不做  # 可以使用  # 来做  # 第一种  # 大家多多  # 来给  # 网上  # export  # num  # button  # html  # default  # lt  # gt 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作  如何在万网自助建站平台快速创建网站?  网站制作企业,网站的banner和导航栏是指什么?  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  Python并发异常传播_错误处理解析【教程】  Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能  Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】  创业网站制作流程,创业网站可靠吗?  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  如何用PHP快速搭建高效网站?分步指南  如何在景安云服务器上绑定域名并配置虚拟主机?  如何快速打造个性化非模板自助建站?  Laravel如何创建自定义Artisan命令?(代码示例)  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  如何生成腾讯云建站专用兑换码?  清除minerd进程的简单方法  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  长沙做网站要多少钱,长沙国安网络怎么样?  Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】  Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  如何用虚拟主机快速搭建网站?详细步骤解析  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  如何在IIS中新建站点并配置端口与物理路径?  JavaScript实现Fly Bird小游戏  JavaScript如何实现路由_前端路由原理是什么  如何选择PHP开源工具快速搭建网站?  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  lovemo网页版地址 lovemo官网手机登录  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  独立制作一个网站多少钱,建立网站需要花多少钱?  网页设计与网站制作内容,怎样注册网站?  Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  如何快速搭建FTP站点实现文件共享?  Laravel怎么判断请求类型_Laravel Request isMethod用法  bootstrap日历插件datetimepicker使用方法  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  javascript日期怎么处理_如何格式化输出  如何在万网自助建站中设置域名及备案?  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用