vue3中监听,组件通信如父子传值、Vuex、Event Bus的使用

目录

一、监听

二、父子传值:

1、父传子:

2、子传父

三、全局状态管理(Vuex):

四、事件总线(Event Bus):


一、监听

<template><div><p>Count: {{ count }}</p><button @click="increment">Increment</button></div>
</template><script setup>
import { ref, watch } from 'vue';const count = ref(0);const increment = () => {count.value++;
};// 使用 watch 监听 count 的变化
watch(count, (newValue, oldValue) => {console.log(`count changed from ${oldValue} to ${newValue}`);
});
</script>

二、父子传值:

1、父传子:

我们有一个父组件ParentComponent和一个子组件ChildComponent。在父组件中,我们使用:childProp="parentData"将数据传递给子组件。在子组件中,我们使用defineProps来接收父组件传递的属性(props)。

ParentComponent.vue:

<template><div><p>我是父组件</p><ChildComponent :childProp="parentData" /></div>
</template><script setup>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';const parentData = ref('Hello from parent');
</script>

ChildComponent.vue:

<template><div><p>子组件接收的数据: {{ childProp }}</p></div>
</template><script setup>
import { defineProps } from 'vue';const props = defineProps({childProp: String
});
</script>

2、子传父

在父组件中,我们使用 @childEvent="handleChildEvent" 来监听子组件的 childEvent 事件,并在 handleChildEvent 方法中接收子组件传递的数据。这样,当在子组件点击按钮时,子组件会通过自定义事件将数据传递给父组件,父组件监听事件并接收数据。

ChildComponent.vue:

<template><button @click="sendDataToParent">向父组件传递数据</button>
</template><script setup>
import { defineEmits } from 'vue';const emits = defineEmits(['childEvent']);const sendDataToParent = () => {emits('childEvent', 'Hello from child');
};
</script>

在子组件中,我们使用 defineEmits 来定义一个自定义事件 childEvent,然后通过 sendDataToParent 方法触发该事件,并传递数据 'Hello from child'

ParentComponent.vue:

<template><div><p>来自子组件的数据: {{ dataFromChild }}</p><ChildComponent @childEvent="handleChildEvent" /></div>
</template><script setup>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';const dataFromChild = ref('');const handleChildEvent = (data) => {dataFromChild.value = data;
};
</script>

三、全局状态管理(Vuex):

Vuex 是 Vue 官方提供的状态管理库,用于管理应用的共享状态。通过 Vuex,你可以在任何组件中访问和修改全局状态,实现组件之间的数据共享。

以下是一些简单的步骤,以示例代码为基础,展示如何设置和使用Vuex。

  1. 安装 Vuex:首先,确保在你的项目中安装了Vuex:
    cnpm install vuex
  2. 创建 Vuex Store:在你的应用中创建一个Vuex store,用于管理全局状态。在一个名为 store.js 的文件中编写以下代码:
    import { createStore } from 'vuex';const store = createStore({state() {return {count: 0};},mutations: {mutationsIncrement(state, newCount) {state.count = newCount;}},actions: {increment(context, count) {context.commit('mutationsIncrement', count);}},getters: {getCount(state) {return state.count;}}
    });export default store;
    
  3.  在主应用中使用 Vuex Store:在主应用中引入并使用创建好的 Vuex store:
    在 main.js 中:
    import { createApp } from 'vue';
    import App from './App.vue';
    import store from './store';const app = createApp(App);
    app.use(store);
    app.mount('#app');
    
  4. 在组件中使用 Vuex:在你的组件中使用 Vuex 中的状态、mutations、actions 和 getters。 
    在组件中使用状态:
    <template><div><p>Count: {{ count }}</p><button @click="increment">Increment</button></div>
    </template><script setup>
    import { useStore } from 'vuex';const store = useStore();
    const count = ref('')const increment = () => {// 修改 countstore.commit('increment', 'This is new');// 获取 countcount.value = store.state.count
    };
    </script>
    

这只是一个简单的示例,展示了如何设置和使用 Vuex。在实际应用中,你可以在 store 中管理更多的状态、mutations、actions 和 getters,以满足你的项目需求。如果你需要更多关于 Vuex 的详细信息,建议查阅 Vuex 的官方文档。 

四、事件总线(Event Bus)

事件总线是一种在组件之间传递事件和数据的模式,它可以用于简单的通信场景。你可以通过创建一个 Vue 实例来作为事件总线,然后在需要的组件中使用该实例来监听和触发事件。

在 Vue 3 中并没有 on 和 emit 方法,用于自定义事件的监听和触发对于全局事件总线的需求,Vue 3 推荐使用第三方库如 mitt 。

