Позвольте мне объяснить результат этого кода, чтобы легко задать мою проблему.
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
в нем второй аргумент, а другой - пустой массив, в качестве второго аргумента.