Let me explain the result of this code for asking my issue easily.
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>
);
};
When the ForExample component
mounts, 'effect' will be logged. This is related to the componentDidMount()
.
And whenever I change name input, both 'effect' and 'cleaned up' will be logged. Vice versa, no message will be logged whenever I change username input since I added [username]
to the second parameter of useEffect()
. This is related to the componentDidUpdate()
Lastly, when the ForExample component
unmounts, 'cleaned up' will be logged. This is related to the componentWillUnmount()
.
We all know that.
To sum, 'cleaned up' is invoked whenever the component is being re-rendered(includes unmount)
If I want to make this component to log 'cleaned up' for only the moment when it is unmount, I just have to change the second parameter of useEffect()
to []
.
But If I change [username]
to []
, ForExample component
no longer implements the componentDidUpdate()
for name input.
What I want to do is that, to make the component supports both componentDidUpdate()
only for name input and componentWillUnmount()
. (logging 'cleaned up' for only the moment when the component is being unmounted)
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…