【问题标题】:Redux state single item update showing previous versionRedux 状态单项更新显示之前的版本
【发布时间】: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


【解决方案1】:

您可以映射icdCodes 数组,然后如果元素是正确的(这里我通过_id 进行检查),那么您可以在不改变的情况下更改它。

case UPDATE_ICD_CODE: {
  const icdCodes = state.icdCodes.map(icd => {
    if (icd._id === action.payload._id) {
      return { ...icd, icdCode: action.payload.icdCode };
    }
    return icd;
  });

  return { ...state, icdCodes };
}

** cmets 后更新 **

如果您需要在此处更改多个属性,则为:

case UPDATE_ICD_CODE: {
  const { _id, icdCode, icdCodeValue } = action.payload;
  const icdCodes = state.icdCodes.map(icd => {
    if (icd._id === _id) {
      return { ...icd, icdCode, icdCodeValue };
    }
    return icd;
  });

  return { ...state, icdCodes };
}

如果你想完全改变对象,那就更容易了:

case UPDATE_ICD_CODE: {
    const { _id } = action.payload;
    const icdCodes = state.icdCodes.map(icd =>
        icd._id === _id ? action.payload : icd
    )

    return { ...state, icdCodes };
}

【讨论】:

  • 好的,这几乎是完美的,现在我唯一的问题是这仅适用于更新 icdCode 对象中的第一个字段(icdCode - 我应该调用这个 icdCodeNumber 以避免混淆),但不是第二个字段(icdCodeValue)。如何调整代码以更新整个对象而不是特定的 icdCode 字段?
  • 我对名称感到困惑 :) 我们在这里更改了数组中一个对象的属性。它是icdCode 属性。那么,您打算如何使用您的有效负载更改icdCodeValue
  • 另外,我检查了您更新的解决方案。这里和我的一样 :) 你在那里使用三元运算符我使用常规 if 块。
  • 从您第一次发帖时起,我就已经选择您的答案是正确的。非常感谢你的帮助和熬夜来帮助我的人。非常感谢您的帮助,希望您今晚/早上睡个好觉兄弟!
  • 没问题,不客气。我看到你第一次接受它,但坚持到底很重要:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-28
  • 2022-12-06
  • 1970-01-01
相关资源
最近更新 更多