Vue组件间通信的四种方式(函数回调,自定义事件,事件总线,消息订阅与发布)

news2024/11/15 18:48:43

目录

概述 

props配置项-回调函数实现

自定义事件实现

事件总线实现

消息订阅与发布实现


概述 

在组件化编程中,组件间的通信是重要的,我们可以有四种方式实现组件间的通信。

分别是:函数回调,自定义事件,事件总线和消息订阅与发布。

本篇博客将使用App组件和Student组件完成组件间通讯通信的演示。

props配置项-回调函数实现

父组件(App)给子组件(Student)传递数据 

父组件想要给子组件传递数据,只需要父组件在使用子组件的位置书写传递数据即可,子组件使用props配置项接收。

App组件(父组件)

<template>
  <div id="app">
    <Studnet :name="name"></Studnet>
  </div>
</template>

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

export default {
  name: 'App',
  data(){
    return {
      name:"Tom"
    }
  },
  components: {
    Studnet
  }
}
</script>

Studnet组件(子组件)

<template>
  <div>
    <button @click="printAppData">点击</button>
  </div>
</template>

<script>
    export default {
        name:"Student",
        props:["name"],
        methods:{
            printAppData(){
                console.log(this.name);
            }
        }
    }
</script>

 当我们点击按钮后,查看控制台

子组件给父组件传递数据

 我们在实现子组件给父组件传递数据的时候,要是还是想要使用props直接传递的话显然不合适。

因为props只能父组件在调用子组件时传递数据。

虽然我们不能直接传递数据,但是我们可以换一个思路,那就是我们在父组件向子组件传递回调函数,当子组件在合适的时机调用传入的回调函数时可以设置函数参数,那么我们在父组件的函数实现就可以获取到调用函数时传入的参数数据。

 App组件(父组件)

<template>
  <div id="app">
    <!--传递回调函数-->
    <Studnet :name="name" :getData="getData"/>
  </div>
</template>

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

export default {
  name: 'App',
  data(){
    return {
      name:"Tom"
    }
  },
  components: {
    Studnet
  },
  methods:{
    getData(age){
      console.log("获取到子组件的参数:",age);
    }
  }
}
</script>

 Student组件(子组件)

<template>
  <div>
    <button @click="printAppData">点击(父向子组件传数据)</button>
    <button @click="getData(age)">点击(子向父组件传数据)</button>
  </div>
</template>

<script>
    export default {
        name:"Student",
        // 接收回调函数
        props:["name","getData"],
        data(){
            return{
                age:18
            }
        },
        methods:{
            printAppData(){
                console.log("接收到父组件传递的数据是:",this.name);
            },
        }
    }
</script>

<style>

</style>

自定义事件实现

子组件给父组件传递数据

我们可以在父组件中给子组件绑定一个自定义事件,子组件在合适的时机执行此自定义事件的时候传递一些数据即可。

App组件(父组件) 

<template>
  <div id="app">
    <!-- 给Student组件(子组件)绑定一个myEvent自定义事件 -->
    <Studnet @myEvent="myEvent"/>
  </div>
</template>

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

export default {
  name: 'App',
  data(){
    return {
      
    }
  },
  components: {
    Studnet
  },
  methods:{
    // 当自定义事件被触发时,执行此函数获取调用函数时的参数
    myEvent(name){
      console.log("获取到子组件的参数:",name);
    }
  }
}
</script>

 Student组件(子组件)

<template>
  <div>
    <button @click="clcikHandle">点击触发自定义事件</button>
  </div>
</template>

<script>
    export default {
        name:"Student",
        // 接收回调函数
        data(){
            return{
                name:"Tom"
            }
        },
        methods:{
            clcikHandle(){
                this.$emit("myEvent",this.name)
            }
        }
    }
</script>

当我们点击按钮,控制台打印:

 

在其中我们给子组件绑定自定义事件还有另一种方式:

<Studnet ref="studnetComp"/>

通过ref属性获取到节点,再给节点绑定事件即可

this.$refs.studnetComp.$on("自定义事件",处理函数)

解绑自定义事件

this.$off(["事件名称"])

事件总线实现

 事件总线:实现任意组件间的通信,上方的回调函数或者是自定义事件的方式实现的组件通信都有缺陷,当我们想要第一级组件和第三级组件间的通信时,就需要逐层传递,又或者是兄弟组件间通信是实现不了的,所以出现了事件总线的事件。

其原理就是我们找出一个公共可访问区域,在此区域绑定自定义事件,当想要给某组件传递数据时,只需要执行该组件在公共区域放置的自定义事件并传递参数即可。

例如下图解,当我们B组件想要给A组件传递数据时,只需要A组件在公共区域绑定自定义事件,并书写事件处理函数接收参数,当B组件想传递数据的时候,找到A组件在公共区域绑定的自定义事件执行并传入参数,那么A组件中的事件处理函数将接收到传来的参数,那么我们就可以实现B组件给A组件传递数据了。

