【发布时间】:2021-05-20 14:21:57
【问题描述】:
我有一个 react 组件,比如 MyComponent 有两个 props text 和 num 可以独立改变。考虑以下代码:
componentDidUpdate(prevProps) {
if (this.props.text !== prevProps.text || this.props.num !== prevProps.num) {
this.getDataAPICall(this.props.text, this.props.num);
}
}
// Incoming data is dependent on both text and num
getDataAPICall(text, num) {
fetch(SOMEURL+'/text/num').then(d => d.json())
.then(data => {
setState({ renderdata: data });
})
}
如果只更改其中一个道具,则没有问题。但是,当道具发生变化时,例如,text 从“a”变为“b”,num 从 1 变为 2,我意识到 componentDidUpdate 被 text 和 num 调用了两次价值观:
text: "b", num: 1 和 text: "b", num: 2。
由于num 可能会或可能不会改变(我不能确定),我也必须使用text: "b" 和num: 1 调用getDataAPICall。这会导致两个 API 调用(第一个获取错误数据的地方)。此外,根据调用的完成时间,组件的最终状态可能最终包含错误的数据。
我的问题是:这是 componentDidUpdate 的默认行为还是我在父组件中犯了错误?如果这是默认行为,如何避免使用部分更新的道具进行第一次 API 调用?
注意:这两个props其实也是父组件的props,通过mapStateToProps来自redux store。
谢谢
【问题讨论】:
-
我认为您在某处犯了错误。如果您看到多次调用 componentDidUpdate 并更改了不同的属性,则意味着这些属性没有同时更改,而是在多次渲染父组件之后。
-
@keul 谢谢。如果是这样,我会进一步调查。
-
@OmerSinanSarac 这些道具传递了什么,它们是如何改变的?发出异步请求并将它们设置为解析可能会得到一些unexpected results。确保仅在最后一次更改道具时设置状态。
标签: reactjs react-redux react-lifecycle