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

Next.js 13动态路由下如何传递选中数据至详情页?

Next.js 13 动态路由跳转传递数据解决方案

你的问题核心在于两点:Next.js 13(尤其是App Router)不再兼容next/router,且直接将对象传入query会被转成无效字符串。以下是几种可行的解决方法:

方案一:通过ID在详情页重新获取数据(推荐)

这是Next.js推荐的做法,既符合服务端渲染的性能与SEO要求,也避免了URL传参的限制与安全问题。

首页修改Link:

只传递house.id到动态路由,无需额外传对象:

{house.images.map((img, index) => {
  return (
    <Link
      href={`/living/${house.id}`}
      key={index}
    >
      <div className="w-full relative -z-10 pt-[100%] cursor-pointer">
        <Image
          src={img}
          alt="profile"
          fill
          className="w-full h-full top-0 left-0 -z-10 object-cover rounded-2xl ease-in-out duration-200"
        />
      </div>
    </Link>
  );
})}

详情页实现(以App Router为例,app/living/[homeid]/page.js):

在服务端组件中直接通过params获取ID,复用首页的数据获取逻辑拿到完整的house信息:

// 服务端组件,无需标记'use client'
async function DetailPage({ params }) {
  const { homeid } = params;
  // 替换为你实际的根据ID获取数据的函数
  const house = await fetchHouseById(homeid);

  if (!house) {
    return <div>未找到对应房源</div>;
  }

  return (
    <div>
      {/* 渲染house详情内容 */}
      <h1>{house.title}</h1>
      {/* ...其他详情字段 */}
    </div>
  );
}

export default DetailPage;

方案二:序列化对象到URL参数(适合小型非敏感数据)

如果不想重新请求数据,可以将house对象序列化为JSON字符串传递,再在详情页反序列化。注意:URL长度有限制,且数据会暴露在地址栏,不适合大数据或敏感信息。

首页修改Link:

将house序列化为JSON字符串传入query:

{house.images.map((img, index) => {
  return (
    <Link
      href={{
        pathname: `/living/${house.id}`,
        query: { house: JSON.stringify(house) },
      }}
      key={index}
    >
      <div className="w-full relative -z-10 pt-[100%] cursor-pointer">
        <Image
          src={img}
          alt="profile"
          fill
          className="w-full h-full top-0 left-0 -z-10 object-cover rounded-2xl ease-in-out duration-200"
        />
      </div>
    </Link>
  );
})}

详情页实现:

使用next/navigation的useSearchParams获取参数并反序列化,需标记为客户端组件:

'use client';

import { useSearchParams } from 'next/navigation';

function DetailPage({ params }) {
  const searchParams = useSearchParams();
  const houseStr = searchParams.get('house');
  const house = houseStr ? JSON.parse(houseStr) : null;

  if (!house) {
    return <div>数据加载失败</div>;
  }

  return (
    <div>
      {/* 渲染house详情 */}
    </div>
  );
}

export default DetailPage;

方案三:React Context/状态管理(适合纯客户端场景)

如果是纯客户端跳转且不想暴露数据,可以用React Context或 Zustand/Jotai 等状态管理工具存储选中的house,跳转后从状态中读取。但页面刷新后数据会丢失,因此仅适合临时数据传递。

内容的提问来源于stack exchange,提问作者Mohammed Bekele

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 21:12:04