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

148.《mobx-react-lite + TypeScript 入门实战教程(完整版)》

一、教程前言MobX 是一款轻量级响应式状态管理库相比 Redux 更简洁、学习成本更低mobx-react-lite是 MobX 专为 React 函数组件设计的轻量级绑定库结合 TypeScript 可实现类型安全的状态管理。本教程通过「计数器 汽车列表」实战案例从零讲解mobx-react-lite核心用法包含可观察状态定义、动作/计算属性、全局状态共享、组件响应式渲染、异步状态处理等。示例仓库地址https://github.com/MyMessages/mobox-demo.git效果图二、环境准备与项目初始化1. 克隆示例项目# 克隆仓库到本地gitclone https://github.com/MyMessages/mobox-demo.git# 进入项目目录cdmobox-demo2. 安装依赖# 使用 npm 安装npminstall# 或使用 yarnyarninstall3. 核心依赖说明package.json从截图可见项目核心依赖如下{dependencies:{mobx:^6.15.0,// MobX 核心库mobx-react-lite:^4.1.1,// React 函数组件绑定库react:^19.2.4,// React 核心react-dom:^19.2.4,// React DOM 渲染typescript:^4.9.5// TypeScript}}4. 启动项目# 启动开发服务器npmstart# 或 yarnyarnstart启动后访问http://localhost:3000即可查看效果。三、项目结构mobox-demo/ └── src/ ├── store/ │ ├── counter.ts # 计数器 Store包含同步/异步操作、计算属性、副作用 │ └── car.ts # 汽车列表 Store可观察数组 ├── store.ts # 根 Store React Context 封装 ├── App.tsx # 主页面组件observer 响应式组件 └── index.tsx # 应用入口四、核心代码实现1. 计数器 Storesrc/store/counter.tsimport{makeAutoObservable,autorun,reaction,runInAction}frommobxclassCounter{constructor(){// 自动将类属性转为 observable方法转为 actiongetter 转为 computedmakeAutoObservable(this,{},{autoBind:true})}// 可观察状态当前计数count0// 动作同步 1increment(){this.count}// 动作同步 -1decrement(){this.count--}// 动作异步 1延迟 1 秒incrementAsync(){setTimeout((){// 异步回调中修改状态必须用 runInAction 包裹确保 MobX 追踪变更runInAction((){this.count})},1000)}// 动作重置计数reset(){this.count0}// 计算属性count 的 2 倍只读缓存结果依赖变化时才重新计算getdouble(){returnthis.count*2}}// 创建全局单例 Counter 实例constcounternewCounter()// 副作用autorun —— 每次 count 变化自动执行autorun((){console.log([autorun] 当前 count:,counter.count)})// 副作用reaction —— 精确监听 count 变化可获取新值和旧值reaction(()counter.count,(newCount,oldCount){console.log([reaction] count 变化:${oldCount}→${newCount})})exportdefaultcounter关键知识点makeAutoObservableMobX 6 推荐写法自动完成状态/动作/计算属性的标记autoBind: true自动绑定this指向避免组件调用时丢失上下文runInAction异步场景下修改状态的必备方法确保变更被 MobX 捕获autorun/reactionMobX 副作用 API用于监听状态变化并执行日志/上报等逻辑2. 汽车列表 Storesrc/store/car.tsimport{makeAutoObservable}frommobxclassCar{constructor(){makeAutoObservable(this,{},{autoBind:true})}// 可观察数组汽车品牌列表list[Tesla,BMW,Audi]// 可选新增修改数组的动作示例addCar(car:string){this.list.push(car)}removeCar(index:number){this.list.splice(index,1)}}// 导出单例实例exportdefaultnewCar()关键知识点数组/对象等引用类型会被 MobX 自动转为可观察结构组件中使用car.list.join(, )会自动监听数组变化数组变更时组件自动重渲染3. 根 Store Context 封装src/store.tsimport{createContext,useContext}fromreactimportcarfrom./carimportcounterfrom./counter// 根 Store 类组合所有子 Store实现统一管理classMobxStore{carcar countercounter}// 创建全局单例根 StoreconststorenewMobxStore()// 创建 React Context用于全局注入 StoreconststoreContextcreateContext(store)// 自定义 Hook简化组件中获取 Store 的方式替代逐层传递 propsexportconstuseStore()useContext(storeContext)关键知识点使用 React Context 实现全局状态共享任何组件都可通过useStore()获取根 Store单例模式确保整个应用共享同一个状态实例4. 主页面组件src/App.tsximport React from react import { observer } from mobx-react-lite // 导入 observer 高阶组件 import { useStore } from ./store // 使用 observer 包装组件使其响应 MobX 状态变化 const App observer(() { // 从根 Store 中获取 counter 和 car 子 Store const { counter, car } useStore() return ( div classNameApp header classNameApp-header {/* 展示原始计数值 */} pCount -- old: {counter.count}/p {/* 展示计算属性计数值的 2 倍 */} pCount -- X2: {counter.double}/p {/* 展示可观察数组 */} pCar List: {car.list.join(, )}/p {/* 同步 1 按钮 */} button onClick{counter.increment} style{{ margin: 0 5px }} Click 1 /button {/* 异步 1 按钮延迟 1 秒 */} button onClick{counter.incrementAsync} style{{ margin: 0 5px }} Click 1 (async) /button {/* 同步 -1 按钮 */} button onClick{counter.decrement} style{{ margin: 0 5px }} Click -1 /button {/* 重置按钮 */} button onClick{counter.reset} style{{ margin: 0 5px }} Click reset /button {/* 可选测试数组操作按钮 */} button onClick{() car.addCar(BYD)} style{{ margin: 0 5px }} Add BYD /button /header /div ) }) export default App关键知识点observer将 React 函数组件转为响应式组件依赖的 MobX 状态变化时自动重渲染组件中直接访问counter.count、counter.double、car.list无需额外监听逻辑按钮点击直接调用 Store 中的action方法遵循 MobX「状态只能通过动作修改」的规范五、运行效果与交互说明启动项目后访问http://localhost:3000可体验以下交互基础计数操作点击Click 1计数立即 1点击Click -1计数立即 -1点击Click reset计数重置为 0点击Click 1 (async)1 秒后计数 1异步场景演示计算属性Count -- X2会自动跟随count变化始终显示count * 2可观察数组点击Add BYD按钮汽车列表会新增BYD页面自动更新控制台日志状态变化时控制台会打印autorun和reaction的日志直观展示状态变更监听效果六、核心概念总结概念作用代码示例observable定义可观察状态count 0/list [Tesla, ...]action定义修改状态的方法increment()/addCar()computed定义基于状态的衍生值缓存结果get double()observer让组件响应状态变化自动重渲染observer(() { ... })autorun监听状态变化自动执行副作用autorun(() console.log(counter.count))reaction精确监听某个状态可获取新/旧值reaction(() counter.count, (new, old) { ... })runInAction异步场景下修改状态确保被 MobX 追踪runInAction(() this.count)useStore自定义 Hook全局获取根 Storeconst { counter } useStore()七、进阶优化与扩展1. 性能优化局部响应式渲染如果组件大部分内容不依赖 MobX 状态可使用Observer组件包裹局部内容减少重渲染范围import { Observer } from mobx-react-lite const OptimizedApp () { const { counter } useStore() return ( div h2固定标题不会重渲染/h2 {/* 仅这部分响应式更新 */} Observer {() pCount: {counter.count}/p} /Observer /div ) }2. 多 Store 拆分复杂项目可按业务模块拆分更多子 Store如userStore、orderStore在根 Store 中组合// src/store/user.tsclassUserStore{...}exportdefaultnewUserStore()// src/store.tsclassMobxStore{carcar countercounter useruserStore// 新增用户 Store}3. 类型安全增强TypeScript 会自动推断 Store 类型也可显式定义接口interfaceICounter{count:numberdouble:numberincrement:()voiddecrement:()voidincrementAsync:()voidreset:()void}八、部署与构建1. 构建生产版本npmrun build# 或 yarnyarnbuild构建产物会生成在build/目录可直接部署到静态服务器。2. 代码提交与推送# 查看修改gitstatus# 添加修改gitadd.# 提交gitcommit-mfeat: complete mobx-react-lite demo# 推送到远程仓库gitpush origin main九、常见问题与避坑指南组件不响应状态变化确认组件是否被observer包裹确认状态修改是否在action或runInAction中执行异步状态不更新异步回调中修改状态必须用runInAction包裹this 指向丢失定义 Store 时添加{ autoBind: true }或在组件中手动绑定onClick{() counter.increment()}数组/对象不更新确保数组/对象是 MobX 可观察结构避免直接赋值新数组/对象推荐使用push/splice等方法

