Vue(组件间通信:props、自定义事件、全局事件总线、消息订阅与发布)

news2024/11/26 15:33:38

一、props

props不仅可以实现父给子传递信息,还可以进行子给父传递信息

1.父给子传递信息:

  • 父组件中给子组件实例传递信息

  • 子组件利用props进行接收组件传递信息(接收方式有三种:数组、对象、配置对象)

2.子给父传递信息 (可以利用嵌套从孙组件传递给父组件)

  • 提前在父组件中声名一个函数带传递参数

  • 绑定在子组件(多层组件需要进行嵌套)v-bind、:

  • 子组件进行接收绑定的函数

  • 子组件创建发送数据函数(其中调用传入的接收函数)

  • 将子组建的函数通过事件绑定在指定模板标签中@

//父组件获取数据
 checkTodo (id) {
      this.todos.forEach((todo) => {
        if (todo.id === id) todo.done = !todo.done
      });
    }
//将获取数据的方法绑定在子组件(这里就运用了组件嵌套传递)
 <MyList :checkTodo='checkTodo' />
 <MyItem :checkTodo='checkTodo' />
 props: ['checkTodo']

//子组件中获取数据
 props: ['checkTodo'],

//子组件中创建发送数据的方法并绑定事件执行此函数(传参)
 <input @change='handleCheck(todo.id)' />
  handleCheck (id) {
      this.checkTodo(id)
    }

二、自定义事件(子给父传递数据)

自定义事件使用流程

1. 直接在父组件中给子组件实例绑定自定义事件,定义事件的回调,绑定方式v-on、@

此时需要注意自定义事件的名字是自己命名的

如果只需要执行一次还可以使用事件修饰

 <Studnt v-on:xlf.once="getStudentName" @demo="demo" />

 2.  还有一个自定义事件的绑定给组件实例方法:通过ref进行绑定

ref绑定优势:可以利用定时器延时绑定:比较灵活

setTimeout(() => { this.$refs.Student.$on('xlf', this.getStudentName) }, 3000)
  • 首先给组件实例添加ref标识

  • 如果存在内置事件使用,需要在自定义事件后添加@native,否则就需要向以下执行方式一样利用$emit()

  <Student ref='Student' @click.native="show" />
  • 在组件挂载钩子的时候执行绑定自定义事件$on('组件名',回调函数)

    • 此时自定义回调要么直接写在$on()中,但是必须要用你箭头函数

      • 因为使用普通函数谁触发了此事件回调中的this就会指向触发的组件实例

    • 还有一种方式提前设置回调函数,然后再$on()中直接调用

 mounted () {
    this.$refs.Student.$on('xlf', this.getStudentName)
}

 3. 在父组件中创建自定义事件的回调函数:可以接收两个参数

  • 自定义事件名字

  • 传递的参数

    getStudentName (name, ...params) {
      console.log('app收到了学生名', params);
      this.StudentName = name//传递进来的数据赋值给data中的属性
    },
    //用于自定义事件的回调函数
    demo () {
      console.log('demo事件被触发');
    },

 4.在子组件中绑定事件并执行发送数据函数

<button @click="sendStudentName">点我获取学生名</button>

5. 在子组件中创建发送数据并直接使用方法:this.$emit('组件名字',其他多个参数)

 sendStudentName () {
      // $emit:触发,爆发
      // 触发student实例对象的方法
      // 添加更多属性值:包装成对象或者将接收换成剩余参数
      this.$emit('xlf', this.name, 666)
      this.$emit('demo')
    },

6.在组件销毁之前或者其他情况需要解绑自定义事件:$off()

  •  this.$off('事件名'):解绑指定自定义事件

  • this.$off(['事件名1', '事件名2']):解绑多个指定自定义事件

  • this.$off():解绑所有自定义事件

 unbind () {
      //只适用解绑一个事件
      this.$off('xlf')
      // 解绑多个自定义事件,需要将多个自定义事件写入数组中
      // this.$off(['xlf', 'demo'])
      // 解绑的所有事件
      // this.$off()
    },

注意:如果需求将子组件延时全部销毁:需要再入口main.js文件中使用

 mounted() {
        setTimeout(() => {
            //自杀
            this.$destroy()
        },3000)
    }