以下是创建和使用事件总线的简单示例:

安装 mitt 库

cnpm install mitt

EventBus.js:

创建一个 mitt 实例来作为事件总线,然后在组件中引入该实例进行事件监听和触发。

import mitt from 'mitt';const eventBus = mitt();export default eventBus;

ComponentA.vue:

在一个组件中,你可以使用事件总线实例来触发事件。

<template><div><button @click="sendMessage">发送消息到组件B</button></div>
</template><script setup>
import eventBus from './EventBus';const sendMessage = () => {eventBus.emit('message', 'Hello from Component A');
};
</script>

ComponentB.vue:

在另一个组件中,你可以使用事件总线实例来监听来自其他组件的事件。

<template><div></div>
</template><script setup>
import eventBus from './EventBus';
import { ref, onMounted } from 'vue';const receivedMessage = ref('');onMounted(() => {eventBus.on('message', (message) => {receivedMessage.value = message;console.log('接收到的消息:', receivedMessage.value)});
});
</script>

在这个示例中,我们创建了一个事件总线实例 eventBus,并在 ComponentA 组件中使用 eventBus.emit 来触发 message 事件,然后在 ComponentB 组件中使用 eventBus.on 来监听 message 事件,并在事件被触发时更新接收到的消息。

请注意,事件总线模式适用于简单的通信场景,但随着应用变得更加复杂,可能会导致事件的管理和维护变得困难。对于更复杂的通信需求,你可能会考虑使用其他通信方式,如 Vuex 或其他状态管理工具。

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

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

相关文章

【ARM Cache 系列文章 8 -- ARM DynamIQ 技术介绍

文章目录 DynamIQ 技术背景DynamIQ技术详解DynamIQ 与 big.LITTLEDynamIQ cluster 分类硬件支持 DynamIQ为什么适合人工智能&#xff1f; DynamIQ 技术背景 2017年3月21日下午&#xff0c;ARM在北京金隅喜来登酒店召开发布会&#xff0c;正式发布了全新的有针对人工智能及机器…

pyspark笔记 筛选条件 vs intersect

一个是filter提供条件时&#xff0c;条件的交集&#xff0c;一个是两个pyspark DataFrame 取交集 前者会有重复的行&#xff0c;后者则没有 举例说明&#xff0c;假设我们有如下的pyspark DataFrame d[[-1],[1],[1],[2],[3],[4]] dfspark.createDataFrame(d,[id]) df.show()-…

算法练习--数值相关

文章目录 整型数组合并质数因子 整型数组合并 将两个整型数组按照升序合并&#xff0c;并且过滤掉重复数组元素。 输出时相邻两数之间没有空格。 输入描述&#xff1a; 1 输入第一个数组的个数 2 输入第一个数组的所有数值 3 输入第二个数组的个数 4 输入第二个数组的所有数值…

IDEA创建项目常见问题

1.IDEA修改maven路径无效 创建spring项目&#xff0c;Maven导入报错&#xff0c;无法正常导入jar报&#xff0c;发现setting中设置的maven路径不是自己下载的路径&#xff0c;修改后无效。运行之后maven路径又恢复为其默认的路径 解决方案&#xff1a; 删除.mvn文件&#xff0…

openCV 图像对象的创建和赋值

文章目录 一、赋值二、克隆三、拷贝四、初始化 一、赋值 赋值操作是将一个cv::Mat对象的数据复制到另一个对象中。赋值操作使用的是浅拷贝&#xff08;shallow copy&#xff09;&#xff0c;即两个对象共享相同的数据内存。这意味着对一个对象的修改会影响到另一个对象 cv::M…

dinput8.dll导致游戏打不开的解决方法,快速修复dinput8.dll文件

当你尝试启动某个游戏时&#xff0c;如果遇到dinput8.dll文件缺失或损坏的错误提示&#xff0c;可能会导致游戏无法正常运行。dinput8.dll是DirectInput API的一部分&#xff0c;它提供了游戏手柄、键盘和鼠标等输入设备的支持。本文将详细介绍dinput8.dll的作用、导致游戏无法…

Spring BeanPostProcessor 接口的作用和使用

BeanPostProcessor 接口是 Spring 框架中的一个扩展接口&#xff0c;用于在 Spring 容器实例化、配置和初始化 bean 的过程中提供自定义的扩展点。通过实现这个接口&#xff0c;您可以在 bean 实例创建的不同生命周期阶段插入自己的逻辑&#xff0c;从而实现对 bean 行为的定制…

AI 降临!!!

