非官方测试版翻译
本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →
动机
随着 JavaScript 单页应用的需求日益复杂,我们的代码需要管理比以往任何时候都多的状态。这些状态可能包括服务器响应、缓存数据,以及尚未保存到服务器的本地数据。UI 状态也变得越来越复杂,因为我们需要管理活动路由、选中的标签页、加载指示器、分页控件等等。
管理这种不断变化的状态非常困难。如果一个模型可以更新另一个模型,那么视图可以更新模型,该模型再更新另一个模型,而这又可能导致另一个视图更新。在某个时刻,你不再理解应用中发生了什么,因为你已经失去了对状态何时、为何以及如何变化的控制。当系统变得不透明且非确定性时,重现错误或添加新功能都会变得困难。
如果这还不够糟糕,请考虑前端产品开发中日益普遍的新需求。作为开发者,我们需要处理乐观更新、服务端渲染、在路由跳转前预取数据等等。我们发现自己正在试图管理前所未有的复杂性,这让我们不禁要问:是否该放弃了? 答案当然是 不。
这种复杂性之所以难以处理,是因为我们混合了两种人类思维难以推理的概念:变化与异步性。我称它们为 Mentos and Coke。分开来看,它们都很棒,但混在一起就会制造混乱。像 React 这样的库试图通过在视图层中移除异步操作和直接的 DOM 操作来解决这个问题。然而,管理数据状态的工作还是留给了你。这时,Redux 就派上用场了。
借鉴了 Flux、CQRS 和 Event Sourcing 的思想,Redux 试图通过施加一些限制规则来让状态变化变得可预测。这些限制体现在 Redux 的 三大原则 中。