我正在尝试创建一个加载组件,该组件将在React中使用setInterval每1000ms定期向div添加一个句点。我正在尝试使用文档中描述的方法清理setInterval。
https://reactjs.org/docs/hooks-effect.html#example-using-hooks-1
import React, { useEffect, useState } from 'react'
const Loading = () => {
const [loadingStatus, setLoadingStatus] = useState('.')
const [loop, setLoop] = useState()
useEffect(() => {
setLoop(setInterval(() => {
console.log("loading")
setLoadingStatus(loadingStatus + ".")
}, 1000))
return function cleanup() {
console.log('cleaning up')
clearInterval(loop)
}
}, [])
return (<p>
{`Loading ${loadingStatus}`}
</p>)
}
export default Loading
但是,loadingStatus变量仅更新一次,即使组件停止安装后,setInterval循环也不会清除。我必须使用类组件吗?
答案 0 :(得分:2)
依赖关系是我们对React应该何时运行效果的提示,即使我们设置了一个间隔并且没有提供依赖关系[]
,React也不知道我们想再运行一次,因为在空的空间中什么都没有真正改变依赖项[]
。
要获得理想的结果,我们需要考虑何时要运行效果?
我们想在loadingStatus
发生更改时运行它,因此我们需要添加loadingStatus
作为依赖项,因为我们想在loadingStatus
每次更改时都运行效果。
我们有2个选择
添加loadingStatus
作为我们的依赖项。
const Loading = () => {
const [loadingStatus, setLoadingStatus] = useState(".");
const [loop, setLoop] = useState();
useEffect(
() => {
setLoop(
setInterval(() => {
console.log("loading");
setLoadingStatus(loadingStatus + ".");
}, 1000)
);
return function cleanup() {
console.log("cleaning up");
clearInterval(loop);
};
},
[loadingStatus]
);
return <p>{`Loading ${loadingStatus}`}</p>;
};
使我们不知道我们使用了loadingStatus
const Loading = () => {
const [loadingStatus, setLoadingStatus] = useState(".");
useEffect(() => {
const intervalId = setInterval(() => {
setLoadingStatus(ls => ls + ".");
}, 1000);
return () => clearInterval(intervalId);
}, []);
return <p>{`Loading ${loadingStatus}`}</p>;
};
在此处了解更多信息=> a-complete-guide-to-useeffect