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

React中通过Link传递的state在目标页面显示undefined的原因?

问题:React Router通过Link传递state到详情页显示undefined

我通过Link组件从MovieCard组件传递state movie,在首页渲染MovieCard时控制台能正常打印该state,但跳转到详情页后state却显示为undefined。已经检查过路由路径配置,问题仍未解决,希望能将MovieCard中的电影详情传递到独立详情页并展示。

相关代码

MovieCard组件

import React, { useState } from "react";
import { Link } from "react-router-dom";

const MovieCard = ({ poster, movie, id }) => {
  console.log("Movie card detailsssssss", movie);

  return (
    <div className="sm:w-[300px] sm:h-[300px] w-[100%] h-[300px] ">
      <Link
        to={{ pathname: `/detail/${id}`, state: { movie } }}
        target="_blank"
        rel="noopener noreferrer"
      >
        <img
          src={poster}
          className="w-full h-full object-cover rounded-md cursor-pointer hover:scale-105 transition-transform duration-300"
        />
      </Link>
    </div>
  );
};

export default MovieCard;

Detail组件

import React from "react";
import { useParams, useLocation } from "react-router-dom";

const Detail = () => {
  const { id } = useParams();
  const { state } = useLocation();

  const detail = state?.movie;
  console.log("Details", detail);

  return (
    <div>
      <h1>Details page</h1>
      <p>Movie id : {id}</p>
      {detail ? <p>Movie detail: {detail.title}</p> : <p>Loading...</p>}
      <button onClick={() => window.history.back()}>Back</button>
    </div>
  );
};

export default Detail;

问题原因

你给Link组件加了target="_blank",这会在新标签页打开详情页。而React Router的state是存在当前页面的history栈里的,新标签页会生成一个全新的history上下文,根本拿不到原页面的state数据,所以详情页里的state自然是undefined。

解决方案

方案1:移除新标签页跳转(最简单)

如果不需要在新标签页打开详情页,直接删掉Link的target="_blank"和rel="noopener noreferrer"属性就行:

// 修改MovieCard里的Link
<Link to={{ pathname: `/detail/${id}`, state: { movie } }}>
  <img
    src={poster}
    className="w-full h-full object-cover rounded-md cursor-pointer hover:scale-105 transition-transform duration-300"
  />
</Link>

方案2:通过URL参数传递数据(必须开新标签页时用)

如果一定要在新标签页打开,就别依赖state传数据了,把需要的信息(比如电影id、标题)拼到URL的查询参数里,详情页再解析这些参数:

修改MovieCard的Link

<Link
  to={`/detail/${id}?title=${encodeURIComponent(movie.title)}`}
  target="_blank"
  rel="noopener noreferrer"
>
  <img
    src={poster}
    className="w-full h-full object-cover rounded-md cursor-pointer hover:scale-105 transition-transform duration-300"
  />
</Link>

修改Detail组件获取参数

import React from "react";
import { useParams, useSearchParams } from "react-router-dom";

const Detail = () => {
  const { id } = useParams();
  const [searchParams] = useSearchParams();
  const title = searchParams.get("title");

  // 如果需要完整电影数据,这里用id调用接口获取就行
  console.log("Movie id:", id, "Movie title:", title);

  return (
    <div>
      <h1>Details page</h1>
      <p>Movie id : {id}</p>
      {title ? <p>Movie detail: {title}</p> : <p>Loading...</p>}
      <button onClick={() => window.history.back()}>Back</button>
    </div>
  );
};

export default Detail;

方案3:用全局状态管理(适合多组件共享数据)

如果你的电影数据需要在多个组件里用,也可以把数据存在全局状态(比如React Context、Redux)里,详情页直接通过id从全局状态里取对应的数据,这种方式不管怎么跳转都能拿到数据。


内容的提问来源于stack exchange,提问作者Anzana Poudel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 00:26:22