useEffect 中的 Eslint 详尽 deps 警告
Eslint exhaustive deps warning in useEffect
在下面组件的 useEffect
中,我遇到 ESLint exhaustive-deps 警告:
ESlint 告诉我我需要将 selectedJar
作为依赖项包含在内,但是当我这样做时图表加载很快,然后它们都消失了。
我可以继续我的开发,因为一切正常,但我认为,根据来自 ESlint 的消息,我做错了什么。
任何人都可以告诉我这段代码的实际外观吗?
const Stats: Page = () => {
const [selectedJar, setSelectedJar] = useState("example");
const [jarData, setJarData] = useState<JarChartData>({} as JarChartData);
const router = useRouter();
const jar: string = typeof(router.query.jar) === "string" ? router.query.jar : "";
useEffect(() => {
const getData = async (): Promise<void> => {
setSelectedJar(jar);
const jarData: JarChartData = await getJarData(selectedJar);
setJarData(jarData);
}
getData();
}, [jar]);
return (
<>
something dope
</>
)
你这里有一个潜在的错误,因为你在同一个调用中同时调用了 setSelectedJar
然后使用了 selectedJar
。这不太可能做你想做的事; selectedJar
不能保证在下一次渲染之前具有更新值。
阅读你的逻辑,看起来你希望你获取的值始终来自路由器,但如果路由器中没有值,则默认为 "example"
;如果是这种情况,就不需要 useState
。只要 router
中的值发生变化,您就可以获取 jar 数据,默认为“example”:
const router = useRouter();
const [jarData, setJarData] = useState<JarChartData>({} as JarChartData);
const jar: string = typeof(router.query.jar) === "string" ? router.query.jar : "example";
useEffect(() => {
getJarData(jar).then(data => setJarData(data));
}, [jar, setJarData]);
在下面组件的 useEffect
中,我遇到 ESLint exhaustive-deps 警告:
ESlint 告诉我我需要将 selectedJar
作为依赖项包含在内,但是当我这样做时图表加载很快,然后它们都消失了。
我可以继续我的开发,因为一切正常,但我认为,根据来自 ESlint 的消息,我做错了什么。
任何人都可以告诉我这段代码的实际外观吗?
const Stats: Page = () => {
const [selectedJar, setSelectedJar] = useState("example");
const [jarData, setJarData] = useState<JarChartData>({} as JarChartData);
const router = useRouter();
const jar: string = typeof(router.query.jar) === "string" ? router.query.jar : "";
useEffect(() => {
const getData = async (): Promise<void> => {
setSelectedJar(jar);
const jarData: JarChartData = await getJarData(selectedJar);
setJarData(jarData);
}
getData();
}, [jar]);
return (
<>
something dope
</>
)
你这里有一个潜在的错误,因为你在同一个调用中同时调用了 setSelectedJar
然后使用了 selectedJar
。这不太可能做你想做的事; selectedJar
不能保证在下一次渲染之前具有更新值。
阅读你的逻辑,看起来你希望你获取的值始终来自路由器,但如果路由器中没有值,则默认为 "example"
;如果是这种情况,就不需要 useState
。只要 router
中的值发生变化,您就可以获取 jar 数据,默认为“example”:
const router = useRouter();
const [jarData, setJarData] = useState<JarChartData>({} as JarChartData);
const jar: string = typeof(router.query.jar) === "string" ? router.query.jar : "example";
useEffect(() => {
getJarData(jar).then(data => setJarData(data));
}, [jar, setJarData]);