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

Next.js App Router中无需useParams/useSearchParams传递对象参数

在Next.js App Router中传递对象参数(无需useParams/useSearchParams)

你可以通过路由跳转的state参数来传递完整对象,无需将参数拼到URL里,下面是两种具体实现方式:

方法1:使用Link组件传递

在/home页面的组件中,给Link组件添加state属性,直接传入你的person对象:

import Link from 'next/link';

type Person = {
  name: string;
  age: number;
  address: string;
};

const person: Person = {
  name: "John Doe",
  age: 25,
  address: "123 Main St",
};

export default function Home() {
  return (
    <Link 
      href="/person" 
      state={{ person }} // 直接传入对象
    >
      跳转至用户详情页
    </Link>
  );
}

在/person页面的客户端组件中,通过useRouter获取state里的对象:

'use client';
import { useRouter } from 'next/navigation';

type Person = {
  name: string;
  age: number;
  address: string;
};

export default function Person() {
  const router = useRouter();
  const { person } = router.state || {};

  // 处理直接访问/person页面的情况(此时state为空)
  if (!person) {
    return <div>未获取到用户信息</div>;
  }

  return (
    <div>
      <h2>用户信息</h2>
      <p>姓名:{person.name}</p>
      <p>年龄:{person.age}</p>
      <p>地址:{person.address}</p>
    </div>
  );
}

方法2:使用router.push方法传递

如果需要通过按钮点击等交互触发跳转,可在客户端组件中用router.push的第二个参数传入state:

'use client';
import { useRouter } from 'next/navigation';

type Person = {
  name: string;
  age: number;
  address: string;
};

const person: Person = {
  name: "John Doe",
  age: 25,
  address: "123 Main St",
};

export default function Home() {
  const router = useRouter();

  const handleNavigate = () => {
    router.push('/person', { state: { person } });
  };

  return (
    <button onClick={handleNavigate}>跳转至用户详情页</button>
  );
}

注意事项

  • state中的数据存储在浏览器的history栈中,直接刷新/person页面会丢失state数据,如果需要持久化,得结合localStorage或后端存储实现。
  • 传递的对象必须是可序列化的(不能包含函数、Symbol等无法被JSON序列化的内容),否则会导致跳转失败或数据丢失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 06:35:12