Reactアプリで表示を切り替えるためにコンポーネントをアンマウントしたときに、下記のようなエラーが出ることがあります。
index.js:1 Warning: Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in the componentWillUnmount method.
このエントリでは、Reactコンポーネントのアンマウント時のエラーを修正する方法を紹介します。
エラーの意味は、アンマウントしたコンポーネントではstateの更新が行えないため、componentWillUnmountメソッドで非同期処理やイベントの講読をキャンセルしなければメモリリークを引き起こす可能性があるというものです。
解決策としては大きく2つあります。
ひとつは、setStateを含むそれらの処理を、ReactのuseEffect
副作用フック内で行うというものです。
しかし、フックには次のようなルールがあります。
フックを呼び出すのはトップレベルのみフックを呼び出すのは React の関数内のみ
つまり、今のところクラスコンポーネント内のメソッドからは呼べないということです。これはちょっと微妙です。
もうひとつの解決方法は、mounted
のようなマウント状態を表すカスタムプロパティを定義する方法です。
流れとしては次のようになります。
- コンストラクタで
this.mounted = false
を定義する -
componentDidMount()
内でthis.mounted = true
に、componentWillUnmount()
内でthis.mounted = false
にする - 非同期処理では
this.mounted
をチェックする
下記に例を示します。
constructor(props) {
super(props);
this.mounted = false;
}
componentDidMount() {
this.mounted = true;
}
componentWillUnmount() {
this.mounted = false;
}
doSomething() {
// 非同期処理の前にmountedをチェックする
this.mounted && this.setState({ ... });
}
これでエラーが発生しなくなります。
以上です。
このエントリでは、Reactコンポーネントのアンマウント時のエラーを修正する方法を紹介しました。
コメントを送る
コメントはブログオーナーのみ閲覧できます