Angular 6 ngrx,如何将新项目添加到状态对象的数组中?

Posted

技术标签:

【中文标题】Angular 6 ngrx,如何将新项目添加到状态对象的数组中?【英文标题】:Angular 6 ngrx, how to add new item to array in state object? 【发布时间】:2019-02-06 03:11:19 【问题描述】:

我有一个简单的情况,我有像 CreatUser、CreateSuccess、CreateFail 这样的操作。我应该如何将新对象添加到数组以及何时调度Create 操作或CreateSuccess?我该怎么做?

export function reducer(state = init, action: Actions): State 
switch (action.type) 
    case ActionsTypes.CREATE:
        return 
            ...state,
            inProgress: true
        ;
    case ActionsTypes.CREATE_SUCCESS:
        return 
            ...state,
            users: state.users.push(action.payload),
            inProgress: false
        ;
    case ActionsTypes.CREATE_FAIL:
        return 
            ...state,
            error: action.payload,
            inProgress: false
        ;
    default:
        return state;

在上面的代码中,我尝试使用 push 方法添加新用户,但这不是一个好的解决方案。我该怎么做?

【问题讨论】:

【参考方案1】:

尝试使用spread operator,因为它会创建一个新的用户数组并且不会改变之前的数组。

users: [...state.users, action.payload]

或者使用@ngrx/entity 模块作为数组。这是最好的方法。

13.07.2019 更新

新模块 @ngrx/data 在 NgRx 8 中可用。该模块有助于为具有零样板的数组创建 CRUD 存储。

【讨论】:

谢谢,这是完美的答案。你能告诉我如何更新一个用户吗? 在你的 reducer 中,你需要找到更新用户的索引,使用 spred 运算符创建新用户数组,替换更新用户并返回新数组。如果您使用 @ngrx/entity 或 ngrx-data。您可以使用 updateOne 方法。 你推荐使用ngrx实体吗? 是的,它是数组的最佳方式。或者尝试使用angular-ngrx-data。最简单的然后@ngrx/entity 大数组的扩展操作可能是个问题【参考方案2】:

您的状态应该是不可变的,因此最好使用

users: state.users.concat(action.payload)

【讨论】:

【参考方案3】:

这适用于那些正在搜索如何以不可变方式在数组开头添加项目的人,这与使用改变原始操作的 unshift 运算符不同。 在操作开始时放置新项目会产生魔力

users: [action.payload,...state.users]

【讨论】:

这对于大数组来说是个坏主意...这种传播会创建新数组并将数据复制到其中..【参考方案4】:
export const reducer = createReducer(initialState,
  on(addTodo, (state,  todo ) => (
    ...state,
    todoInput: '',
    todos: [...state.todos, todo]
  ))
);

见:https://ngrx.io/guide/store/configuration/runtime-checks

【讨论】:

以上是关于Angular 6 ngrx,如何将新项目添加到状态对象的数组中?的主要内容,如果未能解决你的问题,请参考以下文章

ngrx/store@6.1.0 在升级到 Angular 7 时需要 @angular/core@^6.0.0 的对等体

如何通过 Angular 中的 NGRX 减速器使用数组更新状态?

Storybook 6 错误:ngrx no provider for Store 错误 - 如何修复? [关闭]

Angular 7、Ngrx、Rxjs 6 - 访问延迟加载模块之间的状态

typescript 6#todoapp-angular-ngrx

typescript 6#todoapp-angular-ngrx