如何从redux状态删除项目?

时间:2019-08-16 06:35:06

标签: reactjs redux

我想知道如何从redux状态使用onClick删除项目。

let initialState = {
  items: [
      {
       name: 'A',
       age: 23
      },
      {
       name: 'B',
       age: 20
      },
      {
      name: 'C',
      age: 29
      }
     ]
    }

然后我在组件中渲染带有列表的对象:

const listItems = this.props.MyState.items.map((item) =>
  <li key={item.name} onClick=event => this.props.deleteItem(event, item) >{item.name}</li>
);

然后将其通过action.payload传递给减速器

但是我不知道如何从状态中删除项目。

例如:action.payload是我在onClick得到的物品如何在这里弄清楚?

case DELETE_ITEM:
      return { ...state, ? };

3 个答案:

答案 0 :(得分:3)

在传播当前状态之后,通过从唯一属性(例如:items)中过滤掉id

case DELETE_ITEM:
      return { ...state, items: state.items.filter(i => i.id !== action.payload.id };

答案 1 :(得分:3)

您可以尝试替换状态数组。

case DELETE_ITEM: {
 return {...state. items: state.items.splice(item.index, 1)};
}

答案 2 :(得分:0)

考虑到您的状态为array of objects,一种解决方案是通过其索引消除所选项目。您还应该避免在redux中进行直接状态更改,因为这会导致副作用。如果您打算进行某种形式的变异(删除,更新),请始终尝试创建状态的深层克隆或副本。因此,涵盖所有基础:

您的减速器应该看起来像这样:

let initialState = {
  items: [
      {
       name: 'A',
       age: 23
      },
      {
       name: 'B',
       age: 20
      },
      {
      name: 'C',
      age: 29
      }
  ]
}

const userReducer = (state = initialState, action) => {
   switch(action.type){
      case ADD_ITEM:
         ...
      case DELETE_ITEM:
         return {
           ...state,
           items: state.items.filter((item, index) => index !== action.payload)
         }
   }
}

在这种情况下,我们只是将action.payload设置为项目的索引,而不是整个项目。

所以您的动作创建者应该像这样:

export const deleteItem = (index) => {
   dispatch({
      type: DELETE_ITEM,
      payload: index
   })
}

现在我们可以真正简化您的标记了。只需使用index中的.map()参数即可满足我们的动作创建者的要求。

const listItems = this.props.MyState.items.map((item, index) =>
  <li key={item.name} onClick={() => this.props.deleteItem(index)} >{item.name}</li>
);