我想知道如何从 redux 状态使用 onClick 删除项目。
let initialState = {
items: [
{
name: 'A',
age: 23
},
{
name: 'B',
age: 20
},
{
name: 'C',
age: 29
}
]
}
Run Code Online (Sandbox Code Playgroud)
然后我在我的组件中用列表渲染我的对象:
const listItems = this.props.MyState.items.map((item) =>
<li key={item.name} onClick=event => this.props.deleteItem(event, item) >{item.name}</li>
);
Run Code Online (Sandbox Code Playgroud)
然后将此项目传递给带有 action.payload 的 reducer
但后来我不知道如何从状态中删除项目。
例如:action.payload我在onClick这里得到的项目是如何解决这个问题的?
case DELETE_ITEM:
return { ...state, ? };
Run Code Online (Sandbox Code Playgroud)
Chr*_*Ngo 11
考虑到您的状态是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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我们只是将设置action.payload为项目的索引而不是整个项目。
所以你的动作创建者应该是这样的:
export const deleteItem = (index) => {
dispatch({
type: DELETE_ITEM,
payload: index
})
}
Run Code Online (Sandbox Code Playgroud)
现在我们可以真正简化您的标记。只需使用index参数 in.map()来满足我们的动作创建者的参数:
const listItems = this.props.MyState.items.map((item, index) =>
<li key={item.name} onClick={() => this.props.deleteItem(index)} >{item.name}</li>
);
Run Code Online (Sandbox Code Playgroud)
小智 7
您可以尝试替换状态的数组。
case DELETE_ITEM: {
return {...state. items: state.items.splice(item.index, 1)};
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13729 次 |
| 最近记录: |