Дозвольте мені пояснити результат цього коду за те, що я легко поставив своє питання.
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()введення імені for.
Що я хочу зробити, це зробити компонент підтримкою як componentDidUpdate()для введення імені, так і componentWillUnmount(). (реєстрація "очищена" лише на той момент, коли компонент демонтується)

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