Redux原则似乎是矛盾的

时间:2015-12-24 23:41:56

标签: redux

也许有人可以向我解释这一点,但在我看来,这两个原则相互矛盾,这实际上阻碍了我学习Redux的进展。

状态是只读 更改是使用纯函数制作的

State为只读之后的第一行是:"改变状态的唯一方法......"。如果某些内容是只读的,那么它就不应该首先发生变异。即使在Egghead视频中,状态也始终标记为const,但仍然会更改为const的目的。

有人可以向我解释这些不是截然相反的观点吗?

2 个答案:

答案 0 :(得分:1)

就Redux之外的世界而言,该州是只读的。可以将其视为已发生的仅附加应用程序事件(操作)序列的视图。您可以生成新的操作,这些操作将导致状态变得不同。

当然,它是现实世界,并且存在某处的可变性。正如Rich Hickey所说:

  

“如果一棵树倒在树林里,它会发出声音吗?如果是纯粹的   函数mutate数据产生一个不可变的值,是吗?“〜   @richhickey

但是,尽管实际上可行,但您可以在不直接改变事物的情况下编写应用程序。相反,您描述了您希望看到的更改(调度操作),并且框架(Redux)执行它们,使用您的reducer一次创建商店的整个视图(状态),并通过React' s props,结果会生成一个新视图。

这是受功能反应式编程概念的启发。在这个范例中,所有函数都是纯粹的,并且您通过表示"您将对值进行的操作,如果它已经改变了#34;来处理变化的概念。在某种意义上,您将变量的整个过去和未来概念化为不可变函数,其未来您根本就不知道。对不起,如果这太哲学了。

答案 1 :(得分:1)

没有矛盾,但肯定是混乱是可以理解的。

考虑它的好方法是在React状态和Redux状态之间进行类比。

在React中,您只需在constructor()getInitialState()方法中定义一次组件状态。从那时起,您始终将this.state视为只读,您永远不会将任何内容分配给this.state。要更改状态,请致电this.setState()

Redux也是如此。您可以定义状态 - 或状态的每个不同部分 - 一次。通常,它被称为initialState,并被指定为reducer的state参数的默认值。将state视为只读意味着永远不会覆盖或改变状态。更改状态的唯一方法是使用reducer的返回值。

或者,简而言之......

我认为你真正的挂断是因为状态既变化又只读,所以让我更精辟:

CD-ROM是只读的,但我可以弹出CD并将其替换为另一张CD。