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

React页面间如何传递Props?个人项目展示页传参问题求助

问题:React Router页面间Props传递失败

我正在开发个人项目展示网站,用组件实现页面交互。作品页通过<WorkText name={"personal1"} text={"some text goes here"} url={"./public/img1.jpg"}/>组件添加新项目,希望实现动态展示。该组件通过react-router-dom的Link跳转至/work/[name]路径,并传递包含name、text、url的state数据。但在WorkDetail页面中,用useLocation接收state时无法正常获取;用useParams仅能获取路径中的workname参数,需要解决页面间Props传递问题。

相关代码

WorkText组件代码

import React from "react";
import "./WorkText.scss";
import { Link } from "react-router-dom";

const WorkText = ({name, text, url}) => {

   const Data = {
      name,
      text,
      url
    }

  return (
    <p className="work-text-parent">
      <a className="bar">{type}/</a><Link to={{ pathname: "/work/" + name}} state={Data}>{name}</Link>
    </p>
  );
};

export default WorkText;

WorkDetail页面代码

import React from "react";
import { useLocation } from "react-router-dom";
import "./WorkDetail.scss";

const WorkDetail = () => {
  
  const location = useLocation();
  const { type, name, text, url } = location.state;
  console.log(location.state);

  return (
      <div className="work-parent2">
        <h2>{name}</h2>
        <img src={url} alt={name} />
        <p>{text}</p>
      </div>
  );
}

export default WorkDetail;

App.js路由配置

<Route exact path="/work/:workname" element={<> <NavbarExtended /> <WorkDetail /> <Footer /> </>}/>

解决方案

1. 修复WorkText组件的未定义变量问题

组件中{type}是未定义的props,会导致渲染错误,直接移除或替换为合理内容:

// 修改后的WorkText组件返回部分
return (
  <p className="work-text-parent">
    <a className="bar">作品/</a><Link to={{ pathname: `/work/${name}` }} state={Data}>{name}</Link>
  </p>
);

2. 修正WorkDetail的state解构逻辑

location.state中不存在type字段,且刷新页面后state会丢失(仅存在于会话历史中),需要添加默认值避免报错:

// 修改后的WorkDetail组件
const WorkDetail = () => {
  
  const location = useLocation();
  // 添加默认空对象,防止state为undefined时报错
  const { name, text, url } = location.state || {};
  console.log(location.state);

  return (
      <div className="work-parent2">
        <h2>{name || "作品名称"}</h2>
        {url && <img src={url} alt={name || "作品"} />}
        <p>{text || "暂无描述"}</p>
      </div>
  );
}

3. 关于React Router状态传递的注意事项

  • useLocation获取的state仅在通过Link跳转时存在,刷新页面后state会丢失,因为它存储在浏览器会话历史中,而非URL或本地存储。
  • 如果需要持久化数据,建议:
    • 将作品数据存在全局状态(如React Context、Redux),通过workname参数从全局数据中匹配对应内容;
    • 调用后端接口,根据workname参数获取作品详情。
  • useParams用于获取URL路径中的参数(如这里的workname),和state传递是两种不同的参数传递方式,可结合使用:
    import { useParams, useLocation } from "react-router-dom";
    
    const WorkDetail = () => {
      const { workname } = useParams();
      const location = useLocation();
      // 可根据workname验证state中的name是否匹配,防止非法跳转
    }
    

内容的提问来源于stack exchange,提问作者Marc López Soler

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 21:22:54