Web前端 —- 【vue】vue 组件传值(props、全局事件总线、消息的订阅与发布)

63,212次阅读
没有评论

共计 3057 个字符,预计需要花费 8 分钟才能阅读完成。

Web 前端 ----【vue】vue 组件传值(props、全局事件总线、消息的订阅与发布)

目录

前言

父子组件

父传子

子传父

全局事件总线

什么叫全局事件总线

如何创建全局事件总线

如何在组件上获取到这个全局 vc 对象

最常用的创建全局事件总线

兄弟组件

消息订阅与发布

安装

使用

爷孙组件


前言

在上篇文章我们介绍了父子组件之间的传值通信,本文将介绍不仅限于父子组件之间的传值通信,还包括兄弟组件、爷孙组件之间的通信传值。以下方法暂未涉及到 Vue3 中新提供的方法

父子组件

父传子

在父组件中

给需要传递数值的子组件绑定属性

Web 前端 ----【vue】vue 组件传值(props、全局事件总线、消息的订阅与发布)



在子组件中

使用 props 配置项接收

Web 前端 ----【vue】vue 组件传值(props、全局事件总线、消息的订阅与发布)



传递成功,在页面上成功渲染

Web 前端 ----【vue】vue 组件传值(props、全局事件总线、消息的订阅与发布)

以上介绍的是基本的而 props 配置项,props 详情配置项请看这篇文章

子传父

在父组件中

@自定义事件名 =’ 回调函数 ’

Web 前端 ----【vue】vue 组件传值(props、全局事件总线、消息的订阅与发布)



也可以通过代码来实现自定义事件绑定

Web 前端 ----【vue】vue 组件传值(props、全局事件总线、消息的订阅与发布)

在子组件用

ref=’ 组件名 ’

在 mounted 钩子函数中

this.$refs.ref 定义的组件名.$on(‘ 自定义的事件名 ’,函数)



在子组件中

this.$emit(‘ 自定义事件名 ’,传递的数值)

将子组件中数值传给父组件

Web 前端 ----【vue】vue 组件传值(props、全局事件总线、消息的订阅与发布)

传递成功

Web 前端 ----【vue】vue 组件传值(props、全局事件总线、消息的订阅与发布)

全局事件总线

什么叫全局事件总线

在介绍兄弟组件和爷孙组件前,先介绍全局事件总线

由上面的子组件向父组件传递数值可以得出

$on:是用来绑定事件的

$emit: 是用来触发事件的

例:

子组件向父组件传递数值

所以子组件使用的是 $emit

父组件使用的是 $on

全局事件总线就是在所有的组件外面定义一个全局的 vc 对象,由上面的例子可得

不论是在父组件中用来绑定事件的 $on 前的

this.$refs. 组件实例

还是在子组件中用来触发事件的 $emit 前的

this

都是指向 vc 组件实例的,说明 vc 实例身上是同时拥有 $on 和 $emit 的

此时我们定义一个全局的 vc 对象,所有的组件都可以共享

那么我们定义的这个全局的 vc 对象就叫做全局事件总线

如何创建全局事件总线

既然是创建全局事件对象,所以我们找到 main.js 文件

使用

vue.extend({})

创建构造函数

再 new 一个 vc 实例对象

// 获取 VueComponent 构造函数
const VueComponent = Vue.extend({})
// 创建共享的 vc 对象
const globalvc = new VueComponent()

如何在组件上获取到这个全局 vc 对象

利用 vue 的原型对象,vue 做了特殊处理,vc 也可以获取到 vue 原型对象身上的属性

vue.prototype. 任意的属性名 = 我们创建的 vc 对象

// 拓展原型对象的属性
Vue.prototype.x=globalvc

Web 前端 ----【vue】vue 组件传值(props、全局事件总线、消息的订阅与发布)

// 获取 VueComponent 构造函数
const VueComponent = Vue.extend({})
// 创建共享的 vc 对象
const globalvc = new VueComponent()
// 拓展原型对象的属性
Vue.prototype.x=globalvc

最常用的创建全局事件总线

Web 前端 ----【vue】vue 组件传值(props、全局事件总线、消息的订阅与发布)

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

兄弟组件

由上可知全局事件总线可以给任意的组件之间进行通信

将 MyBrother 组件上的数据传给兄弟组件 MySon

在 MySon 组件中

Web 前端 ----【vue】vue 组件传值(props、全局事件总线、消息的订阅与发布)


在 MyBrother 组件中

将 data 中的数值传给 MySon

Web 前端 ----【vue】vue 组件传值(props、全局事件总线、消息的订阅与发布)



原 MySon 中的 data 数据

Web 前端 ----【vue】vue 组件传值(props、全局事件总线、消息的订阅与发布)

当触发自定义事件时,也就是将 MyBrother 组件中的数值传过去

Web 前端 ----【vue】vue 组件传值(props、全局事件总线、消息的订阅与发布)

成功传递

消息订阅与发布

与全局事件总线一样可以在任何组件之间通信(但是不常用,建议用全局事件总线)

分为消息发布方和消息订阅方

需要安装 js 第三方库

pubsub-js

pub:publish(发布)

sub:subscribe(订阅)

安装

npm i pubsub-js

使用

发布消息:

 pubsub.publish(‘ 自定义发布消息的名称 ’, 发布的消息)

订阅消息:

后接回调函数,第一个参数是自定义发布消息的名称,第二个参数是发布的消息

  pubsub.subscribe(‘ 与发布消息自定义的名称一致 ’,function(messageName,message){})

注意,在组件中使用时,需要先导入 import

爷孙组件

在孙组件中

发布消息,将数据传给爷爷组件

Web 前端 ----【vue】vue 组件传值(props、全局事件总线、消息的订阅与发布)



在爷爷组件中

在 mounted 钩子函数中

Web 前端 ----【vue】vue 组件传值(props、全局事件总线、消息的订阅与发布)



效果

成功传递了数据

Web 前端 ----【vue】vue 组件传值(props、全局事件总线、消息的订阅与发布)

原文地址: Web 前端 —-【vue】vue 组件传值(props、全局事件总线、消息的订阅与发布)

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于2024-09-30发表,共计3057字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)