[解決済み] react hooks useEffect() cleanup for only componentWillUnmount?
質問
私の問題を簡単に解決するために、このコードの結果を説明しましょう。
const ForExample = () => {
const [name, setName] = useState('');
const [username, setUsername] = useState('');
useEffect(() => {
console.log('effect');
console.log({
name,
username
});
return () => {
console.log('cleaned up');
console.log({
name,
username
});
};
}, [username]);
const handleName = e => {
const { value } = e.target;
setName(value);
};
const handleUsername = e => {
const { value } = e.target;
setUsername(value);
};
return (
<div>
<div>
<input value={name} onChange={handleName} />
<input value={username} onChange={handleUsername} />
</div>
<div>
<div>
<span>{name}</span>
</div>
<div>
<span>{username}</span>
</div>
</div>
</div>
);
};
このとき
ForExample component
がマウントされると、'effect' がログに記録されます。これは
componentDidMount()
.
そして、名前入力を変更するたびに、「効果」と「クリーンアップ」の両方がログに記録されます。逆に、ユーザー名の入力を変更しても、メッセージは記録されません。
[username]
の第2パラメータに
useEffect()
. これは
componentDidUpdate()
最後に
ForExample component
がアンマウントされると、'cleaned up' がログに記録されます。これは
componentWillUnmount()
.
みんな知っていることです。
要約すると、コンポーネントの再レンダリング(アンマウントを含む)のたびに 'cleaned up' が実行されます。
もし、このコンポーネントがアンマウントされたときだけ 'cleaned up' を記録するようにしたい場合は、次のように
useEffect()
を
[]
.
しかし、もし私が
[username]
を
[]
,
ForExample component
は実装されなくなりました。
componentDidUpdate()
を名前入力に使用します。
私がやりたいことは、コンポーネントが両方の
componentDidUpdate()
のみで、名前入力は
componentWillUnmount()
. (コンポーネントがアンマウントされる瞬間だけログが「クリーンアップ」されます)
解決方法は?
クリーンナップは
username
を使用すれば、クリーンアップを別の
useEffect
で、第二引数に空の配列が渡されます。
例
const { useState, useEffect } = React;
const ForExample = () => {
const [name, setName] = useState("");
const [username, setUsername] = useState("");
useEffect(
() => {
console.log("effect");
},
[username]
);
useEffect(() => {
return () => {
console.log("cleaned up");
};
}, []);
const handleName = e => {
const { value } = e.target;
setName(value);
};
const handleUsername = e => {
const { value } = e.target;
setUsername(value);
};
return (
<div>
<div>
<input value={name} onChange={handleName} />
<input value={username} onChange={handleUsername} />
</div>
<div>
<div>
<span>{name}</span>
</div>
<div>
<span>{username}</span>
</div>
</div>
</div>
);
};
function App() {
const [shouldRender, setShouldRender] = useState(true);
useEffect(() => {
setTimeout(() => {
setShouldRender(false);
}, 5000);
}, []);
return shouldRender ? <ForExample /> : null;
}
ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div id="root"></div>
関連
-
[解決済み】React 17で動作するEnzymeアダプターはどれですか?
-
[解決済み] ReactのuseEffectでローディング関数を1回だけ呼び出す方法
-
[解決済み] ReactJsのCreateClassは関数ではない
-
[解決済み] React JS Jestで「SyntaxError: 予期しないトークン"
-
[解決済み] create-react-appビルドスクリプトを実行する際に、ビルド.env変数を設定するには?
-
[解決済み] useEffect React Hook使用時の依存性欠如の警告を修正する方法
-
[解決済み] React Hook useEffectの非同期関数に関する警告:useEffect関数はクリーンアップ関数か何も返さないこと
-
[解決済み] React HooksでcomponentWillMount()を使用するには?
-
[解決済み】react hooksで`setState`コールバックを使用する方法
-
[解決済み】React Hooks useEffectでoldValuesとnewValuesを比較する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】ReactJS: マテリアルuiのブレークポイントについて
-
[解決済み] テスト
-
[解決済み】プリセットファイルはオブジェクトのエクスポートができない
-
[解決済み] Next.jsでWebSocketを利用する
-
[解決済み] formcontrollabel - material-ui | Reactのデフォルトのtypography classを変更するには?
-
[解決済み] React-Router 4 キャッチオールルート
-
[解決済み] validateDOMNesting警告React
-
React はエラー TypeError を報告します。未定義のプロパティ 'XX' を読み取ることができない、問題は解決されました。
-
[解決済み] react-navigation v5を使ったreact-nativeアプリのAppNavigatorの構文を更新する。
-
[解決済み] React Hooksの「exhaustive-deps」lintルールを理解する