相关文章:

148.《mobx-react-lite + TypeScript 入门实战教程(完整版)》

一、教程前言 MobX 是一款轻量级响应式状态管理库,相比 Redux 更简洁、学习成本更低;mobx-react-lite 是 MobX 专为 React 函数组件设计的轻量级绑定库,结合 TypeScript 可实现类型安全的状态管理。 本教程通过「计数器 汽车列表」实战案例&…...

LITESTAR 4D应用:道路照明设计

设计意义道路照明是一种维护公共安全的技术和设施,它能够提高夜间路段的通行效率和安全性,也能减少交通事故发生率。通过道路照明系统,驾驶员能够更清楚地看到道路上的情况,避免碰撞和其他意外事件,行人也能够更加安全…...

受激发射损耗(STED)显微镜

超分辨率显微镜——光学系统,可以达到超过众所周知的阿贝衍射极限——已经有了广泛的用途,因为获得最大可能的分辨率是该领域的关键目标之一。实现这一目标的一种方法是受激发射损耗(STED)的概念。在这里,荧光样品由两…...

六轴机械臂的轨迹优化就像在迷宫里找最短路线——传统粒子群算法(PSO)容易卡在局部最优里打转。咱们今天搞点野路子,给算法加点特技

六自由度机器人改进粒子群算法先看个典型场景:机械臂末端要从A点移动到B点,六个关节角的组合可能有上百万种解。传统PSO跑起来就像一群没头苍蝇: # 传统PSO核心更新逻辑 for particle in swarm:velocity inertia * velocity c1 * rand() * …...

