title: 使用 useNuxtData 进行高效的数据获取与管理

date: 2024/7/22

updated: 2024/7/22

author: cmdragon

excerpt:

深入讲解了Nuxt 3中useNuxtData组合函数的应用,演示了如何通过此函数访问缓存数据,实现组件间数据共享,以及如何在数据更新时利用缓存提高用户体验。文章提供了具体的用法示例,包括数据获取、访问缓存数据和数据更新的场景。

categories:

  • 前端开发

tags:

  • Nuxt3
  • 缓存
  • 数据
  • 共享
  • 组件
  • 更新
  • 性能



扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长

useNuxtData 概述

useNuxtData是 Nuxt 3 中的一个组合函数,用于访问通过其他数据获取函数(如useAsyncDatauseLazyAsyncDatauseFetch

useLazyFetch等)缓存的数据。它允许在不同的组件之间共享数据,避免重复请求,提高性能。

主要功能

  1. 访问缓存数据:通过提供一个唯一的键名来访问之前缓存的数据。
  2. 数据共享:不同的组件可以共享同一数据源,确保数据一致性。
  3. 更新:在数据更新时可以使用缓存数据作为占位符,提高用户体验。

用法示例

1. 获取数据并缓存

pages/posts.vue中,我们可以使用useFetch来获取帖子数据,并将其缓存到posts键名下:

// pages/posts.vue
<script setup> // 使用 useFetch 获取数据并缓存
const { data, error } = await useFetch('/api/posts', { key: 'posts' }) // 处理错误
if (error.value) {
console.error('获取帖子失败:', error.value)
}
</script> <template>
<div>
<h1>帖子列表</h1>
<ul>
<li v-for="post in data" :key="post.id">{{ post.title }}</li>
</ul>
</div>
</template>

2. 访问缓存数据

pages/posts/[id].vue中,我们可以使用useNuxtData来访问posts.vue中缓存的帖子数据:

// pages/posts/[id].vue
<script setup>
import { useRoute } from 'vue-router' // 获取路由参数
const { id } = useRoute().params // 访问缓存的帖子数据
const { data: posts } = useNuxtData('posts') // 使用 useLazyFetch 获取单个帖子的详细信息
const { data, error } = useLazyFetch(`/api/posts/${id}`, {
key: `post-${id}`,
default() {
// 从缓存中找到对应的帖子,并将其设置为默认值
return posts.value.find(post => post.id === id) || null
}
}) // 处理错误
if (error.value) {
console.error('获取帖子详情失败:', error.value)
}
</script> <template>
<div>
<h1>帖子详情</h1>
<div v-if="data">
<h2>{{ data.title }}</h2>
<p>{{ data.content }}</p>
</div>
</div>
</template>

3. 更新

pages/todos.vue中,我们可以使用useAsyncData来获取待办事项,并在添加新待办事项时利用缓存进行乐观更新:

// pages/todos.vue
<script setup> // 获取待办事项数据并缓存
const { data: todos, error } = await useAsyncData('todos', () => $fetch('/api/todos')) // 处理错误
if (error.value) {
console.error('获取待办事项失败:', error.value)
}
</script> <template>
<div>
<h1>待办事项</h1>
<ul>
<li v-for="todo in todos" :key="todo.id">{{ todo.task }}</li>
</ul>
<NewTodo />
</div>
</template>

components/NewTodo.vue中,我们可以实现添加新待办事项的逻辑:

// components/NewTodo.vue
<script setup>
import { ref } from 'vue' const newTodo = ref('')
const previousTodos = ref([]) // 访问 todos.vue 中 useAsyncData 的缓存值
const { data: todos } = useNuxtData('todos') const addTodo = async () => {
const { data, error } = await useFetch('/api/addTodo', {
method: 'post',
body: {
todo: newTodo.value
},
onRequest() {
// 在请求开始时保存当前的 todos 数据
previousTodos.value = [...todos.value]
// 乐观更新 UI
todos.value.push({ id: Date.now(), task: newTodo.value }) // 假设 ID 为当前时间戳
},
onRequestError() {
// 请求失败时回滚数据
todos.value = previousTodos.value
},
async onResponse() {
// 请求成功后刷新 todos 数据
await refreshNuxtData('todos')
}
}) // 清空输入框
newTodo.value = ''
}
</script> <template>
<div>
<input v-model="newTodo" placeholder="添加新待办事项" />
<button @click="addTodo">添加</button>
</div>
</template>

类型定义

useNuxtData的类型定义如下:

useNuxtData<DataT = any> (key: string): { data: Ref<DataT | null> }
  • key: 用于访问缓存数据的键名。
  • data: 返回一个响应式引用,包含缓存的数据或null

注意事项

  • 确保在使用useNuxtData时,提供的键名与之前缓存数据时使用的键名一致。
  • 在进行乐观更新时,要小心处理数据的回滚,以避免用户看到不一致的状态。

余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长,阅读完整的文章:使用 useNuxtData 进行高效的数据获取与管理 | cmdragon's Blog

往期文章归档:

