当前位置: 首页 > article >正文

基础篇六 Nuxt4 状态管理:useState 的正确用法

文章目录一、useState 基础二、跨组件共享三、封装成 Composable四、用户状态管理五、购物车状态六、持久化存储七、SSR 注意事项八、useState vs Pinia总结个人网站组件间共享数据是前端开发的常见需求。Vue 2 时代我们用 VuexVue 3 有了 Pinia但 Nuxt 提供了一个更轻量的内置方案——useState。今天我们来学习它的正确用法。一、useState 基础useState是 Nuxt 内置的状态管理工具可以在任何组件中使用script setup langts // 创建一个响应式状态 const count useState(count, () 0) // 或者用 ref但 useState 跨组件共享 const countRef ref(0) /script template div p计数: {{ count }}/p button clickcount1/button /div /templateuseState和ref的区别ref是组件内部的切换页面就销毁useState是全局的组件间共享SSR 时数据还能传递二、跨组件共享多个组件可以访问同一个状态只需相同的 key!-- components/Counter.vue -- script setup langts const count useState(count, () 0) /script template div p计数: {{ count }}/p button clickcount1/button /div /template!-- components/CounterDisplay.vue -- script setup langts // 相同 key共享同一状态 const count useState(count) /script template p当前计数: {{ count }}/p /template!-- pages/index.vue -- template div Counter / CounterDisplay / /div /template两个组件共享同一个count一个修改另一个自动更新。三、封装成 Composable更好的做法是封装成composable// composables/useCounter.tsexportconstuseCounter(){constcountuseStatenumber(count,()0)constincrement()count.valueconstdecrement()count.value--constreset()count.value0return{count,increment,decrement,reset}}使用script setup langts const { count, increment, decrement, reset } useCounter() /script template div p{{ count }}/p button clickincrement/button button clickdecrement-/button button clickreset重置/button /div /template好处逻辑封装复用方便类型安全有完整提示修改时只需改一处四、用户状态管理最常见的场景是存储用户信息// composables/useUser.tsinterfaceUser{id:numbername:stringemail:stringavatar:string}exportconstuseUser(){constuseruseStateUser|null(user,()null)constisLoggedIncomputed(()!!user.value)constloginasync(email:string,password:string){constresponseawait$fetch(/api/login,{method:POST,body:{email,password}})user.valueresponse.user}constlogoutasync(){await$fetch(/api/logout)user.valuenull}constfetchUserasync(){try{constresponseawait$fetch(/api/user)user.valueresponse.user}catch{user.valuenull}}return{user,isLoggedIn,login,logout,fetchUser}}使用script setup langts const { user, isLoggedIn, login, logout } useUser() /script template div v-ifisLoggedIn img :srcuser?.avatar :altuser?.name / span{{ user?.name }}/span button clicklogout退出/button /div div v-else NuxtLink to/login登录/NuxtLink /div /template五、购物车状态// composables/useCart.tsinterfaceCartItem{id:numbername:stringprice:numberquantity:number}exportconstuseCart(){constitemsuseStateCartItem[](cart,()[])consttotalcomputed(()items.value.reduce((sum,item)sumitem.price*item.quantity,0))constitemCountcomputed(()items.value.reduce((sum,item)sumitem.quantity,0))constaddItem(product:OmitCartItem,quantity){constexistingitems.value.find(itemitem.idproduct.id)if(existing){existing.quantity}else{items.value.push({...product,quantity:1})}}constremoveItem(id:number){constindexitems.value.findIndex(itemitem.idid)if(index-1){items.value.splice(index,1)}}constupdateQuantity(id:number,quantity:number){constitemitems.value.find(itemitem.idid)if(item){item.quantityMath.max(0,quantity)if(item.quantity0){removeItem(id)}}}constclear(){items.value[]}return{items,total,itemCount,addItem,removeItem,updateQuantity,clear}}六、持久化存储默认情况下页面刷新状态会丢失。结合localStorage实现持久化// composables/usePersistentState.tsexportconstusePersistentStateT(key:string,defaultValue:T){conststateuseStateT(key,(){// 客户端从 localStorage 读取if(import.meta.client){conststoredlocalStorage.getItem(key)if(stored){try{returnJSON.parse(stored)}catch{returndefaultValue}}}returndefaultValue})// 监听变化同步到 localStoragewatch(state,(value){if(import.meta.client){localStorage.setItem(key,JSON.stringify(value))}},{deep:true})returnstate}使用// composables/useCart.tsexportconstuseCart(){// 使用持久化状态constitemsusePersistentStateCartItem[](cart-items,[])// ...其他逻辑}七、SSR 注意事项useState支持 SSR但有几点要注意不要在 setup 外使用// ❌ 错误constglobalCountuseState(count)// 在模块顶层exportdefaultdefineNuxtConfig({})// ✅ 正确exportconstuseCounter(){constcountuseState(count)// 在函数内部return{count}}避免使用 Date.now() 等不确定值// ❌ 可能导致 hydration 不匹配consttimestampuseState(ts,()Date.now())// ✅ 使用固定的初始值consttimestampuseState(ts,()0)服务端数据会自动传递给客户端exportconstuseUser(){constuseruseState(user,()null)// 服务端获取数据if(import.meta.server){consteventuseRequestEvent()user.valueevent.context.user}// 客户端自动拿到服务端的数据return{user}}八、useState vs Pinia什么时候用useState什么时候用 Pinia对比项useStatePinia学习成本低中功能复杂度简单强大开发工具无有 DevTools插件生态无丰富适用场景简单状态复杂应用建议小项目、简单状态useState大项目、复杂状态管理Pinia两者可以混用总结useState核心用法功能示例创建状态useState(key, () defaultValue)获取状态useState(key)封装逻辑放到composables/useXxx.ts持久化结合localStorage下一篇聊聊 Pinia 集成学习更强大的状态管理方案。相关文章入门篇三Nuxt4组件自动导入写代码少敲一半字入门篇二Nuxt 4路由自动生成告别手动配置路由的日子延伸阅读nuxt4完整系列持续更新中。。欢迎来逛逛内容有帮助点赞、收藏、关注三连评论区等你

