栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么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(创作者)制作的该视频。它应该回答您的任何缠绵的问题。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/636457.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号