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

React中useParams()获取路由参数值为undefined的问题

问题根因
  • 最核心问题是路由动态参数名与解构字段名不匹配:路由规则中定义的动态参数为id(配置为path='/posts/:id'),但BlogSingle组件里从useParams()解构的字段是postId。useParams()返回的对象键名和路由path中定义的参数名严格对应,不存在postId字段时解构结果自然为undefined。
  • 存在组件名拼写风险:路由配置中挂载的组件写的是<PostSingle />,但你实际编写的单篇文章组件名为BlogSingle,如果该笔误真实存在,路由根本不会渲染你写的带参数读取逻辑的组件,也会导致参数读取失败。
  • 附带逻辑bug:拉取单篇内容的useEffect依赖数组为空,后续如果在单篇文章页直接跳转其他文章,路由参数变化时不会重新触发接口请求,会出现内容不更新的问题。
修复步骤
  1. 修正路由配置
    打开App.js,确认导入的单篇文章组件名正确,修正路由配置:
// 确保导入的是你写的BlogSingle组件,动态参数保持:id
<Route path='/posts/:id' element={<BlogSingle />} />
  1. 修正BlogSingle组件的参数读取逻辑
    将useParams()的解构字段和路由参数名对齐,同时补全useEffect依赖、增加参数非空判断:
const BlogSingle = () => {
  const [content, setContent] = useState(null);
  // 路由参数是id,解构时重命名为postId即可,也可以直接解构id后续替换变量名
  const { id: postId } = useParams();

  async function fetchPostContent() {
    // 避免参数未就绪时发起无效请求
    if (!postId) return;
    const response = await fetch(`https://khg.com.ng/wp-json/wp/v2/posts/${postId}`);
    const data = await response.json();
    setContent(data);
  }

  useEffect(() => {
    fetchPostContent();
  // 将postId加入依赖数组,参数变化时自动重新拉取内容
  }, [postId]);

  return (
    <div>
      <h1>{postId}</h1>
      {/* 其他内容渲染逻辑 */}
    </div>
  )
}
  1. 链路校验
    你在BlogPosts组件中写的Link跳转逻辑to={/posts/${postId}}本身没有问题,只要确保从父组件传入的postId是有效值即可,无需额外修改。

验证方法:修改完成后跳转至单篇文章页,控制台将打印正确的文章id,接口请求路径也会正确拼接id值,不会出现undefined。


内容的提问来源于stack exchange,提问作者Jay Henry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 10:15:32