Позвольте мне объяснить результат этого кода, чтобы легко задать мою проблему.
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]второй параметр useEffect(). Это связано сcomponentDidUpdate()
Наконец, при ForExample componentразмонтировании будет зарегистрировано «очищено». Это связано с componentWillUnmount().
Мы все это знаем.
Подводя итог, «очищено» вызывается всякий раз, когда компонент повторно отрисовывается (включая размонтирование).
Если я хочу, чтобы этот компонент регистрировал `` очищенный '' только на тот момент, когда он отключен, мне просто нужно изменить второй параметр useEffect()на[] .
Но если я перейду [username]на [], ForExample componentбольше не будет реализовыватьcomponentDidUpdate() ввод имени.
Я хочу сделать так, чтобы компонент поддерживал как componentDidUpdate()ввод имени, так и componentWillUnmount(). (ведение журнала `` очищено '' только для момента размонтирования компонента)

usernameв нем второй аргумент, а другой - пустой массив, в качестве второго аргумента.