【发布时间】:2019-02-13 21:08:00
【问题描述】:
我的数组 (icdCodes) 中我的项目 (icdCode) 的更新缩减程序没有在反应组件中正确更新(直到我重新加载整个组件)。首先,它给出了重复键问题,因为在触发操作后,数组中新更新的项与我的列表组件中的前一个状态项一起显示。我通过一些调整想出了一个解决方法,但无论我尝试了什么其他方法,我都无法在前端正确更新此项目。
初始状态:
state = {icdCodes: []}
更新减速器:
case UPDATE_ICD_CODE:
return {
...state,
icdCodes: [...state.icdCodes, action.payload]
}
这是我的 react 组件加载这些数组项列表的摘录(通过映射):
render() {
const { icdCodes } = this.props.icdCode;
return (
<Card body>
<ListGroup flush>
<Row>
this.icdCodes.map(({ _id, icdCode, icdCodeValue }) => (
<div>{icdCodeValue}</div>
)
</Row>
</ListGroup>
</Card>
);
}
}
IcdCodeItem.propTypes = {
getIcdCodes: PropTypes.func.isRequired,
icdCode: PropTypes.object.isRequired
};
const mapStateToProps = state => ({
icdCode: state.icdCode
});
export default connect(
mapStateToProps,
{ getIcdCodes, deleteIcdCode, updateIcdCode }
)(IcdCodeItem);
这是 action.payload 返回的内容(更新后的 icdCode 项,用新值代替“icdCode”部分):
{icdCodeVersion: "10",
_id: "5b922fbae1c4241b54ea8aa4",
icdCode: "I9",
icdCodeValue: "jam jam",
date: "2018-09-07T07:58:50.104Z", …}
以下代码仅部分解决了该问题(允许我只编辑我的对象而不是整个对象的第一个键(不是 icdCode 项目,而是项目中的 icdCode - 为可怕的语法道歉):
return {
...state,
icdCodes: state.icdCodes.map(
icdCode =>
icdCode._id === action.payload._id
? { ...icdCode, icdCode: action.payload.icdCode }
: icdCode
)
};
【问题讨论】:
-
UPDATE_ICD_CODE的目的是什么?是更新元素还是添加元素?您的有效载荷的形状如何?如果可能的话,你能把你的应用放到codesandbox.io吗? -
你的最后一次尝试有点奇怪。您正在映射一个数组,然后如果元素等于 0,则通过传播它返回一个对象,但将其名称作为属性再次分配给您的有效负载。
-
@devserkan 它是我的 reducer 中用于 icdCode 状态的更新方法(redux 存储中的 icdCodes 数组)。我只是想更新 icdCode 对象中的一个条目。更新持续到数据库,但 redux reducer 不会更新单个项目,它只是将更新的项目作为额外项目添加到我的 icdCode 项目列表中。我的 action.payload 返回更新后的 icdCode 项目,它是一个对象。我将更新我的代码以添加该 sn-p。
-
所以,只有
icdCode部分发生了变化,对吧?那么你会用这个新对象替换同一个对象吗? -
确切地说,只有从 react icdCodeItem 组件中的数组中编辑的特定 icdCode 项。当我开始分别操作两个单独的 icdCode 项目字段时(一次只更新对象的一个键),我的问题出现了。
标签: javascript reactjs redux react-redux