reactjs - 逻辑理解react hooks,useState和useEffect(或者state和生命周期方法)的区别
问题描述
我无法理解 useState 和 useEffect 之间的逻辑差异,更准确地说,是状态和生命周期方法之间的逻辑差异。例如,我观看了教程,并查看了 useEffect 的示例:
const UseEffectBasics = () => {
const [value, setVal] = useState(0);
const add = () => {
setVal((x) => { return x + 1 })
}
useEffect(() => {
if (value > 0) {
document.title = `Title: ${value}`
}
},[value])
return <>
<h1>{value}</h1>
<button className="btn" onClick={add}>add</button>
</>;
};
当我们点击按钮时,文档的标题显示我们将数字加一。我玩了一点,并完全删除了 useEffect 方法,而是这样做了:
const UseEffectBasics = () => {
const [value, setVal] = useState(0);
document.title = `Title: ${value}`
const add = () => {
setVal((x) => { return x + 1 })
}
return <>
<h1>{value}</h1>
<button className="btn" onClick={add}>add</button>
</>;
};
猜猜看,它的工作原理与前面的代码相同。那么,useEffect 究竟是如何工作的,这个方法的动机是什么?
PS:请不要给我发文档链接,一些基础教程,请确定,我已经研究过了。我知道我缺少非常简单、非常基本的东西,但我不知道那是什么,以及在哪里解决它。
解决方案
useEffect
用于跟踪有状态的变量更改更有效 - 它通过仅在值更改时执行回调中的代码来避免不必要的调用,而不是在每次渲染时执行。
在 的情况下document.title
,这并不重要,因为这是一项廉价的操作。但如果是runExpensiveFunction
,那么这种方法:
const UseEffectBasics = () => {
const [value, setVal] = useState(0);
runExpensiveOperation(value);
会有问题,因为每次组件重新渲染时都会运行昂贵的操作。将代码放入useEffect
具有[value]
依赖关系数组的 a 可确保它仅在需要时运行 - 当value
发生更改时。
当涉及由状态更改导致的 API 调用时,这一点尤其重要,这很常见。您不想在每次组件重新渲染时调用 API - 您只想在需要请求新数据时调用它,因此将 API 调用放在 auseEffect
中是比将 API 调用放在 main 中更好的方法组件函数体。
推荐阅读
- javascript - 使用 JavaScript 获取 Bootstrap 创建的元素
- reactjs - Material UI Tree View,检查我点击的节点是否有子节点
- javascript - 将 Autodesk Forge 热图映射到房间 - 数据可视化 API
- amazon-web-services - AWS API Gateway - 监控特定端点
- python - 在一个单位立方体中排列 N 个球体
- node.js - jwt 令牌存储在 CORS 异步请求中失败
- javascript - 如何从 Django 中的视图访问 JavaScript 中的 python 数组?
- python - PyQt5 - 如何使用 QinputDialog.getItems 制作取消按钮
- vba - 查找字符串,然后将格式应用于前面的字符数
- c - C 中的参数过多和 char[22] 错误