AI可能让我们重获生活——如果我们不搞砸的话

前几天我把车停在客户办公楼的停车场,隔壁车位上有个女人坐在车里大声放着音乐。她注意到我在看她,摇下车窗说:"我一会儿就进去……只是想享受最后几分钟的自由时光!"这就是我们想要的生活方式吗?不&#xf…...

【通信观系列】三十一、物联网发展

物联网发展为什么需要物联网?为什么物联网突然“火”了?物联网和5G的关系物联网技术的发展演进物联网行业的发展现状2021-04-28最近几年,物联网的概念非常火爆,和物联网相关的技术,例如NB-IoT、LoRa、eMTC等&#xff0…...

【启动U盘制作神器】一个U盘搞定系统安装重装,适合新手小白,操作简单!

说在前面的话 Ventoy是一个制作可启动U盘的开源工具,你无需反复地格式化U盘,你只需要把ISO/WIM/IMG/VHD(x)/EFI等类型的文件,直接拷到U盘里就可以启动,无需其他操作。 今天给大家带来的是Ventoy 1.1.09,新更新的版本&…...

【避坑实战】STM32F103C8T6 PC13点灯不亮?一文搞定电平逻辑+工程配置+完整代码

文章目录一、STM32F103C8T6最小系统板硬件识别1.1 板载LED对应的真实引脚定义1.2 PC13与LED的电气连接方式二、Keil MDK工程创建与基础配置2.1 编译器与芯片库文件配置2.2 标准库工程目录结构搭建三、GPIO端口初始化代码实现3.1 GPIOC时钟使能操作3.2 PC13推挽输出模式配置3.3 …...

构建电商数据质量体系

构建电商数据质量体系关键词:电商数据、数据质量体系、数据清洗、数据监控、数据治理摘要:本文围绕构建电商数据质量体系展开,详细阐述了电商数据质量的重要性及相关背景知识。通过对核心概念与联系的剖析,深入讲解了核心算法原理…...

C语言100篇:从入门到天花板 第14篇 字符数组与字符串:定义、输入输出、常用操作

【独家】C语言100篇:从入门到天花板 第14篇 字符数组与字符串:定义、输入输出、常用操作 作者:华夏之光永存 前言 大家好,我是华夏之光永存,欢迎继续阅读 CSDN独家高质量专栏《C语言100篇:从入门到天花板》。 前面我们学习了一维数组、二维数组,能够处理各类数字批量…...

sdut-程序设计基础Ⅰ-期末测试(重现)

6-1 sdut-C语言实验-老师在哪里(字符串查找)2023年是令人难忘的一年,这一年我们终于打败了新冠,人们重新自由地生活。对于山东理工大学计算机学院来说,又迎来了一群可爱的新生,他们龙腾虎跃,积极投入到了大…...

微服务性能优化:10 个技巧让吞吐量提升 50%

前言:微服务性能的核心痛点 随着业务规模增长,微服务架构常面临吞吐量瓶颈、响应延迟高、资源利用率低三大核心问题。很多团队投入大量资源扩容,却忽略了代码架构、缓存策略、通信机制等层面的优化空间。本文结合生产环境实战经验&#xff0c…...

黑马学习第一天

今日总结: IDK下载:https://www.oracle.com/cn/java/technologies/downloads/#java17 环境变量: 终端常用命令: 盘符:切换盘符:D:、E: idr:查看当前路径下的文件信息 CD: 进入单级目录:c…...

BLE谐波测试

Measure → Harmonic Distortion → 设置 Fundamental Freq f₀ → 设置 Number of Harmonics 2(或更多) → RUN → 自动显示各次谐波的 dBm 和 dBc然后用500通过USB左发射源...

Git急救指南:误操作全拯救

Git误操作急救手册大纲常见误操作场景误删本地分支或文件误提交敏感信息(如密码、密钥)误覆盖或强制推送导致远程分支丢失误执行git reset或git rebase导致提交历史混乱数据恢复方法找回误删的分支或提交 使用git reflog查看操作记录,找到误删…...

