【发布时间】:2020-10-18 03:36:30
【问题描述】:
除了清理和依赖数组,还有什么理由使用useEffect?
function App() {
const [a, setA] = useState(0);
const b = `Number: ${a}`;
return (
<div className="App">
<p>
{b}
</p>
<button onClick={() => setA(a + 1)}>click</button>
</div>
);
}
如我们所见,我们不使用useEffect,但由于更改状态a 会触发重新渲染,然后b 也会被更改。在这种情况下,看起来我们甚至不需要 useEffect。
那么除了清理和依赖数组之外,useEffect 有什么独特的好处吗?
编辑
我认为大多数答案都基于一个假设:OP 对反应生命周期逻辑有很好的理解。但不幸的是,这是我的弱点。
虽然我经常使用useEffect 和那些旧的component* 生命周期方法,但我并没有真正意识到这些是函数组件本身之外的东西。这为他们提供了更多的灵活性和功能。
我并不是要侮辱任何人,但我确实认为我们应该更具体、更仔细地回答这个问题。任何人遍历我的个人资料都可以看到我也回答了很多问题。根据我的经验,人们通常缺乏提出关键和明确问题的知识,他们甚至没有意识到关键点是什么(是的,我就是这个问题中的一员)。
当我试图回答这个问题时,我会首先尝试澄清问题以了解 OP 缺少的关键部分是什么。
@PatrickRoberts 确实在说一些正确的话,但这并没有真正帮助我,因为这不是我缺少的部分。我会侮辱自己,因为我没有把问题说得足够清楚。但我也想说,理解/澄清问题比给出正确答案更重要。毕竟理论上大部分问题都可以通过官方文档解决。
【问题讨论】:
-
涉及到对在 DOM 中呈现的节点的引用或发出异步 HTTP 请求的事情怎么样?您展示的用例是完全同步的,不涉及 DOM,因此
useEffect毫无意义。见the docs。 -
@ggorlen 我想它并没有真正回答我的问题,我知道普通类风格和新钩子风格之间的区别。但我不知何故明白你的意思,如果我需要异步的东西,那么我应该使用
useEffect,这是你的重点吗? -
不,但这是其中很大一部分,因为在功能组件返回用于渲染的 JSX 之前,任何异步操作都无法运行。对
useEffect的回调不会与函数体同时运行,这会将其置于钩子之前存在的“生命周期方法”类中。 -
@ggorlen 是的,我认为您的观点是最有说服力的,您能否将其补充为具体答案以便我接受?
-
谢谢,但它对我来说似乎仍然是重复的。还有其他资源可以说明什么是钩子以及我们为什么要在 SO 周围使用它们,我认为这些答案将比我在这里的漫谈更具权威性。现有的答案在这里看起来也不错。
标签: javascript reactjs react-hooks