vue3学习记录-组件通信

vue3学习记录-组件通信

  • 1.父子组件通信
  • 2.兄弟组件传值
    • 2.1 以父组件为媒介
    • 2.2 发布订阅模式
    • 2.3 使用mitt
      • 2.3.1 全局使用
      • 2.3.2 局部使用

1.父子组件通信

父组件:

<template>父组件原有的title:{{ title }}<p>---</p><com :title="title" :flag="true" @changeTitle="changeTitle"></com>
</template><script setup>
import { computed, ref } from 'vue'
import com from './components/com.vue'
let title = ref('我是标题')
function changeTitle(newTitle){title.value = newTitle
}
</script><style></style>

子组件:

<template><div>我是子组件<p>子组件的title:{{ title }}</p><button @click="changeTitle1">我要给父组件传参</button></div>
</template><script setup>
defineProps({title: {default: '',type: String},flag: Boolean
})
const emit1 = defineEmits(['changeTitle'])
function changeTitle1() {emit1('changeTitle', '我是子组件传给父组件的参数')
}//子传父事件 
//1.const emit1 = defineEmits(['changeTitle'])定义emit
//2.直接在事件后 emit1('changeTitle', '我是子组件传给父组件的参数'),然后父组件接收</script><style lang="scss" scoped></style>

defineProps父传子定义,defineEmits子传父定义

2.兄弟组件传值

2.1 以父组件为媒介

//App.vue
<script setup>
import A from './components/A.vue';
import B from './components/B.vue';
import { ref } from 'vue';
const mainFlag = ref(false)
const clickEvent1 = (val) => {mainFlag.value = valconsole.log('clickEvent', val);
};
</script><template><A @clickEvent="clickEvent1"></A><B :mainFlag="mainFlag"></B>
</template><style scoped></style>//A.vue
<template><div class="container"><p>我是A组件</p><el-button @click="clickEvent1">分发事件</el-button></div></template><script setup>import { ref, reactive} from 'vue'const flag = ref(false)const clickEvent1 = () =>{flag.value =!flag.valueemit1('clickEvent',flag.value)}const emit1 = defineEmits(['clickEvent'])</script><style lang='scss' scoped>.container{width: 200px;height: 200px;background-color: lightcoral;margin-bottom: 10px;}</style>
//B.vue
<template><div class="container"><p>我是B组件</p>{{ mainFlag }}</div>
</template><script setup>
import { ref, reactive } from 'vue'
defineProps({mainFlag: {type: Boolean,required: true}
})</script>
<style lang='scss' scoped>
.container {width: 200px;height: 200px;background-color: lightblue;
}
</style>

A组件分发事件给父组件,父组件再把值传给B组件。这样是可以的,但是写法不太简易,层级多了就要递传。

2.2 发布订阅模式

// eventBus.jsclass EventBus {constructor() {this.events = new Map();}// 订阅事件on(eventName, callback) {if (!this.events.has(eventName)) {this.events.set(eventName, []);}this.events.get(eventName).push(callback);}// 取消订阅off(eventName, callback) {if (!this.events.has(eventName)) return;const callbacks = this.events.get(eventName);const index = callbacks.indexOf(callback);if (index !== -1) {callbacks.splice(index, 1);}}// 发布事件emit(eventName, ...args) {const callbacks = this.events.get(eventName) || [];callbacks.forEach(callback => callback(...args));}
}export default new EventBus();

2.3 使用mitt

安装依赖

npm install mitt

2.3.1 全局使用

//main.js
import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
import mitt from 'mitt'const emitter = mitt()const app = createApp(App)
app.config.globalProperties.$EventBus = emitterapp.mount('#app')<!-- ComponentA.vue -->
<script setup>
import { ref,getCurrentInstance } from 'vue'
const message = ref('')
const { proxy } = getCurrentInstance()
const sendMessage2 = () => {proxy.$EventBus.emit('new-message', message.value)message.value = ''
}
onBeforeUnmount(() =>{proxy.$EventBus.off('new-message')
})
</script>
<template><div><input v-model="message" placeholder="输入消息" /><button @click="sendMessage2">发送消息2</button></div>
</template><!-- ComponentB.vue -->
<script setup>
import { ref, onMounted, onUnmounted,getCurrentInstance } from 'vue'
const receivedMessages = ref([])
const {proxy} = getCurrentInstance()const onNewMessage = (msg) => {receivedMessages.value.push(msg)
}
onMounted(() => {proxy.$EventBus.on('new-message', onNewMessage)
})
onUnmounted(() => {proxy.$EventBus.off('new-message', onNewMessage)
})
</script>
<template><div><h2>接收到的消息:</h2><ul><li v-for="(msg, index) in receivedMessages" :key="index">{{ msg }}</li></ul></div>
</template>

