はい、それが反応におけるアンチパターンです。コンポーネントがアンマウントされた後に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
まあまあ私は反応がViewのために意図されていることを知っているので、私はこの質問をしました。私の質問は、私が感じるので、取得、ストアで保存、一度ユーザーがIDを選択すると、私は店のそのスライスを再度空にしなければならないので、時間的なので、多分それを行う別の方法があります。 – Kossel