让我解释一下这段代码的结果,以便轻松地询问我的问题。
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()
相关。
每当我更改名称输入时,都会记录“效果”和“清理”。反之亦然,每当我更改用户名输入时,都不会记录任何消息,因为我将 --- 添加到 --- useEffect()
[username]
的第二个参数。这与 componentDidUpdate()
有关
最后,当 ForExample component
卸载时,将记录“清理”。这与 componentWillUnmount()
相关。
我们都知道。
总而言之,每当重新渲染组件时都会调用“清理”(包括卸载)
如果我想让这个组件仅在卸载时记录“清理”,我只需将 useEffect()
的第二个参数更改为 []
。
但是,如果我将 [username]
更改为 []
, ForExample component
不再实现 componentDidUpdate()
输入
我想要做的是,使组件支持 componentDidUpdate()
仅用于名称输入和 componentWillUnmount()
。 (仅在卸载组件时记录“清理”)
原文由 koo 发布,翻译遵循 CC BY-SA 4.0 许可协议
由于清理不依赖于
username
,因此您可以将清理放在单独的useEffect
中,该数组将空数组作为第二个参数。例子