人的记忆是脆弱的。因此&#xff0c;个人笔记成为了我们构建第二大脑和进行知识管理的重要手段。然而&#xff0c;人工智能的崛起&#xff0c;无疑改变了我们处理信息和知识的方式。作为一名长期关注笔记方法论和 AI 软件的「效率成瘾者」和「软件发烧友」&#xff0c;我深感此…

MDN-HTTP

参考资料 文章目录 HTTP简介HTTP 和 HTTPSHTTP消息典型的HTTP会话HTTP响应状态HTTP安全HTTP CookieHTTP压缩 HTTP简介 HTTP&#xff08;Hypertext Transfer Protocol&#xff09;是一种用于在计算机网络中传输超文本和其他资源的应用层协议。他是互联网的基础协议之一&#x…

银河麒麟高级操作系统V10助力联通云建设打出组合拳

联通云基于“双引擎基座一云多芯”为不同行业场景提供可靠、高质量的应用上云服务。在核心代码进行了全面把控&#xff0c;定制多架构芯片应用适配模版&#xff0c;开发了计算、存储、网络、中间件等组件&#xff0c;全面适配自主化服务器和操作系统&#xff0c;提供云服务器、…

关于docker 在ubuntu16.04 上的安装

https://www.sohu.com/a/708313241_121368355 参考教程&#xff1a; https://www.runoob.com/docker/docker-image-usage.html 镜像网址 https://hub.docker.com/

用ClickHouse 文件表引擎快速查询分析文件数据

有时我们需要快速查询分析文件数据&#xff0c;正常流程需要在数据库中创建表&#xff0c;然后利用工具或编码导入数据&#xff0c;这时才能在数据库中查询分析。利用ClickHouse文件引擎可以快速查询文件数据。本文首先介绍ClickHouse文件引擎&#xff0c;然后介绍如何快速实现…

Android10.1接上usb摄像头重启设备无声音

一、问题描述 接上客户的usb摄像头,插上喇叭,重启设备,有时候有声音,有时候没有 二、问题原因 原因:插上usb设卡后又两个声卡,而重启后哪个声卡的节点先生成不确定,而hal层中只是打开第一个节点,而usb声卡是没有播放功能的,所以节点中没有播放节点,所…

TypeScript

背景&#xff1a; JS 的类型系统存在“先天缺陷”弱类型&#xff0c;JS 代码中绝大部分错误都是类型错误&#xff08;Uncaught TypeError&#xff09; 开发的时候&#xff0c;定义的变量本应该就有类型 这些经常出现的错误&#xff0c;导致了在使用 JS 进行项目开发时&#xf…

Python中的dataclass:简化数据类的创建

Python中的dataclass是一个装饰器&#xff0c;用于自动添加一些常见的方法&#xff0c;如构造函数、__repr__、__eq__等。它简化了创建数据类的过程&#xff0c;减少了样板代码&#xff0c;提高了代码的可读性和可维护性。有点类似java里面的Java Bean。 让我们看一个简单的例子…

任意子数组和的绝对值的最大值【力扣1749】

一、解题思路 设n表示数组的长度&#xff0c;Min[i]是以nums[i]为开头组成的任意连续子数组中的和最小值&#xff08;若所有子数组的和都大于0&#xff0c;则Min[i]设为0。也就是说丢弃所有子数组&#xff09;&#xff1b;Max[i]是以nums[i]为开头组成的任意连续子数组中的和最…

Cortex-M3的双堆栈MSP和PSP(学习)

M3的栈&#xff0c;先进后出。 是局部变量内存的开销&#xff0c;函数的调用都离不开栈。 Cortex-M3内核使用了双堆栈&#xff0c;即MSP和PSP。 MSP&#xff1a;Main_Stack_Pointer&#xff0c;即主栈。 PSP&#xff1a;Process_Stack_Pointer&#xff0c;即任务栈。 SP&#…

【图像去噪的扩散滤波】基于线性扩散滤波、边缘增强线性和非线性各向异性滤波的图像去噪研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Linux配置QT Creator环境:ubuntu中安装QT Creator环境

一、前景 目前市面上很多公司使用QT Creator进行界面开发&#xff0c;基本都会选择在Linux环境进行&#xff0c;优点不仅是市场所需&#xff0c;更是方便后期代码的移植&#xff0c;相较于Windows系统&#xff0c;Linux系统移植性非常好。故此篇文章&#xff0c;介绍如何在Linu…

CentOS 7迁移Anolis OS 8

背景&#xff1a;生产环境客户要求操作系统国产化 操作系统&#xff1a;Centos7.9 内核&#xff1a;5.4.108 服务器可以联网&#xff0c;进行在线迁移&#xff1a; # 下载迁移工具软件源 wget https://mirrors.openanolis.cn/anolis/migration/anolis-migration.repo -O /etc/y…