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

感谢您的反馈.

推荐答案

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

如果你的眼睛在那边呆滞,别担心.总而言之,Redux并不通过修改对象来表示应用程序状态的变化(就像面向对象范例那样).相反,状态变化被表示为输入对象和输出对象(var output = reducer(input))之间的关系.如果你变异了inputoutput,你就会使状态无效.

换句话说,不可变性是Redux的一个要求,因为Redux将应用程序状态表示为"冻结的对象快照".有了这discrete snapshots个,你可以保存你的状态,或者反转状态,并且通常对所有状态的改变有更多的"解释".

应用程序的状态被一类称为reducers的纯函数改变了only.减速器有两个重要特性:

  1. 它们never mutate,返回新构建的对象:这允许关于输入+输出without side-effects的推理
  2. 他们的签名是always 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({}, ...)each reducer中创建一个全新的对象:

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

    dispatch({type: INCR_2ND_LEVEL_COUNT})

.Redux将呼叫:

    theNewState = topLevel(theState, action);

注:action来自dispatch()

现在theNewStateentirely new object.

注意:您可以使用a library(或new language features)强制执行不变性,或者只需小心不要更改任何内容:d

为了更深入地了解,我强烈推荐你使用Dan Abramov(创作者)的this video号 checkout .它应该能回答你所有挥之不go 的问题.

Angular相关问答推荐

angular:从模板中的可观察数组获取随机元素

文件阅读器未正确给出某些CSV文件的结果

Angular前端调用ALB身份验证后的后端并重定向

NGX- colored颜色 Select 器安装出错

自定义垫日历中选定的日期(Angular material )

除非将 signal.set 作为间隔的一部分调用,否则Angular 信号效果不会执行

获取 Angular 中所有子集合 firestore 的列表

大型 Angular 12 应用程序 - 我如何管理 js 文件

正确理解 angular14 中的注入 - 必须从注入上下文中调用注入()

Angular 2:Validators.pattern() 不工作

Observable.forkJoin 和数组参数

如何在不刷新整页的情况下更新组件

类型错误:无法读取未定义的属性

在 webpack 构建中包含 git commit hash 和 date

Angular @NGRX中这三个点的含义是什么

具有多个订阅者的 Angular 2 Observable

BrowserAnimationsModule 和 NoopAnimationsModule 有什么区别?

Angular 2:将外部js文件导入组件

在 2 个模块之间共享组件

输入更改时Angular2动态输入字段失go 焦点