我总觉得这在React中有点奇怪,据说不将所有依赖项添加到useEffect
钩子是一种反模式,并且在控制台上显示警告。
看这个例子。我使用的是swr
和useSWRInfinite
-请参阅此处的示例和此处的文档。
我的代码检查一个元素是inView
,如果是,它获取下一页的数据。
一切正常
useEffect(() => {
if (inView) {
setSize(size + 1)
}
}, [inView, setSize])
但是如果我将size
添加到依赖数组中,当我在useEffect
size
时,会发生无限循环useEffect(() => {
if (inView) {
setSize(size + 1)
}
}, [inView, setSize, size]) <------ everything breaks
谁能告诉我处理这个问题的正确方法?在阅读了许多SO的答案和博客文章之后,没有什么更清楚了。
您已经在依赖数组中添加了size
。因此,只要size
发生变化,useEffect
就会运行。现在,在useEffect
中,您正在使用setSize
setter对size
进行递增。这将再次导致size
更改并再次运行useEffect
。
如果要引用以前的size
,可以使用回调版本的setSize
。
setSize((previousSize) => previousSize + 1)
这样,当你没有在依赖数组中添加size
时,你的linter不会抱怨,因为现在你没有使用它。
你不应该在setSize中使用size状态。你可以把它改成setSize(size => size + 1)
然后从依赖项数组中删除大小。可以在这里阅读更多:在这里输入链接描述