私の問題を簡単に尋ねるために、このコードの結果を説明しましょう。
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
マウントは、「効果」は記録されます。これはに関連していcomponentDidMount()
ます。
また、名前の入力を変更すると、「効果」と「クリーンアップ」の両方がログに記録されます。逆に、の[username]
2番目のパラメーターに追加したため、ユーザー名の入力を変更してもメッセージはログに記録されませんuseEffect()
。これはに関連していますcomponentDidUpdate()
最後に、ForExample component
マウントを解除すると、「クリーンアップ」がログに記録されます。これはに関連していcomponentWillUnmount()
ます。
我々はすべてそれを知っている。
要約すると、「クリーンアップ」は、コンポーネントが再レンダリングされるたびに呼び出されます(アンマウントを含む)
私はそれがアンマウントある一瞬だけ「クリーンアップ」ログインするには、このコンポーネントを作成したい場合は、私はちょうどの2番目のパラメータ変更する必要useEffect()
のを[]
。
しかし、に変更[username]
する[]
とForExample component
、fornamecomponentDidUpdate()
入力は実装されなくなります。
私がやりたいのは、コンポーネントcomponentDidUpdate()
が名前入力との両方をサポートするようにすることcomponentWillUnmount()
です。(コンポーネントがアンマウントされている間だけ「クリーンアップ」をログに記録します)
username
2番目の引数としてその中に配列が与えられているものと、2番目の引数として空の配列が与えられているもの。