相关文章:

基础篇六 Nuxt4 状态管理:useState 的正确用法

文章目录 一、useState 基础二、跨组件共享三、封装成 Composable四、用户状态管理五、购物车状态六、持久化存储七、SSR 注意事项八、useState vs Pinia总结 个人网站 组件间共享数据是前端开发的常见需求。Vue 2 时代我们用 Vuex,Vue 3 有了 Pinia,但 …...

DeerFlow智能助手:法律条文解读与案例匹配的深度研究工作流搭建

DeerFlow智能助手:法律条文解读与案例匹配的深度研究工作流搭建 1. 引言:当法律研究遇上AI智能体 想象一下这个场景:你是一位法律从业者,面对一份新出台的法规或一个复杂的案件,需要快速理解条文背后的含义&#xff…...

质押经济革命:DApp+NFT双引擎开发全解析与亿级市场突围策略

引言:区块链3.0时代的价值重构机遇在Web3.0浪潮席卷全球的当下,区块链技术正从加密货币交易向深度价值赋能转型。据DappRadar 2025年Q4数据显示,质押类DApp用户规模同比增长217%,NFT质押市场年交易量突破89亿美元,质押…...

IDEC PF3S-HSC1输入模块

IDEC PF3S-HSC1 输入模块该设备属于 IDEC FA-3S系列中的高速功能模块,常见于PLC控制系统架构中,主要用于高速信号采集与输入处理,在运动控制与自动化生产线中应用较多。属于FA-3S系列PLC扩展模块,用于高速输入信号处理。可接收高速…...

Chainlink+Axelar双引擎驱动:DAO跨链治理进入「自动驾驶」时代

