我想知道如何从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, ? };
答案 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>
);