typescript 为什么我们不直接在NgRx到达该州?

wj8zmpe1  于 2023-05-30  发布在  TypeScript
关注(0)|答案(2)|浏览(153)

目前我正在学习NgRx。到目前为止,我学到了这一点:

  • 为了改变状态,我们分派所谓的动作
  • 动作是一个带有标识符的对象,还可以选择带有有效负载
  • 这个动作不会直接到达存储器,而是到达所谓的reducer
  • reducer只是一个函数:它从存储中获取当前状态,并将操作作为输入
  • 在reducer中,我们可以查看动作标识符,并相应地对状态执行更改(我们将其作为参数获得),以不可变的方式更新该状态(更改副本)
  • reducer返回一个新的状态,它返回一个旧状态的副本,这个状态被转发到应用商店
  • 这个减少的状态然后覆盖旧的状态

我真的不明白,为什么我们不直接改变存储在存储中的状态?为什么我们需要这个reducer并在存储中的状态副本上进行更改并将其写回?
对于我的另一个问题,这里是一个位代码:

import { Ingredient } from '../../shared/ingredient.model';
import * as ShoppingListActions from './shopping-list.actions';

const initialState = {
  ingredients: [new Ingredient('Apples', 5), new Ingredient('Tomatoes', 10)]
};

export function shoppingListReducer(
  state = initialState,
  action: ShoppingListActions.AddIngredient
) {
  switch (action.type) {
    case ShoppingListActions.ADD_INGREDIENT:
      return {
        ...state,
        ingredients: [...state.ingredients, action.payload]
      };
    default:
      return state;
  }
}

这是一个简单的减速器。在这里,我们通过返回旧状态并覆盖ingredients来创建一个新状态。
是否有一个模式可以遵循,我们必须如何返回新状态,或者它取决于存储中的状态?

lnlaulya

lnlaulya1#

1.对于您的第一个问题,为什么我们不直接更改您的商店状态。答案是不变性
我认为整个[action > reducer > store > selector]流程的关键点是不变性。它确保没有任何不良的副作用,并且您的操作是可预测和可重复的。
这通常会提高性能,并且通常会简化编程和调试。
随着应用程序的扩展,NGRX架构将允许您进行一致且可靠的状态管理。
1.关于要遵循的模式,我们必须如何返回新状态。
您只需返回存储的新状态。这有助于更改以确保始终返回“新”值。考虑到reducer的状态是一个对象,我认为“new”状态有助于刷新存储的值,并允许应用程序知道reducer中是否有更改。
您的状态的直接变化不会导致前面所述的刷新。

7y4bm7vi

7y4bm7vi2#

@wscttc的回答已经提到了状态的不变性以及为什么这可以防止意外的副作用。
然而,我想提到另一个上级优势,这是你为reducer使用的纯函数。您知道这些函数是应用中唯一可以修改状态的部分。这些函数通常非常简单,测试起来也非常简单。通过动作,你可以找到容易触发它们的地方。

相关问题