非父子通信(扩展)-- event bus 事件总线

news2025/1/17 14:13:14
创建一个空实例Bus, export default 导出Bus
过程:由A组件对Bus组件进行监听,B组件触发Bus对应的事件,由于A组件进行监听,触发事件之后就会进行A组件的回调,那么就可以将消息发送给A了



在src文件夹下新建utils文件夹(工具类文件一般放在utils),文件夹下新建EventBus.js文件


创建一个空vue实例 Bus:
// 1.创建一个都能访问到的事件总线(空的 Vue实例)
import Vue from 'vue'
const Bus = new Vue()
export default Bus // 导出事件总线,将来任何需要借助事件总线的地方都可以直接导入该文件
B组件通过点击按钮触发Bus 实例传递消息:
<template>
  <div class="base-b">
    我是B组件(发布方)
    <button @click="clickSendd">发布通知</button>
  </div>
</template>

<script>
import Bus from '../utils/EventBus'
export default {
  methods:{
    clickSend(){
      //3.B(发送方)触发事件的方式传递参数
      Bus.$emit('sendMsg','今日天晴')
    }
  }
}
</script>

<style>
.base-b {
  background-color: white;
  width: 200px;
  height: 300px;
  text-align: center;
  line-height: 300px;
  border: 1px solid #000;
}

</style>
A组件通过监听Bus实例,接收消息进行处理

在data中定义变量msg,将传过来的消息赋值给变量msg,然后进行页面显示

<template>
  <div class="base-a">我是A组件(接收方)
    <p>{{msg}}</p>
  </div>
</template>

<script>
import Bus from '../utils/EventBus'
export default {
  created() {
    // 2.在A组件(接收方)进行监听Bus事件
    Bus.$on('sendMsg',(msg) => {
      this.msg = msg
    })
  },
  data(){
    return {
      msg:''
    }
  }
}
</script>

<style>
.base-a {
  background-color: white;
  width: 200px;
  height: 300px;
  text-align: center;
  line-height: 300px;
  border: 1px solid black;
}

</style>

扩展:非父子通信 


创建爷爷组件App.vue
<template>
  <div class="app">
    我是APP组件
    <button @click="change">修改数据</button>
    <SonA></SonA>
    <SonB></SonB>
  </div>
</template>

<script>
import SonA from './components/SonA.vue'
import SonB from './components/SonB.vue'
export default {
  provide() {
    return {
      // 简单类型 是非响应式的
      color: this.color,
      // 复杂类型 是响应式的
      userInfo: this.userInfo,
    }
  },
  data() {
    return {
      color: 'pink',
      userInfo: {
        name: 'zs',
        age: 18,
      },
    }
  },
  methods: {
    change() {
      this.color = 'red'
      this.userInfo.name = 'ls'
    },
  },
  components: {
    SonA,
    SonB,
  },
}
</script>

<style>
.app {
  border: 3px solid #000;
  border-radius: 6px;
  margin: 10px;
}
</style>
创建儿子组件SonA,其中调用孙子组件GrandSon
<template>
  <div class="SonA">我是SonA组件
    <GrandSon></GrandSon>
  </div>
</template>

<script>
import GrandSon from './GrandSon.vue'
export default {
  components:{
    GrandSon
  }
}
</script>

<style>
.SonA {
  border: 3px solid #000;
  border-radius: 6px;
  margin: 10px;
  height: 200px;
}
</style>
创建另一个儿子组件SonB
<template>
  <div class="SonB">
    我是SonB组件
  </div>
</template>

<script>
export default {

}
</script>

<style>
.SonB {
  border: 3px solid #000;
  border-radius: 6px;
  margin: 10px;
  height: 200px;
}
</style>
创建孙子组件GrandSon:
<template>
  <div class="grandSon">
    我是GrandSon
    {{ color }} -{{ userInfo.name }} -{{ userInfo.age }}
  </div>
</template>

<script>
export default {
  inject: ['color', 'userInfo'],
}
</script>

<style>
.grandSon {
  border: 3px solid #000;
  border-radius: 6px;
  margin: 10px;
  height: 100px;
}
</style>

过程:将爷爷组件中要传递到孙子组件的数据写在provide方法里,孙子组件中通过 inject:[ ]接收

v-model原理 :


v-model是不能跟props传过来的数据进行双向绑定的       

//App.vue
<template>
  <div class="app">
    <HelloWorld
    :cityId="selectId"
    @changeId="selectId=$event"
    ></HelloWorld>

    
  </div>