引言:DAO治理的「民主困境」与破局之道在2025年的Web3生态中,DAO(去中心化自治组织)已从实验性项目成长为管理超200亿美元资产的决策实体。然而,73%的DAO因投票机制低效而失败(数据来源:DeepDAO…...

C#项目文件结构优化:如何通过修改.csproj文件实现Designer.cs与主文件的层级关联

1. 为什么需要调整Designer.cs文件层级 每次在Visual Studio里新建一个Windows Forms或者WPF项目时,你会发现解决方案资源管理器里会自动生成一些文件。比如创建一个Form1窗体,通常会看到三个文件:Form1.cs、Form1.Designer.cs和Form1.resx。…...

VSCode终端执行npm命令失败的排查与修复(Powershell方案)

1. 问题场景还原:为什么VSCode终端跑不动npm? 最近在项目里碰到个怪事:用系统自带的CMD窗口跑npm install一切正常,但切回VSCode内置终端就报"npm不是可识别的命令"。这种割裂感就像手机连WiFi能上网但电脑连同一个WiFi…...

Spring AI + RAG实战:手把手教你用RuoYi-RAG搭建企业级AI知识库(含Ollama、Qdrant、Neo4j全栈配置)

Spring AI RAG实战:企业级知识库全栈搭建指南 当企业面临海量文档管理和智能问答需求时,传统的关键词检索已无法满足精准获取知识的需求。RuoYi-RAG项目通过整合Spring AI框架与多模态数据库,为企业提供了一套开箱即用的知识管理解决方案。本…...

解决zoom缩放下el-dropdown下拉框定位偏移的实战方案

1. 问题现象与成因分析 最近在开发一个后台管理系统时,遇到了一个让人头疼的问题:当页面使用CSS的zoom属性进行缩放时,Element UI的el-dropdown下拉框会出现明显的定位偏移。具体表现为点击下拉按钮后,弹出的菜单位置与预期不符&a…...

AIAgent语音识别不再依赖云端?2026奇点大会宣布边缘侧实时ASR芯片流片成功(功耗<1.2W,词错率提升41.6%)

第一章:2026奇点智能技术大会:AIAgent语音识别 2026奇点智能技术大会(https://ml-summit.org) 实时流式语音识别架构演进 本届大会重点展示了新一代AIAgent语音识别引擎——SonicCore v4.2,其核心突破在于将端到端流式识别延迟压缩至平均12…...

UIStackView 实战:打造高效 iOS 界面布局

1. UIStackView 入门:为什么它是 iOS 开发者的秘密武器 第一次接触 UIStackView 是在 2014 年的 WWDC 大会上,当时苹果工程师演示这个"布局魔法"时,全场开发者都发出了惊叹声。这么多年过去,我依然记得那个瞬间——因为…...

高效网页资源嗅探工具猫抓(cat-catch)终极指南:一键捕获所有媒体资源

高效网页资源嗅探工具猫抓(cat-catch)终极指南:一键捕获所有媒体资源 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在当今多媒体内容…...

梅丽尔•斯特里普携手安妮•海瑟薇亮相上海《穿普拉达的女王2》璀璨之夜 | 美通社头条

、美通社消息:由二十世纪影业出品的时尚巨制《穿普拉达的女王2》(The Devil Wears Prada 2)“璀璨之夜”于上海前滩太古里盛大举办。活动当晚星光云集,三度斩获奥斯卡金像奖的梅丽尔•斯特里普(米兰达的扮演者&#xf…...

LCL型三相并网变流器输出阻抗建模与稳定性分析(1)

1. LCL滤波器在并网变流器中的关键作用 我第一次接触LCL型三相并网变流器时,最头疼的就是这个看似简单的滤波器。LCL滤波器由两个电感和一个电容组成,结构上比传统的L型或LC型滤波器复杂不少。但正是这种结构,让它能在降低电感用量的同时&…...

B2B品牌字体策略怎么定:中文、英文、数字、代码感如何统一

很多B2B企业在做官网、PPT母版、白皮书和参数页时,都会遇到一个典型问题: 单页看还可以,但放在一起就不够整。 中文像一个品牌,英文像另一个品牌,数字又像第三套系统借来的。 这种“不够整”的感觉,很多时候…...

Jetson Orin平台下ArduPilot与Gazebo的深度集成:从SITL配置到3D飞行模拟实战

1. Jetson Orin与无人机仿真的完美组合 第一次把ArduPilot飞控和Gazebo模拟器搬到Jetson Orin平台上时,我就像发现新大陆一样兴奋。这块巴掌大的开发板,居然能流畅运行3D飞行模拟,还能实时处理视觉数据,这完全颠覆了我对边缘计算设…...

告别DWConv卡顿!用Pytorch手把手实现CVPR 2023的PConv(附完整代码与性能对比)

告别DWConv卡顿!用PyTorch手把手实现CVPR 2023的PConv(附完整代码与性能对比) 在移动端和边缘计算场景中,模型推理速度往往成为制约落地的关键瓶颈。许多工程师发现,即使采用深度可分离卷积(DWConv&#xf…...

再次革新 .NET 的构建和发布方式(一)烤

本文能帮你解决什么? 1. 搞懂FastAPI异步(async/await)到底在什么场景下能真正提升性能。 2. 掌握在FastAPI中正确使用多线程处理CPU密集型任务的方法。 3. 避开常见的坑(比如阻塞操作、数据库连接池耗尽、GIL限制)。 …...

把 SAP Gateway 的 SNC 组件支持配对好,别让安全链路只停在参数表里

做 SAP 系统安全配置时,很多人一提到加密通信,脑子里最先跳出来的是 HTTPS、SSL、SAProuter,或者前端登录时的 SSO。可一旦话题落到 RFC Gateway、外部程序注册、跨系统 Gateway 通信,真正决定这条链路是不是安全的,往往不是某个业务开发对象,而是 SNC 支持有没有被正确打…...

流放之路Build规划神器:5分钟学会用Path of Building打造完美角色

流放之路Build规划神器:5分钟学会用Path of Building打造完美角色 【免费下载链接】PathOfBuilding Offline build planner for Path of Exile. 项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding 还在为流放之路复杂的Build系统头疼吗&…...

InteractiveHtmlBom:3大核心价值重塑PCB设计团队的BOM管理战略

InteractiveHtmlBom:3大核心价值重塑PCB设计团队的BOM管理战略 【免费下载链接】InteractiveHtmlBom Interactive HTML BOM generation plugin for KiCad, EasyEDA, Eagle, Fusion360 and Allegro PCB designer 项目地址: https://gitcode.com/gh_mirrors/in/Inte…...

PyFluent完整指南:如何用Python代码彻底改变你的CFD仿真工作流

PyFluent完整指南:如何用Python代码彻底改变你的CFD仿真工作流 【免费下载链接】pyfluent Pythonic interface to Ansys Fluent 项目地址: https://gitcode.com/gh_mirrors/pyf/pyfluent PyFluent作为Ansys Fluent的Python接口,为计算流体动力学工…...

如何快速完成Axure RP汉化:零基础用户的完整中文界面解决方案

如何快速完成Axure RP汉化:零基础用户的完整中文界面解决方案 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为…...

FanControl深度配置指南:从零构建智能温控系统的5大核心模块

FanControl深度配置指南:从零构建智能温控系统的5大核心模块 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trend…...

5个简单步骤:使用Campus-Imaotai实现茅台自动预约的完整指南

5个简单步骤:使用Campus-Imaotai实现茅台自动预约的完整指南 【免费下载链接】campus-imaotai i茅台app自动预约,每日自动预约,支持docker一键部署(本项目不提供成品,使用的是已淘汰的算法) 项目地址: ht…...

药材烘干返潮,注意这些细节

药材烘干返潮?这些细节要注意在中药材加工行业,烘干后药材出现返潮、霉变,是不少从业者都会遇到的痛点问题,不仅影响药材品质与药效,还会造成不必要的经济损失。结合行业实践与设备应用经验,从三个核心维度…...

2026亲测:同时降重复率与AI率的实用工具推荐

现在国内高校和期刊普遍实行重复率AIGC率双重检测,单独只降重或者只消AI痕迹的工具已经很难满足需求。我们针对知网、维普、Turnitin等主流平台做了多轮复测,筛选出几款适配不同场景的高效工具,覆盖中英文论文、学生初稿到硕博定稿全需求。 一…...

REX-UniNLU与Dify平台集成实战

REX-UniNLU与Dify平台集成实战 1. 场景价值:为什么需要这样的集成 在日常的AI应用开发中,我们经常遇到这样的困境:有一个很强大的自然语言理解模型,但要把它变成实际可用的服务,需要处理一大堆部署、接口、前后端联调…...

CentOS7下NTP时间同步服务配置与常见依赖问题排查

1. CentOS7时间同步服务的重要性 想象一下这样的场景:公司内部有十几台服务器,有的跑数据库,有的跑Web应用,还有的负责定时任务。突然有一天,你发现数据库里的订单创建时间比实际晚了3分钟,定时任务提前执行…...

MediaCrawler:如何构建企业级社交媒体情报系统

MediaCrawler:如何构建企业级社交媒体情报系统 【免费下载链接】MediaCrawler-new 项目地址: https://gitcode.com/GitHub_Trending/me/MediaCrawler-new 在信息爆炸的时代,企业如何从海量社交媒体内容中精准捕捉市场信号?传统的人工…...