使用 useNuxtData 进行高效的数据获取与管理的更多相关文章

  1. (转载)使用 udev 高效、动态地管理 Linux 设备文件

    概述: Linux 用户常常会很难鉴别同一类型的设备名,比如 eth0, eth1, sda, sdb 等等.通过观察这些设备的内核设备名称,用户通常能知道这些是什么类型的设备,但是不知道哪一个设备是 ...

  2. 企业该如何进行高效IT运维管理

    企业该如何进行高效IT运维管理 在企业内部也是一样,当大量的生产和经营数据集中在数据中心,一旦人们与数据中心因为IT故障而失去联系,停滞的也许不是个人应用受阻这样简单的后果.我们谁也不想看到自己企业的 ...

  3. 嵌入式 使用udev高效、动态地管理Linux 设备文件

    本文以通俗的方法阐述 udev 及相关术语的概念.udev 的配置文件和规则文件,然后以 Red Hat Enterprise Server 为平台演示一些管理设备文件和查询设备信息的实例.本文会使那 ...

  4. 【转】使用 udev 高效、动态地管理 Linux 设备文件

    简介: 本文以通俗的方法阐述 udev 及相关术语的概念.udev 的配置文件和规则文件,然后以 Red Hat Enterprise Server 为平台演示一些管理设备文件和查询设备信息的实例.本 ...

  5. 使用 udev 高效、动态地管理 Linux 设备文件

    本文转自:https://www.ibm.com/developerworks/cn/linux/l-cn-udev/index.html 概述: Linux 用户常常会很难鉴别同一类型的设备名,比如 ...

  6. 在 Java 中如何更高效地存储和管理 SQL 语句?

    [编者按]还在为管理 Java 代码中的 SQL 语句而烦恼吗?让 Zemian 帮你摆脱困境吧!本文系 OneAPM 工程师编译整理 注意:使用java.util.Properties#loadFr ...

  7. 使用udev高效、动态的管理Linux设备文件

    导读: 在Linux环境中,所有的设备都以文件的形式存在,在早期的Linux版本中,/dev目录包含了了所有可能出现的设备文件,很难想象Linux用户如何从大量的设备文件中找到想要的设备文件.举个例子 ...

  8. Linux内存管理之地址映射

    写在前面:由于地址映射涉及到各种寄存器的设置访问,Linux对于不同体系结构处理器的地址映射采用不同的方法,例如对于i386及后来的32位的Intel的处理器在页式映射时采用的是2级页表映射,而对于I ...

  9. 小团队开发管理工具:gitlab+redmine+testlink+jenkins

    由于工作需要,需要为团队搭建一个高效可用的开发管理平台.现在可用的开发管理工具很多开源的.商业的,网上也有很多博客和文章.经过2周的学习比较,再结合自己的项目特点,最后选定工具集:gitlab+red ...

  10. 在 Java 中高效使用锁的技巧--转载

    竞争锁是造成多线程应用程序性能瓶颈的主要原因 区分竞争锁和非竞争锁对性能的影响非常重要.如果一个锁自始至终只被一个线程使用,那么 JVM 有能力优化它带来的绝大部分损耗.如果一个锁被多个线程使用过,但 ...

随机推荐

  1. Android 13 - Media框架(2)- Demo App与MediaPlayer Api了解

    关注公众号免费阅读全文,进入音视频开发技术分享群! 尝试用MediaPlayer写了一个播放demo,实现了网络流和本地流的播放.由于本人对app开发一窍不通,所以demo中很多内容是边查资料边写的, ...

  2. 开源Blazor UI组件库精选:让你的Blazor项目焕然一新!

    今天给大家推荐一些开源.美观的Blazor UI组件库,这些优秀的开源框架和项目不仅能够帮助开发者们提高开发效率,还能够为他们的项目带来更加丰富的用户体验. 注:排名不分先后,都是十分优秀的开源框架和 ...

  3. 微服务实践k8s&dapr开发部署实验(3)订阅发布

    自托管模式运行dapr 新建订阅webapi项目,取名为backend 项目增加docker支持,取消https支持 修改Program.cs var builder = WebApplication ...

  4. Java中GUI

    目录 1.Java GUI 概述 2.容器 2.1 窗口 2.2 弹窗和对话框 对话框 自定义弹窗 2.3 面板 普通面板 滚动面板 分隔面板 选项卡面板 3.布局 3.1.流式布局 3.2.网格布局 ...

  5. react 属性绑定动态值

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. AGC043

    AGC043 A.Range Flip Find Route 简单DP B.123 Triangle 推性质. 利用模运算将减法变成加法(在绝对值0/1的情况下). Giant Graph 类似于博弈 ...

  7. jenkins结合远程仓库

    既然是持续集成,对代码进行构建,我们得获取代码仓库的内容,这里选择我们搭建的gitlab服务器 1.开发工程师的机器 1. 在window上生成ssh-key $ ssh-keygen.exe -t ...

  8. 项目管理--PMBOK 读书笔记(10)【项目沟通管理】

      1.沟通技术 1)交互式沟通:双方多方之间的多项信息沟通,确保全体参与者对特定话题达成共识,回馈. 2)推式沟通:将信息发送给接收方,不确保受众理解. 3)拉式沟通:自主自行反问信息   2.沟通 ...

  9. AlertManager解析:构建高效告警系统

    本文深入探讨了AlertManager的技术细节和实际应用,从基本概念.核心组件.工作流程,到与Prometheus的集成和实战案例,旨在为专业人士提供一个全面的AlertManager技术和应用指南 ...

  10. leetcode_2-两数相加_javascript

    题目 2.两数相加 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新 ...