前端开发离不开状态管理,数据和状态的区别在于数据是否发生变化,以及是否需要触发视图重绘或逻辑执行。

前端开发离不开状态管理,数据和状态的区别在于数据是否发生变化,以及是否需要触发视图重绘或逻辑执行。jQuery时代之所以没状态管理,因为那时手动操作DOM和触发逻辑,所有事情都由开发者负责。随着前端应用变得复杂,框架开始提供状态管理能力,比如React的setState、Redux的action和Vuex的commit。状态管理本质上只有两件事:状态变化前进行异步处理、中间件处理等;状态变化后进行视图重绘、生命周期管理等。React和Redux就是通过API来修改状态,内部做合并和异步处理。而Vue使用代理来拦截get和set操作,Vue3用Proxy替代了Object.defineProperty,解决了动态键名监听问题。频繁小改动时不需要每次都重跑逻辑,React使用异步队列来合并和去重setState操作,Vue把Watcher放进异步队列并去重。组件间传值可以使用props、context或event bus,props简单直观但层级多时显得啰嗦,context和event bus只能做变化后的联动。Redux、MobX和Vuex是全局状态库的代表。Redux通过函数式reducer和中间件把异步流程写成可复用模块;MobX使用响应式代理和action class把state组织成面向对象的结构;Vuex同时提供响应式和Redux式的API。总结起来,状态管理有两条主线:唯一入口API或代理拦截变化前异步处理和变化后视图逻辑更新。真正理解这些概念和原理,才能抓住前端开发的灵魂。