三、全局事件总线(任意组件之间的通信)解决兄弟直接通信

1. 读取以下文字并理解兄弟组件传递流程

  • A组件内中收到别人数据,需要在a组件中,给x绑定自定义事件demo,自定义事件的回调函数在a组件中(接收数据处)

  • d组件给a传递数据:d组件中触发x身上的demo自定义事件并传递参数

此时的x不属于任何组件:但是所有组件都可以看到

还需要x可以调用:$on,$emit,$off

2. 实现x能被所有组件看到:这时候需要在入口Vue初始化时候就注册全局事件总线

利用组件实例对象的__protp__=vue原型,此时的vm还有vc都可以看到注册的x

在vue中将总线绑定在当前实例

x是vue中的$bus

 beforeCreate () {
        // 利用钩子(实例化未进行数据绑定)安装全局总线,vue原型对象上添加一个$bue=当前vue实例
        Vue.prototype.$bus = this//安装全局事件总线应该在app组件解析过程中而不是解析完成之后,此时的所有vc和vm都可以看到
    }

3. 确保$on,$emit,$off都可以使用并进行兄弟间组件通信

在注册全局事件总线之后

  • 在兄组件中给全局事件总线绑定自定义事件$on('组件名',回调函数)

//兄:获取数据在全局事件总线上绑定自定义事件
mounted () {
    // 给总线绑定自定义事件,回调函数在当前组件,如果绑定事件的回调函数直接写在$on中,那么使用箭头函数
    this.$bus.$on('hello', (data) => {
      console.log('我是school组件,收到了数据', data)
    })
  },
  • 在子组件中调用自定义事件并进行传递数据

//模板绑定事件并执行函数
<button @click="sendStudentName">学生名给school组件</button>
//声名方法调用全局总线中的自定义事件
  methods: {
    // 通过全局总线的自定义事件进行发送数据
    sendStudentName () {
      this.$bus.$emit('hello', 666)
    }
  },

 

绑定事件总线的自定义事件需要在组件销毁前解绑

 beforeDestroy () {
    this.$bus.$off('hello')
  },

注意:利用全局总线绑定自定义事件命名不可以重复

解决:利用一个文件config:在文件中使用某些方式表示当前名字已出现在全局事件总线

 

四、消息订阅与发布(任意组件之间的通信)

执行消息订阅与发布:

  • 首先执行消息的订阅

  • 接着执行数据的发布

注意:需要引入第三方库:pubsub-js

  • 先进行安装:npm i pubsub-js

  • 然后引入使用

1. 订阅:

  • 引入pubsub

  • 利用api:pubsub.subscrib进行绑定自定义事件(’事件名‘,回调 ),回调可以提前声名,并给其绑定事件一个pubsub的ID

  • 需要销毁订阅:使用pubsub.unsubscribe(绑定事件的id)

  • 注意:回调箭头函数如果直接使用this指向的是undefined,因为是第三方模块,可以利用提前声名的方法

  • 注意:接收参数,会收到自定义事件名字,可以使用占位符进行占位

