在开发复杂的 Web 应用时,跨组件通信是一个常见的需求。Nuxt 3 提供了多种方式来实现这一点,包括使用状态管理工具(如 Pinia)、Vue 的 provide/inject 机制以及传统的 props 传递。本文将详细介绍这三种方法,并通过一个具体的例子来展示如何在文章详情页面中获取用户信息,并将其传递给布局中的 footer 组件。

在日常开发中,跨组件通信经常用到的需求。比如你点开文章详情页,网页左侧展示文章详情,右侧展示作者信息。在文章详情组件中已经拿到了用户信息数据和文章数据,在右侧个人展示页面还需要再拿数据吗?不需要的,通过文章详情展示组件传递过来即可。

那么跨组件通信有哪些方式呢?下面一一总结。

在这里插入图片描述

1. 使用 Pinia 进行状态管理

Pinia 是 Nuxt 3 推荐的状态管理库,适用于管理全局状态。通过 Pinia,你可以在任意组件中方便地设置和获取数据。

创建 Pinia Store

// stores/user.js
import { defineStore } from 'pinia'export const useUserStore = defineStore('user', {state: () => ({userInfo: null,}),actions: {setUserInfo(userInfo) {this.userInfo = userInfo},},
})

在文章详情组件中设置用户信息

// pages/article/_id.vue
<script setup>
import { useUserStore } from '~/stores/user'
import { useFetch } from '#app'const userStore = useUserStore()
const { data: userInfo } = await useFetch(`/api/user/${params.id}`)if (userInfo) {userStore.setUserInfo(userInfo)
}
</script><template><div><h1>文章详情</h1><!-- 其他内容 --><NuxtLayout name="default" /></div>
</template>

在布局的 footer 组件中获取用户信息

// components/Footer.vue
<script setup>
import { useUserStore } from '~/stores/user'const userStore = useUserStore()
const userInfo = userStore.userInfo
</script><template><footer><div v-if="userInfo"><p>用户名: {{ userInfo.name }}</p><p>个人简介: {{ userInfo.bio }}</p></div></footer>
</template>
2. 使用 Props 传递数据

Props 是 Vue 中最传统的数据传递方式,适用于父子组件间的数据传递。不过,在处理全局状态时可能会比较复杂。

在父组件中传递数据

// pages/article/_id.vue
<script setup>
import { ref } from 'vue'
import { useFetch } from '#app'const { data: userInfo } = await useFetch(`/api/user/${params.id}`)
</script><template><div><h1>文章详情</h1><!-- 其他内容 --><NuxtLayout name="default" :user-info="userInfo" /></div>
</template>

在布局中接收 Props

// layouts/default.vue
<template><header>标题</header><main><slot /></main><Footer :user-info="userInfo" />
</template><script setup>
defineProps({userInfo: Object,
})
</script>

footer 组件中使用 Props

// components/Footer.vue
<template><footer><div v-if="userInfo"><p>用户名: {{ userInfo.name }}</p><p>个人简介: {{ userInfo.bio }}</p></div></footer>
</template><script setup>
defineProps({userInfo: Object,
})
</script>
3. 使用 Provide/Inject 传递数据

provideinject 是 Vue 提供的 API,用于在组件树中实现非父子组件间的通信。这种方式适用于需要在多个嵌套层级较深的组件之间传递数据的情况。

在父组件中提供数据

// pages/article/_id.vue
<script setup>
import { provide, ref } from 'vue'
import { useFetch } from '#app'const { data: userInfo } = await useFetch(`/api/user/${params.id}`)if (userInfo) {provide('userInfo', userInfo)
}
</script><template><div><h1>文章详情</h1><!-- 其他内容 --><NuxtLayout name="default" /></div>
</template>

在布局的 footer 组件中注入数据

// components/Footer.vue
<script setup>
import { inject } from 'vue'const userInfo = inject('userInfo')
</script><template><footer><div v-if="userInfo"><p>用户名: {{ userInfo.name }}</p><p>个人简介: {{ userInfo.bio }}</p></div></footer>
</template>

总结

