网页与前端 · 进阶

Web应用中的状态管理

一句话: 大多数被称作「状态」的东西,其实是放错了地方的服务端数据——把它们分开,一半的复杂度就消失了。

四种状态

服务端数据。列表、条目、个人资料。它们是远端真相来源的副本,需要按缓存来处理:加载、刷新、过期。

界面状态。打开的面板、选中的标签页、输入的文字。活在组件里,随组件消亡。

地址状态。筛选、分页、搜索。它的位置在URL里——这样才能分享和返回。

真正的全局状态。登录用户、主题、语言。极少的几样东西。

常见错误

把所有东西都塞进一个全局存储。结果是:每个页面都依赖每个页面,数据在没人察觉的情况下变旧,以及只有按特定顺序打开页面才会出现的bug。

一分开,大部分全局代码就蒸发了。剩下的很小,也很容易理解。

需要显式处理的

每次获取的加载态和错误态、防止在更新的请求之后才返回的旧请求、以及在服务端拒绝时知道如何回滚的乐观更新。

深入一层

按数据类型定义一套新鲜度策略——一份副本多久之内算有效、什么时候在后台刷新。没有明确策略,每个页面都会自创一套,然后「这个为什么不更新」就成了永恒的bug。