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

目录

前言

父子组件

父传子

子传父

全局事件总线

什么叫全局事件总线

如何创建全局事件总线

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

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

兄弟组件

消息订阅与发布

安装

使用

爷孙组件


前言

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

父子组件

父传子

在父组件中

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

<template>
  <div id="app">
    <MySon name="zs" age=20 gender="男"></MySon>
    
  </div>
</template>

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

export default {
  name: 'App',
  components: {
    MySon
  }
}
</script>

在子组件中

使用props配置项接收

<template>
 <div>
  姓名:{{ name }}
  年龄:{{ age }}
  性别:{{ gender }}
 </div>
</template>

<script>
export default {
  name:'MySon',
  props:['name','age','gender']
}
</script>

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

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

子传父

在父组件中

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

<template>
  <div id="app">
    <MySon  @event1="think"></MySon>
    
  </div>
</template>

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

export default {
  name: 'App',
  components: {
    MySon
  },
  methods:{
    think(name,age,gender){
      console.log(name,age,gender);
    }
  }
}
</script>

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

在子组件用

ref='组件名'

在mounted钩子函数中

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

<template>
  <div id="app">
    <MySon  ref="MySon"></MySon>
  </div>
</template>

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

export default {
  name: 'App',
  components: {
    MySon
  },
  methods:{
    think(name,age,gender){
      console.log(name,age,gender);
    }
  },
  mounted(){
    this.$refs.MySon.$on('event1',this.think)
  }
}
</script>

在子组件中

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

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

传递成功

全局事件总线

什么叫全局事件总线

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

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

$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

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

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

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

兄弟组件

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

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

在MySon组件中

<template>
 <div>
  <button @click="think2()">传递</button>
 </div>
</template>
<script>
export default {
  name:'MySon',
  data(){
    return {
      name:'haha',
      age:18,
      gender:'女'
    }
  },
  mounted(){
    this.x.$on('event2',this.think3)
  },
  methods:{
    think2(){
      this.$emit('event1',this.name,this.age,this.gender)
    },
    think3(name,age,gender){
     this.name=name
     this.age=age
     this.gender=gender
    }
  }
}
</script>

在MyBrother组件中

将data中的数值传给MySon

<template>
  <div>
    <button @click="emit">发送</button>
  </div>
</template>

<script>
export default {
   name:'MyBrother',
    data(){
        return {
            name:'兄弟',
            age:20,
            gender:'男'
        }
    },
    methods:{
        emit(){
            this.x.$emit('event2',this.name,this.age,this.gender)
        }
    }
}
</script>

原MySon中的data数据

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

成功传递

消息订阅与发布

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

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

需要安装js第三方库

pubsub-js

pub:publish(发布)

sub:subscribe(订阅)

安装

npm i pubsub-js

使用

发布消息:

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

订阅消息:

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

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

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

爷孙组件

在孙组件中

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

<template>
  <div>
    <button @click="think">发布消息</button>
  </div>
</template>

<script>
import pubsub from 'pubsub-js'
export default {
    name:'GrandSon',
    data(){
        return {
            msg:'消息发布成功'
        }
    },
    methods:{
        think(){
            pubsub.publish('发布消息',this.msg)
        }
    }
}
</script>

在爷爷组件中

在mounted钩子函数中

<template>
  <div id="app">
    <GrandSon></GrandSon>
  </div>
</template>

<script>
import pubsub from 'pubsub-js'
import GrandSon from './components/GrandSon.vue';
export default {
  name: 'App',
  components: {
    GrandSon
  },
  mounted(){
    pubsub.subscribe('发布消息',function(messageName,message){
      console.log(messageName,message);
    })
  }
}
</script>

效果

成功传递了数据

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件平台架构设计与技术管理之道笔记

软件平台架构设计与技术管理之道笔记 认知 领导软件平台各方面的工作&#xff0c;对技术底蕴、思维模式、决策能力、工作风格、文化铸造等方面都有极高的要求&#xff0c;可以称之为“领域智慧”。认知盲区的代价是巨大的&#xff0c;“不知”比“不会”的后果更严重&#xf…

【VRTK】【VR开发】【Unity】10-连续移动

课程配套学习资源下载 https://download.csdn.net/download/weixin_41697242/88485426?spm=1001.2014.3001.5503 【概述】 连续移动与瞬移有如下不同: 连续移动不容易打断沉浸对于新手或者不适应者来说更容易晕动 我对玩家的建议:连续移动前后左右可以用摇杆,转向用自己…

是时候重估荣耀了

文 | 智能相对论 作者 | 叶远风 在更换董事长后&#xff0c;荣耀的上市计划总算落定。 除了“借壳”被否认&#xff0c;外界对荣耀所有上市的猜想基本都被印证&#xff0c;此外CEO赵明明确表示会在境内上市。 在三年的长途奔袭后&#xff0c;毫无疑问荣耀来了到一个重要关口…

【电源专题】什么是电源管理

电源管理为什么重要? 在电子系统和电路的设计中,负载往往需要恒定的电流电压,所以最先考虑的就是电源电路的设计。电源管理所考虑的问题是如何将电源有效分配给系统的不同组件,保障系统不同的负载正常运行。 如电源的输入是交流 (AC) 或直流 (DC)?输入电压是高于或低于输…

JavaEE之多线程编程(一):基础篇

文章目录 一、关于操作系统一、认识进程 process二、认识线程三、进程和线程的区别&#xff08;重点&#xff01;&#xff09;四、Java的线程和操作系统线程的关系五、第一个多线程编程 一、关于操作系统 【操作系统】 驱动程序&#xff1a; 如&#xff1a;我们知道JDBC的驱动程…

centos7 设置静态ip