</template>

<script>
  import HelloWorld from './components/HelloWorld.vue'

export default {
  data(){
    return{
      selectId:'102'
    }
  },
  components:{
    HelloWorld
  }

}
</script>

<style>

</style>
//HelloWorld
<template>
  <div>
    <select :value="cityId" @change="handleChange" >
      <option value="101">北京</option>
      <option value="102">上海</option>
      <option value="103">武汉</option>
      <option value="104">深圳</option>
      <option value="105">广州</option>
    </select>
  </div>
</template>

<script>
export default {
  props:{
    cityId:String
  },
  methods:{
    handleChange(e){
      // console.log(e.taget.value);
      this.$emit('changeId',e.target.value)
      
    }


  }

}
</script>

<style>

</style>

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue深入理解(1)

本文章内容主要来源于《vue.js设计与实现》 视图层框架设计 命令式和声明式 范式上&#xff0c;视图层框架通常分为命令式和范式 JQuery就是典型的命令式框架&#xff0c;命令式框架的一大特点就是关注过程 例子&#xff1a; $(#app) // 获取app.text(hello world) // 设置…

CSDN博客如何修改删除上传的资源

CSDN博客是我用过的最好用的博客&#xff0c;它对用户发布文章的限制比较少&#xff0c;而且还支持用户利用知识创新来获取收益&#xff0c;不象51CTO这种垃圾博客&#xff0c;动不动就给扣分限号。但我发现CSDN也有设计缺陷&#xff0c;虽然其上传资源的入口很好找&#xff0c…

【SpringBoot】Day11-10 yml文件配置

三种配置文件 前面我们一直使用springboot项目创建完毕后自带的application.properties进行属性的配置&#xff0c;那其实呢&#xff0c;在springboot项目当中是支持多种配置方式的&#xff0c;除了支持properties配置文件以外&#xff0c;还支持另外一种类型的配置文件&#x…

React路由使用入门react-router-dom

1.安装react-router-dom npm i react-router-dom 2.配置 &#xff08;1&#xff09;创建router实例对象并且配置路由对应关系 &#xff08;2&#xff09;路由绑定 import {createBrowserRouter,RouterProvider} from react-router-dom//&#xff08;1&#xff09;创建rou…

web复习(二)

编程题 1.编写一个函数&#xff0c;接收一个数组作为参数&#xff0c;返回一个对象&#xff0c;其中包含数组中每个元素及其出现次数。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewpo…

【CANoe示例分析】Basic UDP Multicast(CAPL)

1、工程路径 C:\Users\Public\Documents\Vector\CANoe\Sample Configurations 16.6.2\Ethernet\Simulation\UDPBasicCAPLMulticast 在CANoe软件上也可以打开此工程:File|Sample Configurations|Ethernet - Simulation of Ethernet ECUs|Basic UDP Multicast(CAPL) 2、示例目…

在Linux(ubuntu22.04)搭建rust开发环境

1.安装rust 1.安装curl: sudo apt install curl 2.安装rust最新版 curl --proto ‘https’ --tlsv1.2 https://sh.rustup.rs -sSf | sh 安装完成后出现&#xff1a;Rust is installed now. Great! 重启当前shell即可 3.检验是否安装成功 rustc --version 结果出现&…

react跳转传参的方法

传参 首先下载命令行 npm react-router-dom 然后引入此代码 前面跳转的是页面 后面传的是你需要传的参数接参 引入此方法 useLocation()&#xff1a;这是 react-router-dom 提供的一个钩子&#xff0c;用于获取当前路由的位置对象location.state&#xff1a;这是从其他页面传…

路径规划之启发式算法之九:灰狼优化算法(Grey Wolf Optimizer,GWO)

灰狼优化算法&#xff08;Grey Wolf Optimizer&#xff0c;GWO&#xff09;是一种智能优化算法&#xff0c;由澳大利亚格里菲斯大学学者Mirjalili等人在2014年提出。该算法灵感来源于灰狼群体的捕食行为&#xff0c;通过模拟灰狼的社会等级分层和狩猎机制来解决复杂的优化问题。…

数字乡村建设方案-6

1. 方案背景与目标 数字乡村建设旨在响应乡村振兴战略&#xff0c;解决顶层设计缺失、资源统筹不足、基础设施缺失等问题&#xff0c;通过信息化建设加强党的领导&#xff0c;提升乡村治理水平&#xff0c;促进乡村经济发展。 2. 乡村信息化需求 乡村管理人员希望通过信息化…

