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

React嵌套路由携带id参数时使用自定义useFetch Hook获取数据无法展示求助

问题修复方案

核心问题说明

  • useFetch 自定义Hook的返回值是数组格式,但你在Product组件中使用了对象解构的方式取值,导致永远无法正确拿到请求返回的data和error
  • 你调用的http://localhost:8080/products/category/{id}接口返回的是指定分类下的所有产品数组,不是单个产品对象,你直接访问数组的name属性自然不存在,这就是报错提示你"应该将数据放到数组中"的原因
  • useFetch的catch回调中错误地将error设置为null,导致请求出错时无法正常展示错误信息

修改后的代码

useFetch.js

import { useState, useEffect } from "react";

const useFetch = (url) => {
    const [data, setData] = useState(null)
    const [error, setError ] = useState(null)

    useEffect(() => {
        setTimeout(() => {
            fetch(url)
            .then(res => {
                if(!res.ok) {
                    throw Error('could not fetch data');
                }
                return res.json();
            })
            .then(data =>  {
                setData(data);
                setError(null); // 请求成功清空错误
            })
            .catch(err => {
                setError(err.message) // 出错时存储错误信息
            })
        }, 1000);
    }, [url]);

    return [data, error]
}

export default useFetch;

Product.js

import React from "react";
import "../Style/menu.css";
import { useParams } from "react-router-dom";
import useFetch from "../ApiService/useFetch";
import ProductList from "../Components/ProductList";

const Product = () => {
    const { id } = useParams();
    // 改为数组解构匹配useFetch的返回格式
    const [productList, error] = useFetch('http://localhost:8080/products/category/' + id);

    return (
        <div>
            {error && <div>{ error } </div>}
            {productList && (
                <>
                    <h1>当前分类产品列表</h1>
                    {/* 直接使用你引入的ProductList组件传递产品数组即可,也可以自己用map遍历渲染 */}
                    <ProductList products={productList} />
                    {/* 如果你要自己渲染可以用下方写法
                    <ul>
                        {productList.map(product => (
                            <li key={product.id}>{product.name}</li>
                        ))}
                    </ul>
                    */}
                </>
            )}
        </div>
    )
}

export default Product;

内容的提问来源于stack exchange,提问作者Sem de Wilde

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 09:48:04