0

0

javascript如何实现状态管理_如何像Vuex或Redux一样管理状态

紅蓮之龍

紅蓮之龍

发布时间:2025-12-25 16:49:02

|

830人浏览过

|

来源于php中文网

原创

javascript状态管理核心是集中存储、可预测更新、响应式同步,通过对象+发布订阅实现commit/subscribe机制,支持快照回溯与proxy响应式,可封装为createstore工厂函数。

javascript如何实现状态管理_如何像vuex或redux一样管理状态

JavaScript 实现状态管理,核心在于集中存储、可预测更新、响应式同步。不需要框架也能做到,关键是设计好状态的读、写、订阅机制。下面从原理到实践,给出轻量但实用的实现方式。

用一个对象 + 发布订阅模式管理全局状态

这是最贴近 Vuex/Redux 思想的纯 JS 方案:状态存于单一对象,所有变更必须通过明确的“提交”动作触发,并通知依赖者更新。

  • 定义一个 state 对象 存储所有数据(如 { count: 0, user: null }
  • 提供 commit 方法 统一修改状态(不直接赋值),例如 commit('INCREMENT', { step: 1 })
  • 内部维护一个 handlers 映射表,把 type 映射到具体修改逻辑(类似 Vuex 的 mutations)
  • subscribe 方法 允许组件或模块监听状态变化,拿到新旧状态做响应(类似 Vue 的 watch 或 Redux 的 store.subscribe)

支持时间旅行和调试:记录每次 commit 的快照

像 Redux DevTools 那样回溯状态,只需在每次 commit 后保存一份深拷贝的历史记录。

  • 用数组 history = [] 存储每次 commit 后的状态快照
  • 添加 undo()jumpTo(index) 方法,还原指定版本的状态
  • 注意避免直接修改原 state,推荐用 structuredClone 或简单 JSON 序列化+解析做浅层快照(适合无函数、无 Date 等特殊值的场景)

让状态变化自动触发视图更新(简易响应式)

没有 Vue 或 React 时,可以用 Proxy 拦截 state 访问与修改,结合事件通知实现自动刷新。

Runwayml(AI painting)
Runwayml(AI painting)

Runway 平台的文本生成图像AI工具

下载

立即学习Java免费学习笔记(深入)”;

  • 用 Proxy 包裹 state,set 拦截器中调用 notify() 广播变更
  • 每个 UI 模块调用 useStore((state) => state.count) 注册回调,只在相关字段变化时执行
  • 进阶可加依赖收集(类似 Vue2 的 defineProperty + Dep),但 Proxy + 简单标记已能满足多数需求

组合式封装:导出一个可复用的 createStore 函数

把上述能力打包成工厂函数,方便多实例或按模块拆分。

  • 接收初始 state 和 handlers 对象作为参数
  • 返回包含 statecommitsubscribedispatch(支持异步 action)等方法的对象
  • 示例调用:const store = createStore({ count: 0 }, { INCREMENT(state, payload) { state.count += payload.step } })

本质上,Vuex 和 Redux 解决的是同一类问题:避免状态散落、变更不可追踪、协作混乱。用原生 JS 实现,不是为了替代它们,而是理解其骨架——状态即对象、变更即函数、响应即订阅。项目小就手写;大项目仍推荐成熟方案,因它们已处理好边界(如不可变更新、中间件、热重载等)。不复杂但容易忽略细节。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

182

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

225

2025.12.18

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

453

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

546

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

331

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

252

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1049

2024.03.01

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

23

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Vue 教程
Vue 教程

共42课时 | 9.3万人学习

Vue3.x 工具篇--十天技能课堂
Vue3.x 工具篇--十天技能课堂

共26课时 | 1.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号