2.3.2 局部使用

// eventBus.js
import { ref } from 'vue'
import mitt from 'mitt'const emitter = mitt()
const bus = ref(emitter)export default bus<!-- ComponentA.vue -->
<script setup>
import { ref, getCurrentInstance, onBeforeUnmount } from 'vue'
import bus from '../eventBus'const message = ref('')
const { proxy } = getCurrentInstance()const sendMessage = () => {bus.value.emit('new-message', message.value)message.value = ''
}const sendMessage2 = () => {proxy.$EventBus.emit('new-message', message.value)message.value = ''
}
onBeforeUnmount(() => {proxy.$EventBus.off('new-message')bus.value.off('new-message')}
)</script><template><div><input v-model="message" placeholder="输入消息" /><button @click="sendMessage">发送消息</button><button @click="sendMessage2">发送消息2</button></div>
</template><!-- ComponentB.vue -->
<script setup>
import { ref, onMounted, onUnmounted,getCurrentInstance } from 'vue'
import bus from '../eventBus'const receivedMessages = ref([])
const {proxy} = getCurrentInstance()const onNewMessage = (msg) => {receivedMessages.value.push(msg)
}onMounted(() => {proxy.$EventBus.on('new-message', onNewMessage)bus.value.on('new-message', onNewMessage)
})onUnmounted(() => {proxy.$EventBus.off('new-message', onNewMessage)bus.value.off('new-message', onNewMessage)
})
</script><template><div><h2>接收到的消息:</h2><ul><li v-for="(msg, index) in receivedMessages" :key="index">{{ msg }}</li></ul></div>
</template>

其实试了下,两个都可以一起用。
在这里插入图片描述

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

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

相关文章

MyBatis入门之一对一关联关系(示例)

【图书介绍】《SpringSpring MVCMyBatis从零开始学&#xff08;视频教学版&#xff09;&#xff08;第3版&#xff09;》-CSDN博客 《SpringSpring MVCMyBatis从零开始学(视频教学版)&#xff08;第3版&#xff09;》(杨章伟&#xff0c;刘祥淼)【摘要 书评 试读】- 京东图书 …

FreeRTOS实时操作系统(1)

前言&#xff1a;FreeRTOS内容较多&#xff0c;分篇发布&#xff0c;较为基础&#xff0c;旨在梳理知识&#xff0c;适合入门的同学 &#xff08;基于正点原子STM32F103开发板V2&#xff09; &#xff08;对于本篇&#xff0c;若有疑问&#xff0c;欢迎在评论区留言&#…

Wooden UI(木头UI纹理按钮边框 背景图标 带PNG素材)

资源包包含以下元素&#xff1a;按钮、图标、框架、复选框等&#xff0c;提供分层的 PSD 文件。 下载&#xff1a;​​Unity资源商店链接资源下载链接 效果图&#xff1a;

橡皮鸭调试法(Rubber Duck Debugging)

橡皮鸭调试法&#xff08;Rubber Duck Debugging&#xff09;是一种编程中的调试技巧&#xff0c;名字来源于一本书《The Pragmatic Programmer》&#xff0c;其中提到程序员可以把问题讲给一只橡皮鸭听&#xff0c;以便在讲解的过程中梳理思路并找到问题的根源。 基本原理&am…

微服务基础架构(图)

微服务基础架构是一种现代化的软件架构模式&#xff0c;旨在将大型复杂的应用程序拆分为多个小型、独立的服务。每个微服务专注于特定的业务功能&#xff0c;可独立开发、部署和扩展。 在微服务基础架构中&#xff0c;通常会使用轻量级的通信机制&#xff0c;如 RESTful API 或…

RISC-V笔记——RVWMO基本体

1. 前言 RISC-V使用的内存模型是RVWMO(RISC-V Weak Memory Ordering)&#xff0c;它是Release Consistency的扩展&#xff0c;因此&#xff0c;RVWMO的基本特性类似于RC模型。 2. RC模型 Release consistency(RC)的提出是基于一个观察&#xff1a;将所有同步操作用FENCE围在一…

升级Unity后产生的Objects内存泄露现象

1&#xff09;升级Unity后产生的Objects内存泄露现象 2&#xff09;能否使用OnDemandRendering API来显示帧率 3&#xff09;Unity闪退问题 4&#xff09;配置表堆内存如何优化 这是第405篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的热门话题&#xff0c;涵盖了UWA问答…

PHP 8.1.0-dev后门远程命令执行漏洞

