Pozwólcie, że wyjaśnię wynik tego kodu, aby łatwo zadać mój problem.
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>
);
};
Po ForExample componentzamontowaniu zostanie zarejestrowany „efekt”. Jest to związane z componentDidMount().
Za każdym razem, gdy zmienię dane wejściowe, zarówno „efekt”, jak i „wyczyszczony” będą rejestrowane. I odwrotnie, żadna wiadomość nie zostanie zarejestrowana za każdym razem, gdy zmienię nazwę użytkownika, ponieważ dodałem [username]drugi parametr useEffect(). Jest to związane zcomponentDidUpdate()
Na koniec, gdy ForExample componentodmontowanie zostanie zapisane, zostanie zapisane polecenie „wyczyszczone”. Jest to związane z componentWillUnmount().
Wszyscy to wiemy.
Podsumowując, funkcja „wyczyszczona” jest wywoływana za każdym razem, gdy komponent jest ponownie renderowany (obejmuje odmontowanie)
Jeśli chcę, aby ten komponent rejestrował się „wyczyszczony” tylko na moment, w którym jest odmontowywany, wystarczy zmienić drugi parametr useEffect()na [].
Ale jeśli zmienię [username]na [], ForExample componentnie implementuje już componentDidUpdate()danych wejściowych dla nazwy.
Chcę to zrobić, aby komponent obsługiwał zarówno componentDidUpdate()tylko wprowadzanie nazwy, jak i componentWillUnmount(). (rejestrowanie `` wyczyszczone '' tylko na moment, w którym komponent jest odmontowywany)

usernamew której jako drugi argument, i jedna, której jako drugi argument podano pustą tablicę.