在 Nuxt 3 中实现跨组件通信有多种方法,每种方法都有其适用的场景和优缺点。Pinia 是管理全局状态的最佳选择,特别适用于大型应用;Props 适用于父子组件间的简单数据传递;而 provide/inject 则在需要在多个嵌套层级较深的组件之间传递数据时非常有用。

通过这些方法,你可以灵活地在 Nuxt 3 项目中实现组件间的通信,提高代码的可维护性和可读性。


希望这篇文章能帮助你在 Nuxt 3 中更好地实现跨组件通信!如果有任何问题或需要进一步的帮助,请随时留言。

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

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

相关文章

Java ArrayList 扩容机制

一、ArrayList 简介 ArrayList 是 Java 集合框架中基于数组实现的可变长度列表&#xff0c;其核心特性是&#xff1a; 支持随机访问&#xff08;通过索引&#xff09;支持动态扩容插入/删除效率较低&#xff08;非尾部操作&#xff09; 二、底层数据结构 // JDK 11 transien…

C++面试题精讲系列之数组排序

数组排序是我们经常遇到的笔试题目&#xff0c;给大家盘一下这题到底想考察什么&#xff1f; // 考题如下 void main() {int arr[4] {26,28,24,11};// 请实现一个sortArray函数&#xff0c;对数组arr进行从小到大排序 }考点1&#xff1a;数组做函数参数如何传递参&#xff1f;…

Windows10/11 轻度优化 纯净版,12个版本!

系统介绍 镜像包均基于微软官方原版系统精心制作&#xff0c;确保系统的原汁原味与稳定性。Windows 10/11&#xff0c;都集成了最新的补丁。版本选对&#xff0c;一键安装到位&#xff0c;全自动无人值守安装模式。 系统特点 系统进行优化提供了12个系统版本集成了运行库、…

开发工具IDEA

开发工具IDEA 开发调试&#xff08;debug&#xff09;Maven配置三级目录 开发调试&#xff08;debug&#xff09; 史上最全的 IDEA Debug 调试技巧&#xff08;超详细案例&#xff09; Maven配置 idea全局Maven配置 IDEA中Maven配置详解 有些时候不要配置maven_home这些环境…

GitHub Actions与AWS OIDC实现安全的ECR/ECS自动化部署

引言 在现代云原生应用开发中,实现安全、高效的CI/CD流程至关重要。本文将详细介绍如何利用GitHub Actions和AWS OIDC(OpenID Connect)构建一个无需长期凭证的安全部署管道,将容器化应用自动部署到Amazon ECR和ECS服务。 架构概述 整个解决方案的架构包含三个主要部分:…

一、MongoDB安装-二进制安装

下载tar包 wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-7.0.21.tgz wget https://downloads.mongodb.com/compass/mongosh-2.5.3-linux-x64.tgz安装 解压 tar xf mongodb-linux-x86_64-rhel70-7.0.21.tgz cp mongodb-linux-x86_64-rhel70-7.0.21/bi…

学习日志03 ETF 基础数据可视化分析与简易管理系统

1 代码的选择和改进 import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from ipywidgets import (AppLayout, Dropdown, Button, Output, VBox, HBox, Label, Layout, SelectMultiple,IntSlider, FloatSlider, Checkbox, Text, Select) from IPytho…

[Python] -基础篇7-新手常见Python语法错误及解决方案

Python 以其简洁明了的语法引人入胜,但对于初学者而言,仍然容易遭遇各类语法错误。本文总结了 Python 语言日常编写中最常见的语法错误类型,并提供解决方案和正确写法,帮助新手快速突破编程路上的一道道埋伏。 1. 拼写错误 (SyntaxError) 这是最基本也最常见的错误类型。…

位运算实战:数值构造终极优化

位运算优化实战&#xff1a;数值构造问题详解 今天我们将深入分析一个有趣的位运算优化问题&#xff0c;这个问题展示了如何通过巧妙的预处理和贪心算法来高效解决数值构造问题。 问题背景与定义 给定一个初始值x&#xff08;0 ≤ x ≤ m&#xff09;和一系列位运算操作&…

nosql项目:基于 Redis 哨兵模式的鲜花预订配送系统

