最佳答案
让我解释一下这段代码的结果,因为它很容易提出我的问题。
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()
。(仅在卸载组件时记录“清理”)