내 문제를 쉽게 묻기 위해이 코드의 결과를 설명하겠습니다.
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
마운트 해제시 'cleaned up'이 기록됩니다. 이것은 componentWillUnmount()
.
우리 모두 알고 있습니다.
요약하면 구성 요소가 다시 렌더링 될 때마다 '정리 됨'이 호출됩니다 (마운트 해제 포함).
이 구성 요소가 마운트 해제 된 순간 만 '정리 됨'으로 기록되도록하려면의 두 번째 매개 변수를로 변경하면 useEffect()
됩니다 []
.
그러나 만약 내가 변화 [username]
로 []
, ForExample component
더 이상 구현하는 componentDidUpdate()
이름을 입력합니다.
내가하고 싶은 것은 구성 요소가 componentDidUpdate()
이름 입력과 componentWillUnmount()
. (구성 요소가 마운트 해제되는 순간에만 '정리 됨'로깅)
username
두 번째 인수로 배열이 제공 되고 하나는 두 번째 인수로 빈 배열이 제공됩니다.