1 鲜花预订配送系统概述 1.1 项目背景 鲜花预订系统是一个实时处理用户订单、库存管理和配送跟踪的平台。系统需要处理大量并发订单&#xff0c;实时更新鲜花库存状态&#xff0c;并跟踪配送进度。传统关系型数据库难以应对高并发的订单处理和实时库存更新需求&#xff0c;因…

中心效应:多中心临床试验的关键考量

一、中心效应的来源与影响 1.1 常见来源 1.1.1 患者异质性 中心间基线特征差异(如疾病严重度、合并症比例) 1.1.2 操作差异 给药规范(如输液速度)、随访依从性、数据记录质量 1.1.3 评估偏倚 影像学判读标准(如RECIST)、实验室检测方法(如中心实验室 vs 本地实验室) …

Redis 实现消息队列

一、为什么选择 Redis 作为消息队列&#xff1f; 在分布式系统架构中&#xff0c;消息队列是实现异步通信和解耦的核心组件。Redis 作为一个高性能的内存数据库&#xff0c;凭借其卓越的速度和丰富的数据结构&#xff0c;成为轻量级消息队列的理想选择&#xff1a; 1.1 核心优…

(3)pytest的setup/teardown

1. 简介 学过unittest的都知道里面用前置和后置setup和teardown非常好用&#xff0c;在每次用例开始前和结束后都去执行一次。 当然还有更高级一点的setupClass和teardownClass&#xff0c;需配合classmethod装饰器一起使用&#xff0c;在做selenium自动化的时候&#xff0c;它…

Starrocks存算一体和存算分离

网上整理了一下starrocks两种部署方式的区别差异性&#xff0c;个人感觉生产环境还是尽量存算分离部署&#xff0c;防止资源争夺等问题影响线上生产数据&#xff0c;虽然存算一体部署起来更方便一些 &#x1f4ca; 1. 架构设计 存算一体&#xff1a; 节点类型&#xff1a;仅包含…

多线程编程 ----线程主动退出pthread_exit与线程被动退出pthread_cancel

主动退出 pthread_exit 与 pthread_cancel 的区别 1. 核心区别 特性pthread_exitpthread_cancel调用者线程自身调用&#xff0c;主动退出。其他线程调用&#xff0c;异步请求终止目标线程。行为方式立即终止线程&#xff0c;资源需手动释放。发送取消请求&#xff0c;线程在取…

电脑开机加速工具,优化启动项管理

软件介绍 今天为大家推荐一款专业的电脑启动项管理工具&#xff0c;这款软件能有效优化电脑开机速度&#xff0c;帮助用户管理开机自启动程序。 使用方式 软件无需安装&#xff0c;以管理员身份直接双击运行即可使用。为确保安全&#xff0c;软件特别设计为不添加注册表…

设备管理的11个指标、七大误区、六大特征

1、设备的完好率 在这些指标里用得最多,但其对管理的促进作用有限。所谓的完好率,是在检查期间,完好设备与设备总台数的比例(设备完好率=完好设备数/设备总数)很多工厂的指标可以达到95%以上。理由很简单,在检查的那一刻,如果设备是运转的,没出故障,就算是完好的,于…

11OAuth2

目录 本节大纲 一、OAuth2 简介 二、OAuth2 授权总体流程 三、四种授权模式 授权码模式 简化模式 密码模式 客户端模式 四、OAuth2 标准接口 五、GitHub 授权登录 1. 创建 OAuth 应用 2. 项目开发 六、Spring Security OAuth2 七、授权、资源服务器 1. 授权服务器…

Github Copilot协助解决cucumber插件不支持async/await

一、提示词 问题描述 在使用了badeball/cypress-cucumber-preprocessor插件后&#xff0c;存在不支持nodejs原生的promise和async/await语法问题 执行用例命令 npx cypress run --env configFilemhesi-staging,TAGS"API005" --spec "cypress/integration/AL…

C++多线程【Linux】

Linux的多线程 Linux的子线程实际上也是个进程&#xff0c;但是比传统的进程轻量化。 pthread pthread是用于Linux系统下的线程库&#xff0c;头文件是<pthread.h>。C11 之前的多线程开发高度依赖平台原生 API&#xff0c;Windows 以 CreateThread 和内核对象为核心&am…