#简介 PHP verion 8.1.0-dev于2021年3月28日与后门一起发布&#xff0c;但是后门很快被发现并删除。 #漏洞概述 PHP verion 8.1.0-dev的PHP在服务器上运行&#xff0c;则攻击者可以通过发送User-Agentt标头执行任意代码。 #影响版本 PHP 8.1.0-dev #环境搭建 新建docker…

LLM之RAG实战(四十四)| rag-chatbot:支持Huggingface和Ollama任意模型的多PDF本地RAG方案

特点&#xff1a; 支持本地运行和Kaggle (new)运行支持Huggingface 和Ollama 的任意模型Process multiple PDF inputs.Chat with multiples languages (Coming soon).Simple UI with Gradio. 一、安装使用 1.1 Kaggle&#xff08;推荐&#xff09; Step1&#xff1a;把https…

Android 10.0 Camera2 拍照镜像功能实现

1.前言 在10.0的系统rom定制化开发中,在进行camera2的相关拍照功能开发中,在某些时候会遇到拍照照片 左右镜像的问题,就是照片左半边和右半边是反的,所以就需要在拍照的时候保存图片的时候实现 左右镜像功能,接下来就来分析下拍照保存图片的流程 2.Camera2 拍照镜像功能实…

SQL 干货 | SQL 反连接

最强大的 SQL 功能之一是 JOIN 操作&#xff0c;它提供了一种优雅而简单的方法&#xff0c;将一个表中的每一条记录与另一个表中的每一条记录结合起来。不过&#xff0c;有时我们可能想从一个表中找到另一个表中没有的值。正如我们将在今天的博客文章中看到的&#xff0c;通过包…

图片无损放大工具Topaz Gigapixel AI v7.4.4 绿色版

Topaz A.I. Gigapixel是这款功能齐全的图象无损变大运用&#xff0c;应用可将智能机拍摄的图象也可以有着专业相机的高质量大尺寸作用。你可以完美地放大你的小照片并大规模打印&#xff0c;它根本不会粘贴。它具有清晰的效果和完美的品质。 借助AIGigapixel&#xff0c;您可以…

[Linux网络编程]01-网络基础

此部分为《计算机网络》理论基础&#xff0c;可简要了解 一.计算机网络体系结构 常见的体系结构 OSI体系结构(法律上的国际标准)&#xff1a;物理层->数据链路层->网络层->运输层->会话层->表示层->应用层 TCP/IP体系结构(事实上的国际标准)&#xff1a;…

web网页QQ登录

代码&#xff1a; <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>QQ登录ent</title> </head> <style>ul > li{list-style: none; } a …

13.1 Linux_网络编程_TCP/UDP

字节序 1、概述 什么是字节序&#xff1a; 字节序就是字节的存储顺序&#xff0c;分为大端字节序和小端字节序。 大端字节序&#xff1a;低地址存高位&#xff08;网络&#xff09;小端字节序&#xff1a;低地址存低位&#xff08;主机&#xff09; 检验主机字节序模式&…

【Linux】-权限

&#x1f511;&#x1f511;博客主页&#xff1a;阿客不是客 &#x1f353;&#x1f353;系列专栏&#xff1a;深入代码世界&#xff0c;了解掌握 Linux 欢迎来到泊舟小课堂 &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 ​ 一、权限的概念 在Linux 中&…

开源图像超分ECBSR项目源码分析

相关介绍 项目GitHub地址&#xff1a;https://github.com/xindongzhang/ECBSR项目相关论文&#xff1a;https://www4.comp.polyu.edu.hk/~cslzhang/paper/MM21_ECBSR.pdf&#xff08;也可以点这里下载&#xff09;论文解读&#xff1a;Edge-oriented Convolution Block for Re…

秃姐学AI系列之:语义分割 + 数据集 | 转置卷积 + 代码

语义分割 语义分割将图片中的每个像素分类到对应的类别 通常来说现在的会议软件的背景虚化这个功能用的就是语义分割技术 无人车进行路面识别也是语义分割技术 语义分割 vs 实例分割 语义分割将图像划分为若干组成区域&#xff0c;这类问题的方法通常利用图像中像素之间的相关…

基于Multisim三极管B放大系数放大倍数测量电路设计(含仿真和报告)

【全套资料.zip】三极管B放大系数放大倍数测量电路电路设计Multisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 1.用三个数码管显示B的大小&#xff0c;分别显示个位、十位和百位。 2.显示范围…

【论文精炼分享】GPU Memory Exploitation for Fun and Profit 24‘USENIX

今天分享的论文《GPU Memory Exploitation for Fun and Profit》来自2024年USENIX Security。在本文中&#xff0c;作者团队对 CUDA 程序中的缓冲区溢出问题进行了全面的研究&#xff1a; &#xff08;1&#xff09;对用于访问各种 GPU 内存空间的机制进行了逆向工程&#xff…