Angular5 ngrx/store 改变数组的值

Angular5 ngrx/store changing a value of array

我想增加一个 ID,但我不知道如何使用 @ngrx/store。

我的默认状态:

const defaultState: UserState = {
    currentId: 1,
    users: [
        {
            id: 1,
            username: 'admin',
            password: 'admin'
        },
        {
            id: 2,
            username: 'admin2',
            password: 'admin2'
        },
        {
            id: 3,
            username: 'admin3',
            password: 'admin3'
        }
    ]
};

例如:

case UserActions.EDIT_CURRENTID:
            return newState(state, {currentId: action.payload});

工作正常,但我想做类似的事情:

case UserActions.INCREMENT_ID:
                return newState(state, {users[0].id: users[0].id + 1});

这个不行。

你能给我一些如何处理这个案子的建议吗?

在你的 reducer 函数中,将增量大小写更改为此

switch (action.type) {
   case UserActions.INCREMENT_ID: {
      const users = state.users;
      if (users && users.length > 0) {
         users[0].id += 1;
      }
      // you could also just return the state because the reference to users stays the same
      return {
         ...state,
         users: users
      }
   }
}

您的第一个案例有效,因为该州知道 属性 名为 currentId

您应该将案例更改为以下内容:

switch(action.type) {
    case UserActions.INCREMENT_ID:
        return {
           ...state,
           users: [
              { 
                 ...state.users[0],
                 id: state.users[0].id + 1
              },
              ...state.users.filter((_, index) => index > 0)
           ]
        }
}

在@ngrx 中,最佳做法是使用不可变数据结构。旧状态不应该被修改,旧状态中的对象也不应该被修改。这种方法创建一个新的状态对象,并且只为更改的用户创建一个新对象,同时为所有其他用户使用旧对象。如果您不确定是否存在用户列表,则可以通过以下方式扩展示例:

switch(action.type) {
    case UserActions.INCREMENT_ID:
        return state.users && state.users.length > 0 
           ? {
                ...state,
                users: [
                   { 
                      ...state.users[0],
                      id: state.users[0].id + 1
                   },
                   ...state.users.filter((_, index) => index > 0)
                ]
             } 
           : state;
}

当然可以替换

...state.users.filter((_, index) => index > 0)

...state.users.slice(1)

编辑: 或者,您可以使用地图功能:

switch(action.type) {
    case UserActions.INCREMENT_ID:
        return state.users && state.users.length > 0 
           ? {
                ...state,
                users: state.users.map((user, index) => index === 0 
                    ? { 
                         ...user, 
                         id: user.id + 1 
                      }
                    : user)
             } 
           : state;
}