javascript - Redux Reducer 状态未正确更新
问题描述
在我的反应应用程序中,我有两个组件(个人项目列表和随机项目列表)。在我的随机项目列表组件中,我可以单击该项目并将其添加到我的个人项目列表组件中。但是,当我这样做时,它会用我刚刚添加的新项目替换我个人项目状态中的其他项目。我只是想添加到我的个人物品清单中。
//Update Items List
export const updateItemsList = (data) => ({
type : UPDATE_ITEMS_LIST,
payload: data
});
//Items List Reducer
const initialState = {
items: [],
loading: false
};
export default function(state = initialState, action){
switch(action.type){
case UPDATE_ITEMS_LIST:
return{
...state,
items: action.payload,
loading: false
};
default:
return state;
}
}
//Select Item To Add
export const addItemToList = (itemId) => (dispatch, getState) =>{
const config = {
headers:{
"Content-Type": "application/json"
}
};
axios.post(`/api/items/addItem/${itemId}`, {}, config)
.then(res => {
dispatch({
type: ADD_ITEM_SUCCESS,
payload: res.data
})
dispatch(updateItemsList(res.data, ...getState().itemsList.items));
})
.catch(err =>{
dispatch({type: ADD_ITEM_ERROR}));
});
};
//React User's Item List Component
class Items extends Component{
componentDidMount(){
this.props.userItems();
}
render(){
const { items, loading} = this.props.itemsList;
return(
<React.Fragment>
{loading === true ? (
<div>
<div>
<h1>Your Items Are Loading...</h1>
</div>
</div>
):(
<div>
{items.map(item => (
<React.Fragment key={item.id}>
<div>
<div>
<h3>{item.name}</h3>
</div>
</div>
</React.Fragment>
))}
</div>
)}
</React.Fragment>
);
}
};
export default connect(mapStateToProps, mapActionsToProps)(Items);
//React Random Item List Component
class RandomItems extends Component{
handleAddItem = (id) =>{
this.props.addItemToList(id);
}
componentDidMount(){
this.props.getRandomItemsList();
}
render(){
const { randomItems, loading} = this.props.randomItemsList;
return(
<React.Fragment>
{loading === true ? (
<div>
<div>
<h1>Loading Random Items...</h1>
</div>
</div>
): (
<div>
{randomItems.map(item => (
<React.Fragment key={item.id}>
<div>
<div>
<h3>{item.name}</h3>
<button onClick={this.handleAddItem.bind(this, item.id)}>Add To List</button>
</div>
</div>
</React.Fragment>
))}
</div>
)}
</React.Fragment>
)
}
};
export default connect(mapStateToProps, mapActionsToProps)(RandomItems);
解决方案
假设res.data
是您刚刚添加的新项目,当您发送 updateItemList 时,我认为您错过了数组的方括号。所以你只需发送res.data
有效载荷。应该是这样的
updateItemsList([res.data, ...getState().itemsList.items])
推荐阅读
- javascript - Node.js 函数在第一次调用后不更新值
- javascript - MongoDB,在 mongodb 集合中查找不同的项目,并为每个不同的项目添加一条新记录
- batch-file - Windows 10 更新 - 现在 PDFTK 批处理文件损坏
- javascript - 使用另一个数组以严格相同的顺序打字稿对数组进行排序
- html - 如何在 flex 容器中居中 ::after 伪内容?
- javascript - 跟踪用户输入数字的次数
- fluentd - 用fluent.d解析linux审计日志
- python - 贝叶斯网络 Python
- google-cloud-dataflow - Apache Beam - 从第一个元素开始滑动窗口
- android - 在 Android Leanback 上自定义 BrowseSupportFragment / RowSupportFragment 的 header 组件