Vue非父子组件通信详解

发布时间 - 2026-01-11 01:50:39    点击率:

组件是Vue核心的一块内容,组件之间的通信也是很基本的开发需求。组件通信又包括父组件向子组件传数据,子组件向父组件传数据,非父子组件间的通信。前两种通信Vue的文档都说的很清楚,但是第三种文档上确只有下面的几句

具体如何去实现却没有很详细的说明,于是自己试着进行了实现。先看下简单的通信效果:

就是点击了一个组件,另一个组件的数字递加。

html如下:

<div id="app">
  <component-a></component-a>
  <component-b></component-b>
</div>

再来看一下如何实现每一个组件:

var bus = new Vue() //首先建立一个空的Vue实例作为事件的中转

  Vue.component('component-a',{
    template: `<div><button @click="incrementB">{{masgA}}</button></div>`, //添加点击事件incrementB ,因为点击A需要增加B
    data ()  {
      return {
        masgA : 0
      }
    },
    methods: {
      incrementB: function () { //增加B的事件
        bus.$emit('incrementB') //中转站bus 触发incrementB事件
      }
    },
    mounted: function () {
      var _this = this
      bus.$on('incrementA',function(){ //中转站bus自定义increamentA事件用来增加msgA,这个事件最终由组件B进行触发
        _this.masgA ++
      })
       //bus.$on('incrementA',()=>{ //这里也可以用箭头函数,就不会有_this这个变量了,因为箭头函数不会改变this指向
       // this.masgA ++
       //})
    }
  })

从上面的代码可以看出真正的改变方法是通过bus里注册监听事件来实现的,同理代component-b也是一样

Vue.component('component-b',{
    template: `<div><button @click="incrementA">{{masgB}}</button></div>`,
    data ()  {
      return {
        masgB : 0
      }
    },
    methods: {
      incrementA: function () {
        bus.$emit('incrementA')
      }
    },
    mounted: function(){
      bus.$on('incrementB',() => {
        this.masgB ++
      })
    }
  })

完整代码如下,可直接复制运行

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>非父子组件通信</title>
</head>
<body>
  <div id="app">
    <component-a></component-a>
    <component-b></component-b>
  </div>
  <script src="https://unpkg.com/vue/dist/vue.js"></script>
</body>
<script>
  var bus = new Vue() //首先建立一个空的Vue实例作为事件的中转

  Vue.component('component-a',{
    template: `<div><button @click="incrementB">{{masgA}}</button></div>`, //添加点击事件
    data ()  {
      return {
        masgA : 0
      }
    },
    methods: {
      incrementB: function () {
        bus.$emit('incrementB')
      }
    },
    mounted: function () {
      var _this = this
      bus.$on('incrementA',function(){
        _this.masgA ++
      })
      bus.$on('incrementA',()=>{
        this.masgA ++
      })
    }
  })

  Vue.component('component-b',{
    template: `<div><button @click="incrementA">{{masgB}}</button></div>`,
    data ()  {
      return {
        masgB : 0
      }
    },
    methods: {
      incrementA: function () {
        bus.$emit('incrementA')
      }
    },
    mounted: function(){
      bus.$on('incrementB',() => {
        this.masgB ++
      })
    }
  })

  var vm = new Vue({
    el: "#app"
  })
</script>

同时也可以看出这么做仅有两个组件就有些麻烦,事件的流向不是很清晰,所以在出现复杂的场景时需要使用VueX进行管理。

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


# Vue非父子组件通信  # Vue父子组件通信  # Vue组件通信  # 详解Vue 非父子组件通信方法(非Vuex)  # vue2.0父子组件及非父子组件之间的通信方法  # vue2利用Bus.js如何实现非父子组件通信详解  # vue中的event bus非父子组件通信解析  # vue非父子组件通信问题及解决方法  # vue3 非父子组件通信详解  # Vue组件通信中非父子组件传值知识点总结  # vue中非父子组件的通信你了解吗  # Vue非父子组件之间的通信方式详解  # 可以看出  # 建立一个  # 文档  # 两种  # 可以用  # 却没有  # 再来  # 都说  # 自定义  # 几句  # 很清楚  # 这么做  # 看一下  # 可直接  # 试着  # 来实现  # 要使  # 先看  # 大家多多  # 就不会有 


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


相关推荐: Java类加载基本过程详细介绍  成都网站制作公司哪家好,四川省职工服务网是做什么用?  如何确认建站备案号应放置的具体位置?  浅述节点的创建及常见功能的实现  Laravel如何实现API速率限制?(Rate Limiting教程)  Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作  Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  Bootstrap整体框架之CSS12栅格系统  夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化  php打包exe后无法访问网络共享_共享权限设置方法【教程】  C#如何调用原生C++ COM对象详解  ,网页ppt怎么弄成自己的ppt?  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  Laravel如何创建自定义Artisan命令?(代码示例)  如何快速搭建高效香港服务器网站?  Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析  使用C语言编写圣诞表白程序  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  Laravel如何实现API版本控制_Laravel版本化API设计方案  如何快速搭建个人网站并优化SEO?  Laravel如何使用Collections进行数据处理?(实用方法示例)  Laravel模型事件有哪些_Laravel Model Event生命周期详解  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  高端云建站费用究竟需要多少预算?  如何快速打造个性化非模板自助建站?  Laravel如何与Pusher实现实时通信?(WebSocket示例)  BootStrap整体框架之基础布局组件  Laravel怎么实现验证码(Captcha)功能  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  如何用搬瓦工VPS快速搭建个人网站?  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  原生JS实现图片轮播切换效果  HTML 中动态设置元素 name 属性的正确语法详解  如何快速上传建站程序避免常见错误?  *服务器网站为何频现安全漏洞?  详解Oracle修改字段类型方法总结  重庆市网站制作公司,重庆招聘网站哪个好?  Laravel怎么使用artisan命令缓存配置和视图