【发布时间】:2021-03-03 07:40:19
【问题描述】:
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 在每次渲染上运行,并设置无限数量的 setIntervals:
const spinner = useRef(null)
useEffect( () => {
spinner.current = setInterval( () => {
d = Date.now()
if (d < myDate)
setMyDate(d)
}, 997 )
})
我还尝试完全删除useEffect,认为由于spinner 是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 警告?
【问题讨论】:
-
我不知道它是否会起作用,因为有时我有奇怪的无限循环,因为方法没有改变。您可以做的是创建一个设置间隔的方法,并通过将其分配为依赖项来在使用效果中调用此方法。通常它会起作用,因为就像我说的那样,方法不会改变。
-
你想做什么?
-
@Galupuf 创建一次
setInterval,每n秒调用一次钩子更新。
标签: reactjs dependencies react-hooks use-effect use-ref