让我解释一下这段代码的结果,以便轻松询问我的问题。
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()
. (仅在卸载组件时记录“已清理”)