reactjs - 如何将缺少的依赖项添加到仅运行一次的 useEffect 挂钩?
问题描述
React Hook useEffect 缺少依赖项:'myDate' 和 'setMyDate'。要么包含它们,要么删除依赖数组。
如何将缺少的依赖项添加到useEffect
仅运行一次的依赖项中?以下示例生成上述警告:
const [ myDate, setMyDate ] = useState(0)
const spinner = useRef(null)
useEffect( () => {
spinner.current = setInterval( () => {
d = Date.now()
if (d < myDate)
setUpdate(d)
}, 997 )
}, [])
如果我包含它们,我会创建一个无限循环,因为setTimeout
依赖项的值会发生变化:
const spinner = useRef(null)
useEffect( () => {
spinner.current = setInterval( () => {
d = Date.now()
if (d < myDate)
setMyDate(d)
}, 997 )
}, [myDate, setMyDate])
如果我删除依赖数组,则useEffect
在每个渲染上运行,并设置无限数量的 setInterval:
const spinner = useRef(null)
useEffect( () => {
spinner.current = setInterval( () => {
d = Date.now()
if (d < myDate)
setMyDate(d)
}, 997 )
})
我也尝试useEffect
完全删除,认为既然spinner
是 a useRef
,它不会在每个组件渲染上重新分配......但没有:
const spinner = useRef(null)
spinner.current = setInterval( () => {
d = Date.now()
if (d < myDate)
setMyDate(d)
}
还尝试使用功能更新方法,像这样,但 lint 错误仍然存在并且代码不起作用:
const spinner = useRef(null)
useEffect( () => {
spinner.current = setInterval( () => {
d = Date.now()
setMyDate(d => {
if (d < myDate)
setMyDate(d)
}
}, 997 )
}, [setMyDate])
我被卡住了……夹在岩石和坚硬的地方之间!如何解决此 lint 警告?
解决方案
似乎对我有用的是将间隔的逻辑分成一个useCallback()
没有依赖关系的钩子。这会记住该函数并确保该函数仅在初始组件渲染上构建。
然后,在效果内部调用您构建的函数useCallback()
,并将其提供给效果依赖项数组。然后只有当useCallback()
函数发生变化时效果才会重建——它不会因为它没有依赖关系而重建。
应该从react-hooks
import React, {useState, useEffect, useRef, useCallback} from 'react'
export default function IntervalHook() {
const [ myDate, setMyDate ] = useState(0)
const spinner = useRef(0)
const spinnerFn = useCallback(() => {
spinner.current = setInterval(() => {
const d = Date.now()
setMyDate(d)
}, 997 )
}, [])
useEffect(() => {
spinnerFn()
return () => { // this return statement clears the interval when the component unmounts
if (spinner.current) {
clearInterval(spinner.current)
spinner.current = 0
}
}
}, [spinnerFn])
return (
<span>{myDate}</span>
)
}
推荐阅读
- c# - 如何显示列表视图行的所有内容
- python - 无法模拟具有超级方法的类
- javascript - 如何使用数组包含并根据对象的属性检查对象
- python - 如何使用 selenium、chrome 驱动程序和 python 关闭新构建的选项卡
- r - 如何根据两列删除所有重复行?
- javascript - WordPress:未捕获的类型错误:$ 不是函数
- php - 如何处理我想插入到我的 dB 的大数据?
- python - Python:将表转换为字符串到键:值对并使用理解存储在嵌套字典中
- c# - 如何在片段类中访问 MainActivity 类的公共成员(变量或方法)
- eclipse - 运行更新时出错,MD5 哈希值不符合预期