React:如何防止 ComponentDidMount 和 ComponentDidUpdate 中的 api 调用相互覆盖
React: how to prevent api calls in ComponentDidMount and in ComponentDidUpdate override each other
在 componentDidMount
中,我使用 Redux
操作获取数据,例如:
componentDidMount() {
let parameter = some code;
this.props.getAction(parameter).then(r => {
if(r.type.endsWith('SUCCESS')){
this.setState({cList: r.payload.data.data})
}
}
}
然后,在 componentDidUpdate
中,我需要再次获取数据,当函数内的参数发生变化时(我正在使用 lodash
):
componentDidUpdate(prevProps, prevState){
if(!isEqual(this.props.parameter, prevProps.parameter){
let parameter = some code;
if(r.type.endsWith('SUCCESS')){
this.setState({cList: r.payload.data.data})
}
}
}
问题是,如果 componentDidUpdate
中的 Promise
returns 是 componentDidMount
中 Promise
之前的结果,当我更改参数时在组件中,显示的数据是错误的;它仍然显示来自 componentDidMount
的数据,而不是来自 componentDidUpdate
中的新操作调用的数据。
我希望一切都清楚。
我怎样才能避免这种情况?谢谢。
您可以在您的组件中保留一个实例变量 lastRequestId
来跟踪哪个 promise 是 运行,像这样:
class MyComponent extends Component {
constructor(props) {
super(props);
this.lastRequestId = null;
}
componentDidMount() {
let parameter = "some code";
this.lastRequestId = 'ON_MOUNT_REQUEST';
this.props.getAction(parameter).then(r => {
if(r.type.endsWith('SUCCESS') && this.lastRequestId === 'ON_MOUNT_REQUEST'){
this.setState({cList: r.payload.data.data})
}
})
}
componentDidUpdate(prevProps, prevState){
if(!isEqual(this.props.parameter, prevProps.parameter)) {
let parameter = "some code";
this.lastRequestId = 'ON_UPDATE_REQUEST';
this.props.getAction(parameter).then(r => {
if(r.type.endsWith('SUCCESS') && this.lastRequestId === 'ON_UPDATE_REQUEST'){
this.setState({cList: r.payload.data.data})
}
})
}
}
}
在 componentDidMount
中,我使用 Redux
操作获取数据,例如:
componentDidMount() {
let parameter = some code;
this.props.getAction(parameter).then(r => {
if(r.type.endsWith('SUCCESS')){
this.setState({cList: r.payload.data.data})
}
}
}
然后,在 componentDidUpdate
中,我需要再次获取数据,当函数内的参数发生变化时(我正在使用 lodash
):
componentDidUpdate(prevProps, prevState){
if(!isEqual(this.props.parameter, prevProps.parameter){
let parameter = some code;
if(r.type.endsWith('SUCCESS')){
this.setState({cList: r.payload.data.data})
}
}
}
问题是,如果 componentDidUpdate
中的 Promise
returns 是 componentDidMount
中 Promise
之前的结果,当我更改参数时在组件中,显示的数据是错误的;它仍然显示来自 componentDidMount
的数据,而不是来自 componentDidUpdate
中的新操作调用的数据。
我希望一切都清楚。
我怎样才能避免这种情况?谢谢。
您可以在您的组件中保留一个实例变量 lastRequestId
来跟踪哪个 promise 是 运行,像这样:
class MyComponent extends Component {
constructor(props) {
super(props);
this.lastRequestId = null;
}
componentDidMount() {
let parameter = "some code";
this.lastRequestId = 'ON_MOUNT_REQUEST';
this.props.getAction(parameter).then(r => {
if(r.type.endsWith('SUCCESS') && this.lastRequestId === 'ON_MOUNT_REQUEST'){
this.setState({cList: r.payload.data.data})
}
})
}
componentDidUpdate(prevProps, prevState){
if(!isEqual(this.props.parameter, prevProps.parameter)) {
let parameter = "some code";
this.lastRequestId = 'ON_UPDATE_REQUEST';
this.props.getAction(parameter).then(r => {
if(r.type.endsWith('SUCCESS') && this.lastRequestId === 'ON_UPDATE_REQUEST'){
this.setState({cList: r.payload.data.data})
}
})
}
}
}