reactjs - 在 Redux 中反应更新数组状态
问题描述
我对 React 和 Redux 很陌生。我设法使用以下内容更新数组中的现有项目
case ACTION_TYPES.SET_PREPARATION_ITEM:
const { id, x, y, rotation } = action.payload;
const currentPreparationItem = state.entity.preparationItems[id];
currentPreparationItem.x = x;
currentPreparationItem.y = y;
currentPreparationItem.rotation = rotation;
return { ...state, preparationItems: { ...state.entity.preparationItems } };
现在我正在尝试使用以下代码将新项目添加到数组中
case ACTION_TYPES.ADD_PREPARATION_ITEM:
const implant: IProductMySuffix = action.payload;
const preparationItem: IPreparationItemMySuffix = {};
preparationItem.x = 10;
preparationItem.y = 10;
preparationItem.productId = implant.id;
preparationItem.image = implant.image;
preparationItem.imageContentType = implant.imageContentType;
const result = { ...state, preparationItems: { ...state.entity.preparationItems.concat(preparationItem) } }
return result;
如果我调试正确,result
const 将有一个包含一项的数组。然而,在渲染方法中,它似乎没有检测到数组是否有任何元素。知道是什么原因造成的吗?
添加了我的部分组件
const mapStateToProps = (storeState: IRootState) => ({
users: storeState.userManagement.users,
customers: storeState.customer.entities,
businesses: storeState.business.entities,
products: storeState.product.entities,
preparationEntity: storeState.preparation.entity,
loading: storeState.preparation.loading,
updating: storeState.preparation.updating,
updateSuccess: storeState.preparation.updateSuccess
});
const mapDispatchToProps = {
getUsers,
getCustomers,
getBusinesses,
getEntity,
getProducts,
updateEntity,
setBlob,
createEntity,
reset,
setPreparationItem,
addPreparationItem
};
解决方案
首先,你正在改变状态,这违反了 redux 的规则
case ACTION_TYPES.SET_PREPARATION_ITEM:
const { id, x, y, rotation } = action.payload;
const currentPreparationItem = {...state.entity.preparationItems[id]}; // create a new object instance
currentPreparationItem.x = x;
currentPreparationItem.y = y;
currentPreparationItem.rotation = rotation;
const entity = state.entity ? {...state.entity} : {};
const preparationItems = entity.preparationItems ? [...entity.preparationItems] : [] // Create a new Array instance
preparationItems[id] = currentPreparationItem;
entity.preparationItems = preparationItems;
return {
...state,
entity
};
第二:你preparationItems
作为一个对象传播,但它实际上是一个数组(基于你的问题描述)
case ACTION_TYPES.ADD_PREPARATION_ITEM:
const implant: IProductMySuffix = action.payload;
const preparationItem: IPreparationItemMySuffix = {};
preparationItem.x = 10;
preparationItem.y = 10;
preparationItem.productId = implant.id;
preparationItem.image = implant.image;
preparationItem.imageContentType = implant.imageContentType;
const entity = state.entity ? {...state.entity} : {};
// Create a new Array instance and add the new object at the end
entity.preparationItems = entity.preparationItems ? [
...entity.preparationItems,
preparationItem
] : [preparationItem];
const result = {
...state,
entity
}
return result;
推荐阅读
- amazon-web-services - 具有基于授权上下文的自定义声明的 AWS Cognito 令牌
- php - 如何在 php 错误语句中使用 span 标签
- javascript - 通过单击行将表行滚动到 div 的顶部
- xamarin.ios - Restsharp - 无法获取错误响应正文
- python - 在 $in 中添加模式,并聚合
- android - 为什么 Android Studio 3.2.1 无法正确解释文件内容 - 甚至没有关闭 - 对于我的一半项目类文件?
- scala - @specialized 补充资料
- python - Pandas:删除数据框中的重复行
- powershell - azure devops 在 powershell 中使用 dbatools 构建任务警告
- python - Python Flask:为新请求返回相同的响应