文章目录 设置VMware主机设置centos7 设置 设置VMware 主机设置 centos7 设置 vim /etc/sysconfig/network-scripts/ifcfg-ens33重启网络服务 service network restart检验配置是否成功 ifconfig ip addr

工程师业余生活之制作蔬菜盆景

工程师业余生活陶冶情操之制作蔬菜盆景 &#xff08;蔬 果 盆 景 裝 點 家 居&#xff09; 市場上好多蔬菜瓜果,稍用一些心思,將一些價廉的蔬果製成別致的盆景, 便能使家居充滿自然氣息&#xff0c;增添生活情趣。以下介紹幾種製作方法&#xff1a; 【番薯盆景】 (番薯又名地…

百望云供应链协同解决方案入选北大创新评论产业研究案例库

11月28日-29日&#xff0c;百望云受邀出席《北大创新评论》2023 Inno China 中国产业创新大会&#xff0c;从战略构建、生态塑造、科技创新等议题出发&#xff0c;与学术专家、产业专家、企业代表共赴盛会&#xff0c;思享汇聚。会上&#xff0c;《北大创新评论产业研究案例库&…

C++数据结构:B树

目录 一. 常见的搜索结构 二. B树的概念 三. B树节点的插入和遍历 3.1 插入B树节点 3.2 B树遍历 四. B树和B*树 4.1 B树 4.2 B*树 五. B树索引原理 5.1 索引概述 5.2 MyISAM 5.3 InnoDB 六. 总结 一. 常见的搜索结构 表示1为在实际软件开发项目中&#xff0c;常用…

Telegram premium会员开通教程

这里说的是电脑端开通教程 1、在搜索栏输入Premium BOT 2、点击按月付款 3、这里使用Fomepay的428813的卡支付即可 4、点击下一步之后&#xff0c;需要填写账单地址&#xff0c;把Fomepay卡提供的账单地址填写上去即可 5、开通成功

进入软件的世界

选择计算机 上高中的时候&#xff0c;因为沉迷于网络游戏&#xff0c;于是对计算机产生了浓厚的兴趣&#xff0c;但是那个时候对于计算机的了解还是非常肤浅的。上大学的时候&#xff0c;也就义无反顾的选择了计算机专业&#xff0c;其实并不是一个纯粹的计算机专业&#xff0…

chown和chmod

chown和chmod都是在Linux和Unix系统中用于设置文件和文件夹权限的命令&#xff0c;但它们的功能和用途有所不同。 功能&#xff1a;chown主要用于修改文件或文件夹的所有者和所属组&#xff0c;而chmod则主要用于修改文件或文件夹的读写执行权限。用途&#xff1a;如果想要授权…

热门文章采集器【2023】

自媒体成为了许多人追逐的梦想&#xff0c;而爆文则是迈向成功的关键一步。随着越来越多的内容涌现&#xff0c;如何找到独特而引人注目的素材成为了自媒体创作者们面临的难题。本文将深入讲解当下热门的文章采集器&#xff0c;分享使用过的工具经验。 1.文章采集器的作用&…

prime靶机打靶记录

靶机下载地址 https://download.vulnhub.com/prime/Prime_Series_Level-1.rar nmap搜索目标 使用nmap -sn 192.168.41.0/24找到目标靶机192.168.41.136 扫描端口&#xff0c;因为是靶机&#xff0c;所以速率直接调了10000 扫出来两个端口22和80&#xff0c;进行详细的扫描 没…

使用JDBC连接和操作数据库以及myBatis初级入门

JDBC简介和使用 java程序操作数据库的方式有很多种&#xff0c;下面列举一些市面上常用的方式&#xff1a; 从图片分析的知&#xff1a; MyBatis MyBatisPlus 这两个所占的比重比较大。都是用于简化JDBC开发的 JDBC&#xff1a;(Java DataBase Connectivity)&#xff0c;就…

QT 无法打开包括文件 “xxxx.h”: No such file or direcotry 提升控件后提示找不到头文件

问题复现 UI文件提升控件后&#xff0c;提示找不到头文件。 原因 Qt中的ui文件会经过moc编辑器生成ui_xxx.h头文件。 在主页面的ui文件中因为使用了提升的widget&#xff0c;所以ui的ui头文件因该包含自定义控件的头文件。但是头文件的路径可以看出已经错误了。 #include &…

五、分支和循环

目录 1. if 语句 1.1 if 1.2 else 1.3 分支中包含多条语句 1.4 嵌套 if 1.5 悬空 else 问题 2. 关系操作符 3. 条件操作符 4. 逻辑操作符&#xff1a; &&&#xff0c;|| &#xff0c;&#xff01; 4.1 逻辑取反运算符 &#xff01; 4.2 与运算符 &&…

Day50力扣打卡

打卡记录 三个无重叠子数组的最大和 链接 滑动窗口 class Solution:def maxSumOfThreeSubarrays(self, nums: List[int], k: int) -> List[int]:n, ans len(nums), []sum1 sum2 sum3 0maxsum1idx, maxsum12idx 0, ()maxsum1 maxsum12 total 0for i in range(2 * …

LeetCode力扣每日一题(Java):9、回文数

一、题目 二、解题思路 1、我的思路 当x<0时&#xff0c;x一定不是回文数&#xff0c;直接返回false 当x>0且x<10时&#xff0c;x一定是回文数&#xff0c;直接返回true x>10时&#xff0c;先将x转为字符串。将数字转成字符串方法挺多的&#xff0c;以下是&…

C++作业5

完成沙发床的多继承&#xff08;有指针成员&#xff09; 代码&#xff1a; #include <iostream>using namespace std;class Bed { private:double *money; public:Bed(){cout << "Bed::无参构造函数" << endl;}Bed(double money):money(new doub…