使用 useNuxtData 进行高效的数据获取与管理
title: 使用 useNuxtData 进行高效的数据获取与管理
date: 2024/7/22
updated: 2024/7/22
author: cmdragon
excerpt:
深入讲解了Nuxt 3中useNuxtData组合函数的应用,演示了如何通过此函数访问缓存数据,实现组件间数据共享,以及如何在数据更新时利用缓存提高用户体验。文章提供了具体的用法示例,包括数据获取、访问缓存数据和数据更新的场景。
categories:
- 前端开发
tags:
- Nuxt3
- 缓存
- 数据
- 共享
- 组件
- 更新
- 性能
扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长
useNuxtData
概述
useNuxtData
是 Nuxt 3 中的一个组合函数,用于访问通过其他数据获取函数(如useAsyncData
、useLazyAsyncData
、useFetch
和useLazyFetch
等)缓存的数据。它允许在不同的组件之间共享数据,避免重复请求,提高性能。
主要功能
- 访问缓存数据:通过提供一个唯一的键名来访问之前缓存的数据。
- 数据共享:不同的组件可以共享同一数据源,确保数据一致性。
- 更新:在数据更新时可以使用缓存数据作为占位符,提高用户体验。
用法示例
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
往期文章归档:
- Nuxt 3 使用指南:掌握 useNuxtApp 和运行时上下文 | cmdragon's Blog
- 使用 useLazyFetch 进行异步数据获取 | cmdragon's Blog
- 使用 useLazyAsyncData 提升数据加载体验 | cmdragon's Blog
- Nuxt.js 中使用 useHydration 实现数据水合与同步 | cmdragon's Blog
- useHeadSafe:安全生成HTML头部元素 | cmdragon's Blog
- Nuxt.js头部魔法:轻松自定义页面元信息,提升用户体验 | cmdragon's Blog
- 探索Nuxt.js的useFetch:高效数据获取与处理指南 | cmdragon's Blog
- Nuxt.js 错误侦探:useError 组合函数 | cmdragon's Blog
- useCookie函数:管理SSR环境下的Cookie | cmdragon's Blog
- 轻松掌握useAsyncData获取异步数据 | cmdragon's Blog
- 使用
useAppConfig
:轻松管理应用配置 | cmdragon's Blog - Nuxt框架中内置组件详解及使用指南(五) | cmdragon's Blog
- Nuxt框架中内置组件详解及使用指南(四) | cmdragon's Blog
- Nuxt框架中内置组件详解及使用指南(三) | cmdragon's Blog
- Nuxt框架中内置组件详解及使用指南(二) | cmdragon's Blog
- Nuxt框架中内置组件详解及使用指南(一) | cmdragon's Blog
使用 useNuxtData 进行高效的数据获取与管理的更多相关文章
- (转载)使用 udev 高效、动态地管理 Linux 设备文件
概述: Linux 用户常常会很难鉴别同一类型的设备名,比如 eth0, eth1, sda, sdb 等等.通过观察这些设备的内核设备名称,用户通常能知道这些是什么类型的设备,但是不知道哪一个设备是 ...
- 企业该如何进行高效IT运维管理
企业该如何进行高效IT运维管理 在企业内部也是一样,当大量的生产和经营数据集中在数据中心,一旦人们与数据中心因为IT故障而失去联系,停滞的也许不是个人应用受阻这样简单的后果.我们谁也不想看到自己企业的 ...
- 嵌入式 使用udev高效、动态地管理Linux 设备文件
本文以通俗的方法阐述 udev 及相关术语的概念.udev 的配置文件和规则文件,然后以 Red Hat Enterprise Server 为平台演示一些管理设备文件和查询设备信息的实例.本文会使那 ...
- 【转】使用 udev 高效、动态地管理 Linux 设备文件
简介: 本文以通俗的方法阐述 udev 及相关术语的概念.udev 的配置文件和规则文件,然后以 Red Hat Enterprise Server 为平台演示一些管理设备文件和查询设备信息的实例.本 ...
- 使用 udev 高效、动态地管理 Linux 设备文件
本文转自:https://www.ibm.com/developerworks/cn/linux/l-cn-udev/index.html 概述: Linux 用户常常会很难鉴别同一类型的设备名,比如 ...
- 在 Java 中如何更高效地存储和管理 SQL 语句?
[编者按]还在为管理 Java 代码中的 SQL 语句而烦恼吗?让 Zemian 帮你摆脱困境吧!本文系 OneAPM 工程师编译整理 注意:使用java.util.Properties#loadFr ...
- 使用udev高效、动态的管理Linux设备文件
导读: 在Linux环境中,所有的设备都以文件的形式存在,在早期的Linux版本中,/dev目录包含了了所有可能出现的设备文件,很难想象Linux用户如何从大量的设备文件中找到想要的设备文件.举个例子 ...
- Linux内存管理之地址映射
写在前面:由于地址映射涉及到各种寄存器的设置访问,Linux对于不同体系结构处理器的地址映射采用不同的方法,例如对于i386及后来的32位的Intel的处理器在页式映射时采用的是2级页表映射,而对于I ...
- 小团队开发管理工具:gitlab+redmine+testlink+jenkins
由于工作需要,需要为团队搭建一个高效可用的开发管理平台.现在可用的开发管理工具很多开源的.商业的,网上也有很多博客和文章.经过2周的学习比较,再结合自己的项目特点,最后选定工具集:gitlab+red ...
- 在 Java 中高效使用锁的技巧--转载
竞争锁是造成多线程应用程序性能瓶颈的主要原因 区分竞争锁和非竞争锁对性能的影响非常重要.如果一个锁自始至终只被一个线程使用,那么 JVM 有能力优化它带来的绝大部分损耗.如果一个锁被多个线程使用过,但 ...
随机推荐
- AI绘图之Midjourney初体验
Midjourney (MJ) 使用笔记 最近尝试了 Midjourney 绘图,简单记录下使用流程. 注册及登陆 首先是账号注册和登陆,基本上就是一路下一步,唯一需要注意的是加入MJ频道,具体流程为 ...
- WebView2在WPF中的应用
开发环境 运行环境:.Net 6 开发环境:Visual Studio 2022 17.1.3 框架语言:WPF 安装WebView2 通过Package Manager控制台安装 Install-P ...
- 开发者说PaddleOCR的.NET封装与应用部署
- GitHub two-factor authentication开启教程
问题描述 最近登录GitHub个人页面动不动就有一个提示框"...... two-factor authentication will be required for your accoun ...
- python数据分析练习--分析成都的房价
目的:使用python的numpy.pandas.matplotlib库来分析成都二手房的房价信息. 原始数据来源:贝壳找房网站上的数据https://cd.ke.com/ershoufang 环境: ...
- 绘图与可视化--matplotlib API入门
matplotlib API函数都位于matplotlib.pyplot模块中. 本节代码中引入的约定为:import matplotlib.pyplot as plt 另外,numpy库也会用到,约 ...
- vuex做购物车功能
先创建一个cart组件 <template> <div> <ListItem></ListItem> </div> </templat ...
- OpenSearch 与 Elasticsearch:哪个开源搜索引擎适合您?
当谈论到搜索引擎产品时,Elasticsearch 和 OpenSearch 是两个备受关注的选择.它们都以其出色的功能和灵活性而闻名,但在一些方面存在一些差异.在本文中,我们将从功能和延展性.工具与 ...
- 可观测性平台夜莺开源项目发布V6正式版!
夜莺开源项目在2023.7月底发布了V6版本,这个版本开始,项目目标不止于做一款开源监控系统,而是要做一款开源可观测性平台,不过路漫漫其修远兮,初期只是把日志数据源引入并完成了基本的可视化,后续会着力 ...
- Shiro 的优点
a.简单的身份认证, 支持多种数据源 b.对角色的简单的授权, 支持细粒度的授权(方法级) c.支持一级缓存,以提升应用程序的性能 d.内置的基于 POJO 企业会话管理, 适用于 Web 以及非 W ...