数据分析: 基于CSDN博客排行榜TOP100的博客创作分析和建议

在CSDN上写一些学习心得&#xff0c;分享一些经验&#xff0c;是一件令人愉悦的事情。但是绝大多数人&#xff0c;很多时候写的东西没人看&#xff0c;浏览量个位数&#xff0c;点赞收藏都是0&#xff0c;这着实让人觉得沮丧和无聊&#xff0c;最终选择放弃。 今天&#xff0c…

快速幂+逆元求组合数

在计算组合数 时&#xff0c;直接暴力计算既慢又容易溢出。今天我们来揭开 快速幂 和 模逆元 的神秘面纱&#xff0c;带你一边学习理论&#xff0c;一边轻松解决实际问题&#xff01; 什么是快速幂&#xff1f; 快速幂是一种高效计算 的方法。它利用指数的二进制表示&#x…

「OC」多线程(三)——NSOperation

「OC」多线程(三)——NSOperation 文章目录 「OC」多线程(三)——NSOperation前言介绍实现的具体步骤 NSOperation的创建NSOperationQueue的使用使用实例NSInvocationOperation的使用NSBlockOperation的使用NSOperationQueue的使用取消操作最大并发数 自定义NSOperation子类相关…

可供参考的GitHub国内镜像

在配置了本地hosts文件和魔法后仍存在无法访问的问题 针对如上问题&#xff0c;可以使用国内的镜像地址做替换 例如: https://github.com/bubbliiiing/detr-pytorch改成 https://hub.nuaa.cf/bubbliiiing/detr-pytorch推荐使用的镜像 https://hub.yzuu.cf/ https://hub.nua…

Codeforces Round 784 (Div. 4)

题目链接 A. Division? 题意 思路 模拟即可 示例代码 void solve() {int n;cin >> n;int ans;if(n > 1900) ans 1;else if(n > 1600) ans 2;else if(n > 1400) ans 3;else ans 4;cout << "Division " << ans << \n;}B. T…

E172 ASP.NET+SQL+C#+LW+图书管理系统的设计与实现 配置 源码 文档 全套资料

图书管理系统 1.项目摘要2. 系统的概述3.项目功能4.界面展示5.源码获取 1.项目摘要 摘 要 书籍是供人们获取并增长知识的主要途径&#xff0c;由于图书的种类较多&#xff0c;阅读者也较多&#xff0c;借阅量较大&#xff0c;且易出错&#xff0c;传统的图书借阅若还停留在手工…

TriCore架构-TC397将code从原来在P-Cache地址移到PSPR的地址,CPU的负载率为什么没影响

TC397有6个内核,每个核有自己的私有的Memory以及共有的Memory。 私有的:PSPR,DSPR,P-Cache,D-Cache,PF(X),LMU,DLMU,LPB PSPR主要用来运行RAM Code,比如说有些代码要放到RAM里面运行。 DSPR主要当成SRAM来用,比如用来存放全局变量。 P-Cache通过PFI接口访问DMU的3M内…

109.【C语言】数据结构之二叉树层序遍历

目录 1.知识回顾 2.代码实现 准备工作 LevelOrder函数 代码框架 关键代码 3.执行结果 1.知识回顾 层序遍历参见106.【C语言】数据结构之二叉树的三种递归遍历方式文章 截取的部分内容 定义:按层的方式遍历(,设n为树的深度,h1-->h2-->h3-->...-->hn) 以下面…

基于SpringBoot的养老院管理系统的设计与实现

一、前言 随着人口老龄化的加剧&#xff0c;养老院作为老年人养老的重要场所&#xff0c;其管理的高效性和科学性显得尤为重要。传统的养老院管理方式多依赖人工操作&#xff0c;存在信息记录不及时、不准确&#xff0c;管理流程繁琐&#xff0c;资源调配困难等问题。利用信息技…

012 路由信息协议RIP

路由信息协议RIP 作为度量(Metric)来衡量到达目的网络的距离 RIP是一种基于距离矢量D-V(Distance-Vector)算法的协议&#xff0c;它使用跳数(Hop Count)作为度量(Metric)来衡量到达目的网络的距离。 默认情况下&#xff0c;路由器到与它直接相连网络的跳数为0&#xff0c;因此…