私は私の反応コンポーネントをアンマウントする必要があるユースケースを持っています。しかし、場合によっては、特定の反応成分が異なる機能によってアンマウントされる。 したがって、コンポーネントをアンマウントする前にコンポーネントがマウントされているかどうかを確認する必要があります。 isMounted()
が正式に廃止されているので反応コンポーネントがアンマウントされているかどうかを確認する方法はありますか?
答えて
、あなたはあなたのコンポーネントでこれを行うことができます。
componentDidMount() {
this._ismounted = true;
}
componentWillUnmount() {
this._ismounted = false;
}
独自のstate
変数を維持する。このパターンはReactJSドキュメントの詳細です:私は、ことがわかっhttps://facebook.github.io/react/blog/2015/12/16/ismounted-antipattern.html
コンポーネントはアンマウントされ、生成されます。var
if(!this._calledComponentWillUnmount)this.setState({vars});
私はAPIをpolling
で停止する方法を探していたので、ここに来ました。
react docsは、websocket
のケースをカバーしますが、ポーリングケースはカバーしません。
私はそれが動作することを中心に
// React component
let allowPolling = true
React.createClass({
poll() {
if (!allowPolling) {
return
}
// otherwise, call the api
}
componentWillMount() {
allowPolling = true
}
componentWillUnmount() {
allowPolling = false
}
})
を働いた方法。私はShubhamの答えは使用を中止し、コードを移行する必要がある人々の反応によって提案された回避策だと思い
] =それは
、君たちはこのための任意の失敗したテストケースを知っている場合は私に知らせてください役に立てば幸いisMounted
アンチパターン。
これは必ずしも悪いわけではありませんが、この問題の実際の解決策をリストする価値があります。
The article linked by Shubhamには、このアンチパターンを回避するための2つの提案があります。必要なコンポーネントは、コンポーネントがアンマウントされたときにsetStateを呼び出す理由によって異なります。
あなたのコンポーネントにフラックスストアを使用している場合、あなたはES6の約束を使用する場合は、あなたが作るためにあなたの約束をラップする必要があるかもしれませんcomponentWillUnmount
class MyComponent extends React.Component {
componentDidMount() {
mydatastore.subscribe(this);
}
render() {
...
}
componentWillUnmount() {
mydatastore.unsubscribe(this);
}
}
に解除しなければなりませんそれはキャンセル可能です。
const cancelablePromise = makeCancelable(
new Promise(r => component.setState({...}}))
);
cancelablePromise
.promise
.then(() => console.log('resolved'))
.catch((reason) => console.log('isCanceled', reason.isCanceled));
cancelablePromise.cancel(); // Cancel the promise
リンク先の記事でmakeCancelable
については、こちらをご覧ください。
結論として、変数を設定し、コンポーネントがマウントされているかどうかを確認してこの問題を修正しないでください。問題の根本に移動します。あなたが何かを考え出すことができる場合は、他の一般的なケースでコメントしてください。
- 1. 応答があるかどうかを確認する方法
- 2. バッチファイルから、プログラムがインストールされているかどうかを確認する方法はありますか?
- 3. UIViewControllerが表示されているかどうかを確認する良い方法はありますか?
- 4. は、performSelector:withObject:afterDelay:が登録されているかどうかを確認する方法はありますか?
- 5. コンボボックスのドロップダウンリストが表示されているかどうかを確認する方法はありますか?
- 6. メンバーにモックが設定されているかどうかを確認する方法はありますか?
- 7. シンボルが引用されているかどうかを確認する方法はありますか?
- 8. OSにプログラム/パッケージがインストールされているかどうかを確認する方法はありますか?
- 9. 特定のアドインがインストールされているかどうかを確認する方法はありますか?
- 10. ベロシティ:変数が定義されているかどうかを確認する方法はありますか
- 11. フラッシュがインストールされているかどうかを確認する方法はありますか?
- 12. システムキャレットが表示されているかどうかを確認する方法はありますか?
- 13. AUTOLISPでSHIFTが押されているかどうかを確認する方法はありますか?
- 14. Primefaces RadioCheckboxがチェックされているかどうかを確認する方法はありますか?
- 15. cudaコードがリロケータブルデバイスコードでコンパイルされているかどうかを確認する方法はありますか?
- 16. QML要素がロードされているかどうかを確認する方法はありますか?
- 17. iPhoneアプリでボタンが押されているかどうかを確認する方法はありますか?
- 18. jarファイルがapkにコンパイルされているかどうかを確認する方法はありますか?
- 19. Pythonのsetuptoolsがインストールされているかどうかを確認する方法はありますか?
- 20. gradleキャッシュが変更されているかどうかを確認する方法はありますか?
- 21. クラスがPythonでインスタンス化されているかどうかを確認する方法はありますか?
- 22. コンポーネントはいつアンマウントされますか?
- 23. ファイルシステムをアンマウントする前にファイルが開いているかどうかを確認する方法はありますか?
- 24. UDIDがビルドに含まれているかどうかを確認する方法はありますか?
- 25. 指定されたファイルがFASTAであるかどうかを確認する方法はありますか?
- 26. HealthKitが承認されているかどうかを確認する方法
- 27. どのSASコンポーネントがインストールされているかを確認する方法
- 28. React Native:コンポーネントがビューポートにあるかどうかを確認する方法
- 29. バックボーンビューがレンダリングされているかどうかを確認する方法は?
- 30. window.confirm()がサポートされているかどうかを確認する方法は?
アドバイスありがとうございます。ドキュメントから... componentDidMountで_isMountedプロパティをtrueに設定し、componentWillUnmountでfalseに設定してください。ただし、これを使用してください。setState({マウントされた:false});状態の変更がすぐには起こらないので、警告を防ぐには遅すぎるかもしれません - これはクラスプロパティを使用する方がよいでしょう... this.mounted = false - ありがとうございました、これは正しい方向に私を指摘しました – danday74
@ danday74、そうですは正しい。私はおそらく答えを書いた時点を逃したでしょう。 –
ええと、私は10日前にupvoted :) – danday74