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=namethis.age=agethis.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>

效果

成功传递了数据

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

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

相关文章

写 SVG 动画必看!SVG系列文章3-动画标签

1、SMIL animation概览 SMIL不是指「水蜜梨」&#xff0c;而是Synchronized Multimedia Integration Language&#xff08;同步多媒体集成语言&#xff09;的首字母缩写简称&#xff0c;是有标准的。本文所要介绍的SVG动画就是基于这种语言。 SMIL允许你做下面这些事情&#…

单基因也可以这么做,经典生信文章思路,简单易复现更可升级

今天给同学们分享一篇生信文章“High Expression of PSRC1 Predicts Poor Prognosis in Lung Adenocarcinoma”&#xff0c;这篇文章发表在J Cancer期刊上&#xff0c;影响因子为3.9。 结果解读&#xff1a; LUAD和LUSC中PSRC1表达高 从TCGA数据集中&#xff0c;有535名LUAD患…

Redis实战篇笔记(最终篇)

Redis实战篇笔记&#xff08;七&#xff09; 文章目录 Redis实战篇笔记&#xff08;七&#xff09;前言达人探店发布和查看探店笔记点赞点赞排行榜 好友关注关注和取关共同关注关注推送关注推荐的实现 总结 前言 本系列文章是Redis实战篇笔记的最后一篇&#xff0c;那么到这里…

集成开发环境PyCharm的使用【侯小啾python基础领航计划 系列(三)】

集成开发环境 PyCharm 的使用【侯小啾python基础领航计划 系列(三)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹…

从零开始实现神经网络(二)_CNN卷积神经网络

参考文章: 介绍卷积神经网络1 介绍卷积神经网络2 在过去的几年里&#xff0c;关于卷积神经网络&#xff08;CNN&#xff09;的讨论很多&#xff0c;特别是因为它们彻底改变了计算机视觉领域。在这篇文章中&#xff0c;我们将建立在神经网络的基本背景知识的基础上&#xff0c;探…

2023/12/4JAVAmysql

流程控制函数 部门不存在,这个不存在交集,所有没出现

【Docker实操】创建一个Node服务

一、安装node 请查看阿里云官网教程&#xff1a;如何快速部署Node.js项目。&#xff08;注意要在根目录操作&#xff09;apt install nodejs、apt install npm执行上面两个命名来安装 安装完成后&#xff0c;执行node -v、npm -v&#xff0c;如果出现版本&#xff0c;就是安装…

你好!斐波那契查找【JAVA】

1.有幸遇见 斐波那契查找算法&#xff0c;也称黄金分割查找算法&#xff0c;是一种基于斐波那契数列的查找算法。与二分查找类似&#xff0c;斐波那契查找也是一种有序查找算法&#xff0c;但它的查找点不是中间位置&#xff0c;而是根据斐波那契数列来确定&#xff0c;因此又称…

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

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

4K-Resolution Photo Exposure Correction at 125 FPS with ~8K Parameters

MSLTNet开源 | 4K分辨率125FPS8K的参数量&#xff0c;怎养才可以拒绝这样的模型呢&#xff1f; 错误的曝光照片的校正已经被广泛使用深度卷积神经网络或Transformer进行广泛修正。尽管这些方法具有令人鼓舞的表现&#xff0c;但它们通常在高分辨率照片上具有大量的参数数量和沉…

avue页面布局 api 引用

展示 index.vue <template><basic-container><avue-crud :option"option":table-loading"loading":data"data":page"page":permission"permissionList":search.sync"search":before-closebefore…

GitHub项目推荐-Deoldify

有小伙伴推荐了一个老照片上色的GitHub项目&#xff0c;看了简介&#xff0c;还不错&#xff0c;推荐给大家。 项目地址 GitHub - SpenserCai/sd-webui-deoldify: DeOldify for Stable Diffusion WebUI&#xff1a;This is an extension for StableDiffusions AUTOMATIC1111 w…

多多情报通:助力拼多多商家选品运营的数据分析工具

多多情报通&#xff08;原名多多参谋&#xff09;是一款专为拼多多商家设计的数据分析工具&#xff0c;旨在帮助商家进行选品、运营优化和提高销售业绩。通过多多情报通&#xff0c;商家可以更好地了解市场趋势、消费者需求和竞争对手状况&#xff0c;从而制定有效的运营策略。…

RH850P1X芯片学习笔记-Pin Functions

文章目录 Pin Connection Diagrams术语定义 Pin ListPort OverviewIntroductionFunctional OverviewPort CategoryOperation Mode运行模式 Port Function寄存器地址映射 Port寄存器描述Pn/JP0 — Port RegisterPPRn/JPPR0 — Port Pin Read RegisterPMn/JPM0 — Port Mode Regi…

VSCode 开发C/C++实用插件分享——koroFileHeader

相关文章 VSCode 开发C/C实用插件分享——codegeex VSCode 开发C/C实用插件分享——koroFileHeader 一、koroFileHeader二、使用步骤1.安装2.头文件注释配置3.函数注释配置 一、koroFileHeader 在有些场景下&#xff0c;我们需要在文件头添加一些作者、文件描述、时间和版权描述…

Redis主从复制实现RCE

文章目录 前置知识概念redis常用命令redis module 利用条件利用工具思路例题 [网鼎杯 2020 玄武组]SSRFMe方法一方法二 总结 前置知识 概念 背景是多台服务器要保存同一份数据&#xff0c;如何实现其一致性呢&#xff1f;数据的读写操作是否每台服务器都可以处理&#xff1f;这…

线性规划问题

线性规划问题&#xff1a; 将约束条件及目标函数都是决策变量的线性函数的规划问题称为线性规划问题 一般线性规划问题的描述&#xff1a; 为了解决这类问题&#xff0c;首先需要确定问题的决策变量:然后确定问题的目标&#xff0c;并将目标表示为决策变量的线性函数;最后找出问…

python之ddddocr快速识别

1. 安装模块 pip install ddddocr -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com2. 编写代码 import ddddocr # 导入orc模块 import logging # 导入日志 logging.getLogger().setLevel(logging.INFO) # 设置日志级别 def ComputeCode(path):try:logg…

Trello软件:从功能、使用技巧到替代软件等,一文弄懂项目管理必备工具!

Trello是什么&#xff1f; Trello是一款基于Web的可视化项目管理工具&#xff0c;它旨在提供一种灵活、易于理解和使用的任务管理系统。Trello将复杂的项目管理流程简化为直观的卡片和列表&#xff0c;使团队成员能轻松看到整个项目的状态&#xff0c;并了解自己的责任和任务。…

VPS服务器”性价比之王”系列:RackNerd

2023 黑五&#xff01;&#xff01;&#xff01;新 Ryzen 系列 洛杉矶dc02机房重新补货&#xff01; 支付方式&#xff1a;支付宝、PayPal、信用卡、数字货币 2023 黑五促销活动&#xff08;限量&#xff09; CPU内存硬盘(SSD)流量带宽价格(续费同价)购买链接1核768 MB15GB…