让我解释一下此代码的结果,以便轻松询问我的问题。
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()
。(仅在卸载组件时记录“清理”)
由于清理操作不依赖于username
,因此您可以将清理操作放在一个单独的对象中useEffect
,该对象将空数组作为第二个参数。
例
const { useState, useEffect } = React;
const ForExample = () => {
const [name, setName] = useState("");
const [username, setUsername] = useState("");
useEffect(
() => {
console.log("effect");
},
[username]
);
useEffect(() => {
return () => {
console.log("cleaned up");
};
}, []);
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>
);
};
function App() {
const [shouldRender, setShouldRender] = useState(true);
useEffect(() => {
setTimeout(() => {
setShouldRender(false);
}, 5000);
}, []);
return shouldRender ? <ForExample /> : null;
}
ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div id="root"></div>
我在useeffect钩子上得到以下错误。 React Hook use效应有一个缺失的依赖项:当前页面。要么包含它,要么删除依赖array.eslintreact-钩子/穷举-deps 你知道我为什么会得到这个吗? }
我尝试了示例,如下所示:
我不明白为什么当我使用函数时,我的react组件会启动到infinite console.log。一切正常,但个人电脑开始像地狱一样落后。有人说函数在超时改变我的状态,还有重新启动组件,设置新的计时器等等。现在我需要知道如何证明它是正确的。 在不同版本的代码中清除不利于:
让我解释一下这段代码的结果,以便轻松地询问我的问题。 如果我想让这个组件只在卸载时保持日志“清理”,我只需要将的第二个参数更改为。 但是,如果将更改为,不再实现名称输入的。 我想做的是,使组件只支持名称输入和。(仅在卸载组件时,日志记录“已清除”)
问题内容: 在带有钩子的React中,更新状态的正确方法是嵌套对象是什么? 一个人怎么会使用到的更新来(附加一个字段)? (改变价值)? 问题答案: 您可以像这样传递新值