Дозвольте мені пояснити результат цього коду за те, що я легко поставив своє питання.
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
другим аргументом, а другий - порожнім масивом як другий аргумент.