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 component
zamontowaniu 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 component
odmontowanie 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 component
nie 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)
username
w której jako drugi argument, i jedna, której jako drugi argument podano pustą tablicę.