B端拓客核验困局:法人号码筛选,如何平衡精准度与成本?

做B端客户拓展的团队,几乎都绕不开一个核心环节——企业法人、股东、核心决策人号码的核验与筛选。人工手筛耗时费力,根本无法适配规模化拓客需求;可依赖工具辅助,又常常陷入两难困境,难以找到精准度与成本的平衡点。B…...

记录一次 Tailscale 远程桌面无法连接的完整排查记录

最近遇到一个比较典型的远程连接故障: 通过 Tailscale 从 Windows 10 远程桌面连接 Windows 11,之前一直正常,某天突然无法连接,提示:远程桌面由于以下原因之一无法连接到远程计算机 1)未启用对服务器的远程…...

Java21 虚拟线程实战:后端并发编程新范式

为什么需要虚拟线程?打破后端并发的性能枷锁 在传统Java后端开发中,我们一直使用**平台线程(Platform Thread)**处理并发请求,它直接映射到操作系统内核线程。这种模型在高并发场景下存在两大核心痛点: 资源…...

C# winform部署SAM2的onnx模型

【效果演示】【测试环境】vs2019net framework4.8.0opencvsharp4.13.0onnxruntime1.24.3【界面代码】using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using …...

Python 实战:基于朴素贝叶斯的中文评价情感分析(好评 / 差评自动识别)| 附完整可运行代码

前言 在电商、本地生活、内容平台等场景中,每天都会产生海量的用户评价文本。人工逐条区分好评 / 差评、挖掘用户痛点效率极低,而通过 NLP 机器学习技术实现评价情感倾向自动分类,可以帮助商家快速定位产品问题、优化服务体验,也…...

学习 JAVA DAY 01

今天是学习java的第一天,了解了java的发展历史,也知道现在处于互联网行业变革过程中。全球迎来第四次工业革命,人工智能(AI)将改变一切!Java定义的说法:Java是一门被企业广泛使用的高级计算机语…...

基于路径简化问题说明vector较于数组的优势

以前写程序时,遇到需要动态添加或删除元素的情况,我总是习惯用数组,然后维护一个计数器。但自从用了vector,我发现它的push_back和pop_back非常方便,特别是在做这道“简化路径”的题目的时候介绍vectorvector是C标准库…...

Leetcode128.『最长连续序列』学习笔记

1. 使用set的简洁解法 class Solution:def longestConsecutive(self, nums: List[int]) -> int:nums set(nums)longest 0for num in nums:if num - 1 not in nums:curr numwhile num in nums:num1longest max(longest, num - curr)return longest加了set之后&#xff0c…...

SpringBoot单元测试实战:Mock技术全解析

在 Spring Boot 中整合 Mock(模拟) 主要用于单元测试和集成测试,目的是隔离被测组件,避免依赖真实外部服务(如数据库、HTTP 接口、文件系统等)。Spring Boot 提供了强大的测试支持,结合 JUnit 5…...

239 滑动窗口最大值

题目 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1: 输入:nums [1,3,-1,-3,5,3,6,7], k 3…...

大模型连载8:词向量如何表示近义词?

余弦相似度和欧式距离 既然我们将 token 都转换到了高维的数学空间中,那么在高维数学空间中,如何来衡量两个 token (高维空间中为向量)的含义是相似的,还是相反的呢? 比如,在人类的认知中&…...

计算机毕业设计之springboot北工国际健身俱乐部

本系统为会员而设计制作北工国际健身俱乐部,旨在实现北工国际健身俱乐部智能化、现代化管理。本北工国际健身俱乐部管理自动化系统的开发和研制的最终目的是将北工国际健身俱乐部的运作模式从手工记录数据转变为网络信息查询管理,从而为现代管理人员的使…...

Day01笔记整理

java背景: java用于企业及应用开发,有JavaSE(基本)、JavaEE(企业)、JavaME(小型)三大技术平台。 jdk 1、jdk中的java语句运用: 在jdk安装目录的bin下,存在…...

计算机毕业设计之springboot基于宠物饲养管理APP的设计与实现

宠物饲养管理APP设计的目的是为用户提供宠物信息、年龄段、饮食信息、生活习惯等方面的平台。与PC端应用程序相比,宠物饲养管理APP的设计主要面向于宠物店,旨在为管理员和用户提供一个宠物饲养管理APP。用户可以通过APP及时查看宠物信息等。宠物饲养管理…...

AI原生应用领域意图识别的发展现状与未来展望

AI原生应用的"心灵翻译官":意图识别的进化之路与未来图景 关键词 意图识别、AI原生应用、自然语言理解、多模态交互、大模型微调、小样本学习、可解释性AI 摘要 在AI原生应用(AI-Native Apps)的世界里,意图识别就像…...