// 1. 安装好pubsub-js之后引入pubsub
import pubsub from 'pubsub-js'
//2. 订阅消息
 methods: {
    // 此处时订阅消息的回调函数
    //demo (msgName, data)
     demo (_, data) {
      console.log('消息收到', msgName, data);
  }
 mounted () {
// 订阅消息(注意给订阅id,因为需要被销毁)
    //参数是消息名,参数
    this.pubId = pubsub.subscribe('hello', this.demo)
}
//3. 销毁订阅消息:使用api进行取消订阅(注意订阅名字)
  beforeDestroy () {
    // this.$bus.$off('hello')
    pubsub.unsubscribe(this.pubId)
  },

2.发布

  • 引入pubsub

  • 绑定一个发送数据的方法给当前组件中

  • 执行发布api:pubsub.publish('发布的自定义事件名字',参数)

//1.引入pubsub
import pubsub from 'pubsub-js'
//2.兄弟组件绑定一个事件并执行回调函数
<button @click="sendStudentName">学生名给school组件</button>
//3.回调函数中执行自定义事件并传入参数(发布订阅)
  methods: {
    sendStudentName () {
      pubsub.publish('hello', 666)
    }
  },

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

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

相关文章

【表面缺陷检测】基于yolov5的布匹表面缺陷检测(附代码和数据集)

写在前面: 首先感谢兄弟们的订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 路虽远,行则将至;事虽难,做则必成。只要有愚公移山的志气、滴水穿石的毅力,脚踏实地,埋头苦干,积跬步以至千里,就…

Mybatis Plus 入门 简单的CRUD 使用详解 条件查询 分页查询 DML操作 MP代码生成器

Mybatis Plus入门 MP是 MybatisPlus&#xff0c;简称MP&#xff0c;是一个 Mybatis 的增强工具&#xff0c;在 Mybatis 的基础上只做增强不做改变。MP为简化开发、提高效率而生。 它已经封装好了单表curd方法&#xff0c;我们直接调用这些方法就能实现单表CURD。 注意&#xf…

一分钟图情论文:《AIGC驱动的智慧图书馆转型:框架、路径与挑战》

一分钟图情论文&#xff1a;《AIGC驱动的智慧图书馆转型&#xff1a;框架、路径与挑战》 AIGC&#xff08;Artificial Intelligence Generated Content&#xff09;是一种全新的生产方式&#xff0c;利用人工智能技术自动生成文本、图片、语音、视频甚至虚拟现实等各种形式的数…

5 创建映射

5 映射 上边章节安装了ik分词器&#xff0c;如果在索引和搜索时去使用ik分词器呢&#xff1f;如何指定其它类型的field&#xff0c;比如日期类型、数 值类型等。 本章节学习各种映射类型及映射维护方法。 5.1 映射维护方法 1、查询所有索引的映射&#xff1a; GET&#xf…

【MCAL_UART】-1.2-图文详解RS232,RS485和MODBUS的关系

目录 1 UART&#xff0c;RS232和RS485通信拓扑 2 什么是RS232 2.1 RS232标准的演变 2.2 RS232标准讲了哪些 2.2.1 RS232通信的电平 2.2.2 RS232通信的带宽 2.2.3 RS232通信距离 2.2.4 RS232通信的机械接口 3 什么是RS485 3.1 RS485标准的演变 3.2 RS485标准讲了哪些…

java运算符和表达式

文章目录 一、Java运算符和表达式二、Java算数运算符实例讲解三、Java关系运算符实例讲解四、Java逻辑运算符实例讲解五、Java位运算符实例讲解六、Java赋值运算符实例讲解七、Java条件运算符实例讲解八、Java instanceof运算符实例讲解九、Java运算符的优先级和结合性总结 一、…

steam/CSGO搬砖绝对是副业中的天花板

这个项目的主要逻辑就是——把Steam上CSGO的装备卖到国内上的平台&#xff0c;网易buff去交易赚一个汇率差。 这玩法有点像新疆出产的棉花占全国产量的85%&#xff0c;当地产量大&#xff0c;价格相对其他不产棉花的地区来说&#xff0c;自然就便宜了&#xff1b; 那么就会有商…

gazebo仿真

常用的仿真器 nvidia 场景非常真实&#xff0c;收费 物理仿真比较好&#xff0c;渲染差一点 为什么用仿真器&#xff0c;因为比较穷 gazebo与ros集成的比较好&#xff0c;有很多插件&#xff0c;机器人开发 刚体仿真器 ode 安装gazebo ros自带 机器人算法开发与验证 打开…

2023年湖北武汉安全员ABC报名条件和报名资料是什么?全国通用?

2023年湖北武汉安全员ABC报名条件和报名资料是什么&#xff1f;全国通用&#xff1f; 一、湖北安全员ABC报名条件要求&#xff1a; 1.安全员A证针对的是企业主要负责人&#xff0c;包括法定代表人、总经理&#xff08;总裁&#xff09;、分管安全生产的副总经理&#xff08;副…

java版本spring cloud 企业电子招投标采购系统源码之首页设计

​ ​功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 全程数字化的采购管理 智能化平台化电子化内外协同 明理满足采购业务全程数字化&#xff0c; 实现供应商管理、采购需求、全网寻源、全网比价、电子招 投标、合同订单执行的…

医疗血氧仪方案产品规格书

血氧仪是一种测量人体血氧饱和度的医疗设备&#xff0c;它通过指夹感应器将光源通过皮肤照射到血液中&#xff0c;测量出血液的血氧饱和度&#xff0c;从而帮助医生判断患者是否有缺氧的情况。下面是一份血氧仪产品规格书&#xff0c;具体内容如下&#xff1a; 产品名称&#x…

select、poll、epoll之间的区别总结[整理]

select&#xff0c;poll&#xff0c;epoll都是IO多路复用的机制。I/O多路复用就通过一种机制&#xff0c;可以监视多个描述符&#xff0c;一旦某个描述符就绪&#xff08;一般是读就绪或者写就绪&#xff09;&#xff0c;能够通知程序进行相应的读写操作。但select&#xff0c;…

gitlab cicd

CICD是指持续集成和部署&#xff0c;一般涵盖以下过程 常规步骤如下&#xff1a; 1、代码开发 2、代码提交(dev分支) 3、 持续集成自动检查和编译 包含&#xff1a;1、sonar初步检查&#xff0c;代码规范 2、自动编译&#xff0c;代码正确性检查 3、单元测试&#xff0c;goo…

2023年,网络安全方面 5 大值得学习的编程语言

Python 到目前为止&#xff0c;Python 在网络安全领域一直处于领先地位。这是一种通用的服务器端脚本语言&#xff08;无需编译&#xff09;&#xff0c;已经被应用到成千上万的安全项目中。你会发现绝大多数安全工具和 PoCs 都是用 Python 编写的&#xff0c;这样做是有充分理…

Introduction to modern Cryptography 现代密码学原理与协议第三章笔记

在第二章中讨论的安全叫信息理论安全或完美安全&#xff0c;因为他们的安全性是基于敌手没有足够的信息来成功地完成攻击&#xff0c;而不管敌手地计算能力。 计算安全比信息理论安全要稍微弱一些&#xff0c;也是大多数现代密码学构造方法的目标。由于完美安全所需密钥的长度过…

前任临终前想要见你最后一面,你会去吗?(feat.安全出口fm 贴心闺蜜)

点击文末“阅读原文”即可参与节目互动 特别感谢 / 深夜谈谈播客网络、阿那亚 后期 / 老段 监制 / 姝琦 运营 / 卷圈&#xff0c;Sand 封面 / 姝琦MidJourney 产品统筹 / bobo 场地支持 / 空岛studio 节目主播&#xff1a;姝琦 / 馋虫 / 薇塔 / 老段 录制时间&#xff1a…

【SpringCloud01】

SpringCloud01 1.认识微服务1.0.学习目标1.1.单体架构1.2.分布式架构1.3.微服务1.4.SpringCloud1.5.总结 2.服务拆分和远程调用2.1.服务拆分原则2.2.服务拆分示例2.2.1.导入Sql语句2.2.2.导入demo工程 2.3.实现远程调用案例2.3.1.案例需求&#xff1a;2.3.2.注册RestTemplate2.…

C++——函数模板与类模板

0.关注博主有更多知识 C知识合集 目录 1.泛型编程 2.函数模板 2.1函数模板实例化 2.2函数模板参数的匹配原则 3.类模板 4.模板的分离编译 1.泛型编程 实际上泛型编程的难度是比较高的&#xff0c;但我们泛型编程的初学者&#xff0c;当然要从简单的地方开始入手。 我…

重磅!OpenAI最新研究:用GPT-4解释神经元行为,网友:AI套娃?

来源 | 机器之心 这就是 GPT 的「抽象」&#xff0c;和人类的抽象不太一样。 虽然 ChatGPT 似乎让人类正在接近重新创造智慧&#xff0c;但迄今为止&#xff0c;我们从来就没有完全理解智能是什么&#xff0c;不论自然的还是人工的。 认识智慧的原理显然很有必要&#xff0c;如…

K8S 部署 seata

文章目录 创建 Deployment 文件创建 ConfigMap 文件创建 Service 文件运行访问高可用部署踩坑 官方文档 k8s中volumeMounts.subPath的巧妙用法 创建 Deployment 文件 deploymemt.yaml namespace&#xff1a;指定命名空间image&#xff1a;使用 1.5.2 版本的镜像ports&#xf…