为什么Redux中的对象是不可变的?

为什么Redux中的对象是不可变的?,第1张

为什么Redux中的对象是不可变的?

Redux是一个小型库,将状态表示为(不可变的)对象。和 新状态 通过将当前状态传递给纯函数来创建全新的对象/应用程序状态。

如果您的眼睛在那儿,请放心。总而言之,Redux不能通过修改对象来表示应用程序状态的变化(就像使用面向对象的范例一样)。相反,状态更改表示为输入对象和输出对象()
之间差异

var output = reducer(input)
。如果您进行突变
input
output
使状态无效。

概括地说,Redux要求不可变性,因为Redux将您的应用程序状态表示为“冻结对象快照”。使用这些 离散快照
,您可以保存状态或反转状态,并且通常对所有状态更改都有更多的“核算”。

您的应用程序状态 只能 通过称为reducers的纯函数类别进行更改。还原剂具有2个重要特性:

  1. 它们 从不变异不会 返回新建的对象:这样就可以对输入+输出进行推理, 而不会产生副作用
  2. 它们的签名 始终
    function name(state, action) {}
    ,因此可以轻松组成它们:

假设状态看起来像这样:

    var theState = {      _2ndLevel: {        count: 0      }    }

我们想增加计数,所以我们制造这些减速器

const INCR_2ND_LEVEL_COUNT = 'incr2NdLevelCount';function _2ndlevel (state, action) {    switch (action.type) {        case INCR_2ND_LEVEL_COUNT: var newState = Objectd.assign({}, state); newState.count++ return newState;        }    }function topLevel (state, action) {    switch (action.type) {        case INCR_2ND_LEVEL_COUNT: return Object.assign(     {},      {_2ndLevel: _2ndlevel(state._2ndlevel, action)} );    }}

请注意使用

Object.assign({}, ...)
来在 每个化 简器中创建全新的对象:

假设我们已经将Redux连接到这些reducer,那么如果我们使用Redux的事件系统来触发状态更改…

    dispatch({type: INCR_2ND_LEVEL_COUNT})

… Redux将呼叫:

    theNewState = topLevel(theState, action);

注意:

action
来自
dispatch()

现在

theNewState
是一个 全新的对象

注意:您可以使用库(或新的语言功能)强制实施不变性,或者只是注意不要使任何东西:D

要深入了解,我强烈建议您观看由Dan
Abramov(创作者)制作的该视频。它应该回答您的任何缠绵的问题。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5642316.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存