You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React useEffect报缺少location.state依赖的错误该如何解决?

问题原因

ESLint 的 react-hooks/exhaustive-deps 规则要求 useEffect 内部用到的所有外部变量都必须声明在依赖数组中,你当前的代码在 useEffect 里用到了从 location.state 解构出来的 id 变量,但是没有把它加入依赖数组,因此触发报错。
即使你把解构逻辑移到 useEffect 内部,依然用到了外部的 location 对象,所以还是会触发相同的依赖检查错误。

可行解决方案

方案1:将id加入依赖数组(推荐)

这是最符合 React Hooks 规范的解法,只有当id发生变化时才会重新触发接口请求,避免不必要的重复调用,同时要补充边界判断,避免用户直接访问路由没有携带state的情况导致报错:

const location = useLocation();
// 用可选链避免state为空时报错
const id = location.state?.id;

useEffect(() => {
    // id不存在时直接返回,也可补充跳转逻辑回到列表页
    if (!id) return;

    const link = `http://hn.algolia.com/api/v1/items/${id}`
    const getPost = async () => {
        try {
            const response = await fetch(link);
            const data = await response.json();
            setPost(data);
            setLoading(false);
        } catch (err) {
            // 可补充错误处理逻辑
            setLoading(false);
        }
    }
    getPost();
}, [id]); // 把用到的id加入依赖数组

方案2:显式忽略ESLint检查(仅适合确认id不会变化的场景)

如果你能100%确认当前组件的id在生命周期内绝对不会发生变化,可以通过注释手动关闭当前行的依赖检查,属于兜底方案不推荐优先使用:

const location = useLocation();
const { id } = location.state;

useEffect(() => {
    const link = `http://hn.algolia.com/api/v1/items/${id}`
    const getPost = async () => {
        await fetch(link)
        .then((response) => response.json())
        .then((data) => {
            setPost(data);
            setLoading(false);
        });           
    }
    getPost();
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);

内容的提问来源于stack exchange,提问作者YASH KUMAR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 04:36:02