此公共区域可以为任意组件服务,实现任意组件的数据通信,所以我们称此公共区域叫做事件总线,因为它控制着所有组件的事件绑定。

此公共位置就是在VUE原型对象上绑定,想要在VUE原型对象上绑定事件,并且可以使用原型上的方法,那么我们就只能考虑实例对象vc或vm。

 兄弟组件传递数据 (Student组件给Student1组件传递数据)

1.给Vue原型对象上添加$bus属性,值为vm (安装全局事件总线)

new Vue({
  render: h => h(App),
  beforeCreate(){
    Vue.prototype.$bus = this
  }
}).$mount('#app')

2.Student1组件在总线上绑定事件

export default {
name:Student1,
mounted(){
    this.$bus.$on("myEvent",this.printInfo)
},
methods:{
    printInfo(_,args){
        console.log("获取到的参数为:",args);
    }
}

 3.Studnet组件在合适的时机执行studnet1上绑定的自定义事件并传入参数作为数据。

// 当点击页面上某个按钮时调用自定义事件并传入参数
clcikHandle(){
    this.$bus.$emit("myEvent",this.name)
}

消息订阅与发布实现

此方式也可以实现任意组件间的通信,跟事件总线的实现方式很像。

消息发布与订阅是一种思想

订阅者:需要数据的组件

发布者:提供数据的组件

实现此思想的JS库有许多,在此使用pubsub-js做演示

 使用步骤:

需求:Student组件给Student1组件传递数据 

1.导入pubsub-js

2.订阅信息(Studnet1组件操作)

导入pubsub库

import pubsub from "pubsub-js"

// 发布订阅消息,当有对应消息发布时会传递数据进来
pubsub.subscribe("消息名",消息处理函数)

3.信息发布(Studnet组件操作)

 导入pubsub库

import pubsub from "pubsub-js"

// 发布消息,对应的订阅了此消息名的函数会执行并且接收到此参数
pubsub.publish("消息名",参数)

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

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

相关文章

可调恒流驱动LED电路分析

https://www.icxbk.com/article/detail?aid884 常规使用的pwm调亮度不仅会导致频闪&#xff0c;而且在长时间使用的时候&#xff0c;有损坏led的风险&#xff0c;所以这次设计了一个恒流调亮度电路&#xff0c;其电路图如下所示 电路原理的解读&#xff1a; 左侧的电位计起着…

【JavaScript】js实现深拷贝的方法

前言 在js中我们想要实现深拷贝&#xff0c;首先要了解深浅拷贝的区别。 浅拷贝&#xff1a;只是拷贝数据的内存地址&#xff0c;而不是在内存中重新创建一个一模一样的对象&#xff08;数组&#xff09; 深拷贝&#xff1a;在内存中开辟一个新的存储空间&#xff0c;完完全全…

Java语言常用哪些运算符?

之前有个大家讨论过java的数据类型&#xff0c;总体来说类型和其他几种语言也相差无几&#xff0c;我为什么会这样说&#xff1f;我们应该都要知道Python可还有个复数类型。 这里主要给大家讲解Java运算符的分类和使用。 一、运算符分类 说到运算符&#xff0c;我们可以先了…

硬件系统工程师宝典(9)-----如何正确使用去耦电容

各位同学大家好&#xff0c;欢迎继续做客电子工程学习圈&#xff0c;今天我们继续来讲这本书&#xff0c;硬件系统工程师宝典。上篇我们说到在电源完整性分析时&#xff0c;明确噪声来源可以有效的避免、解决噪声问题。今天我们来看看电源完整性分析中重要的一环&#xff0c;去…

【自动化测试】web自动化测试验证码如何测?如何处理验证码问题?解决方案......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 在对安全性有要求的…

线程池ThreadPoolExecutor源码剖析

一、Java构建线程的方式 继承Thread &#xff08;也实现了Runnable&#xff09; 实现Runnable 实现Callable &#xff08;与Runnable区别…&#xff09; 线程池方式 &#xff08;Java提供了构建线程池的方式&#xff09;[可以实现Runnable 和 Callable 功能] Java提供了Exe…

使用Vue3实现一个可复制的表格

前言 表格是前端非常常用的一个控件&#xff0c;但是每次都使用v-for指令手动绘制tr/th/td这些元素是非常麻烦的。同时&#xff0c;基础的 table 样式通常也是不满足需求的&#xff0c;因此一个好的表格封装就显得比较重要了。 最基础的表格封装 最基础基础的表格封装所要做…

【并发编程十七】c++实现一个线程池

【并发编程十七】c实现一个线程池一、线程池原理二、实现重点三、个人理解四、实验简介&#xff1a; 大多数系统上&#xff0c;若因某些任务可以与其他任务并行处理&#xff0c;就分别给他们配备专属的线程&#xff0c;则这种做法不切实际。但是只要有可能&#xff0c;我们还是…

C语言进阶——动态内存管理(上)

&#x1f307;个人主页&#xff1a;_麦麦_ &#x1f4da;今日名言&#xff1a;“你若爱&#xff0c;生活哪里都可爱。你若恨&#xff0c;生活哪里都可恨。你若感恩&#xff0c;处处可感恩。你若成长&#xff0c;事事可成长。不是世界选择了你&#xff0c;是你选择了这个世界。既…

mdio协议

1. 简介 MDIO接口中有特定的术语定义总线上的各种设备&#xff0c;驱动MDIO总线的设备被定义为站管理实体&#xff08;STA&#xff09;&#xff0c;而被MDC管理的目标设备称为可被MDIO管理的设备&#xff08;MMD&#xff09;。 STA初始化MDIO所有的通信&#xff0c;同时负责驱动…

【数据结构与算法】哈希表1:字母异位词 两数交集 快乐数 两数之和

文章目录今日任务1.哈希表理论基础&#xff08;1&#xff09;哈希表&#xff08;2&#xff09;哈希函数&#xff08;3&#xff09;哈希碰撞&#xff08;4&#xff09;链地址法&#xff08;拉链法&#xff09;&#xff08;5&#xff09;线性探测法&#xff08;6&#xff09;常见…

Python采集双色球数据,做数据分析,让我自己实现自己的富豪梦

来唠点嗑&#xff1f; 咳咳&#xff0c;最近是咋的了&#xff0c;某站掀起了一股双色球热潮&#xff1f;一般我自己的账号上&#xff0c;是很少看到关于python这些内容的&#xff0c;都是小姐姐和热梗&#xff0c;或者其他搞笑视频 由于&#x1f4b4;的吸引力…手不自觉的就点…

《系统架构设计》-03-软件结构体系和架构风格

文章目录1. 软件结构体系1.1 抽象&#xff08;Abstract&#xff09;1.1.1 抽象的应用1.1.2 不同层次的抽象1.2 组件&#xff08;Component&#xff09;1.2.1 定义1.2.2 切入点1.3 组织过程资产&#xff08;Organizational Process Assets&#xff09;1.3.1 定义1.3.2 作用1.4 体…

springboot整合Chat Generative Pre-trained Transformer

什么是Chat Generative Pre-trained Transformer Chat Generative Pre-trained Transformer&#xff0c;是以人工智能驱动的聊天机器人程序 &#xff0c;已经更新多个版本&#xff0c;很多大厂也都在接入其API。 整合难度 难度一颗星&#xff0c;基本上就是给官方API发请求&am…

特征工程:特征构造以及时间序列特征构造

数据和特征决定了机器学习的上限&#xff0c;而模型和算法只是逼近这个上限而已。由此可见&#xff0c;特征工程在机器学习中占有相当重要的地位。在实际应用当中&#xff0c;可以说特征工程是机器学习成功的关键。 那特征工程是什么&#xff1f; 特征工程是利用数据领域的相关…

UI自动化测试之设计框架

目的 相信做过测试的同学都听说过自动化测试&#xff0c;而UI自动化无论何时对测试来说都是比较吸引人的存在。 相较于接口自动化来说它可以最大程度的模拟真实用户的日常操作与特定业务场景的模拟&#xff0c;那么存在即合理&#xff0c;自动化UI测试自然也是广大测试同学职…

身为大学生,你不会还不知道有这些学生福利吧!!!!

本文介绍的是利用学生身份可以享受到的相关学生优惠权益&#xff0c;但也希望各位享受权利的同时不要忘记自己的义务&#xff0c;不要售卖、转手自己的学生优惠资格&#xff0c;使得其他同学无法受益。 前言 高考已经过去&#xff0c;我们也将迎来不同于以往的大学生活&#x…

磁盘结构

一.盘片 盘片是一个圆形坚硬的表面&#xff0c;通过引入磁性变化来永久存储数据&#xff0c;这些盘片通常由一些硬质材料&#xff08;如铝&#xff09;制成&#xff0c;然后涂上薄薄的磁性层&#xff0c;即使驱动器断电&#xff0c;驱动器也能持久存储数据位。每个盘片有两面&a…

袋鼠云高教行业数字化转型方案,推进数字化技术和学校教育教学深度融合

在当前的数字化转型浪潮下&#xff0c;“基础设施、配套设备、应用探索”的数字校园1.0阶段即将步入尾声、亦或已经完结&#xff0c;不同地区和类型的高校通过各类信息化系统和基础设施已经初步实现了业务数字化&#xff0c;整个数字校园的信息基础设施底座已有一定基础、信息时…

TCP编程之网卡信息获取和域名解析

TCP编程之网卡信息获取和域名解析 1.TCP/IP简介 TCP/IP协议源于1969年&#xff0c;是针对Internet开发的一种体系结构和协议标准&#xff0c;目的在于解决异种计算机网络的通信问题。使得网络在互联时能为用户提供一种通用、一致的通信服务。是Internet采用的协议标准。   …