是的,它是在反应的反模式。组件卸载后可能会执行this.setState({ results: res.results })
。
最好的方法是将状态(搜索挂起/搜索解析)移出反应组件。您可以利用redux
+ redux-thunk
或mobx
或flux
来帮助您。对于简单的情况,你可以建立一个可取消的承诺。
const makeCancelable = (promise) => {
let hasCanceled_ = false;
const wrappedPromise = new Promise((resolve, reject) => {
promise.then(
val => hasCanceled_ ? reject({isCanceled: true}) : resolve(val),
error => hasCanceled_ ? reject({isCanceled: true}) : reject(error)
);
});
return {
promise: wrappedPromise,
cancel() {
hasCanceled_ = true;
},
};
};
class MyComponent extends Component {
componentDidMount() {
this.cancellableSearch = makeCancelable(this.props.doSearch());
this.cancellableSearch.then((res) => {
this.setState({ results: res.results });
}).catch((reason) => {
if (!isCanceled.isCanceled) {
console.error('some error occurs', reason);
}
})
}
componentWillUnmount() {
this.cancellableSearch.cancel();
}
// ...
}
撤销的承诺的代码是从这里复制:https://facebook.github.io/react/blog/2015/12/16/ismounted-antipattern.html
是的, ,我知道反应是为了视图,这就是为什么我问这个问题。我的问题出现了,因为我觉得,一旦用户选择了ID,我就可以将其存储在商店中,我必须再次清空商店的这一部分,因为这是暂时的,也许还有其他方法可以做到这一点。 – Kossel