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

Next.js 14中如何通过Link组件实现属性透传?

解决Next.js Link组件传递数据到目标页面的问题

首先在DropDownModal中定义好需要传递的状态,比如用户信息:

import { useState } from 'react';

export function DropDownModal() {
  // 提升的状态示例
  const [user, setUser] = useState({ id: 123, name: 'Lee Williams' });

  return (
    <DropdownMenu>
      <DropdownMenuTrigger>
        <AvatarBlock user={user} /> {/* 传给AvatarBlock没问题 */}
      </DropdownMenuTrigger>
      <DropdownMenuContent>
        <DropdownMenuLabel>My Account</DropdownMenuLabel>
        <DropdownMenuSeparator />
        {/* 后续方案替换这里的Link */}
        <DropdownMenuItem>
        </DropdownMenuItem>
        <DropdownMenuItem>Log out</DropdownMenuItem>
      </DropdownMenuContent>
    </DropdownMenu>
  );
}

接下来根据你使用的Next.js路由方案(App Router 或 Pages Router)选择对应的传参方式:

一、App Router(app目录)

方法1:URL查询参数传递

直接将数据拼接在URL的查询参数中,目标页面通过searchParams读取:

// DropDownModal中的Link写法
<Link href={`/Account?userId=${user.id}&userName=${encodeURIComponent(user.name)}`}>
  Profile Page
</Link>

在app/Account/page.js中获取数据:

export default function Account({ searchParams }) {
  const userId = searchParams.userId;
  // 解码特殊字符
  const userName = searchParams.userName ? decodeURIComponent(searchParams.userName) : '';

  return (
    <div>
      <h1>Profile Page</h1>
      <p>User ID: {userId}</p>
      <p>User Name: {userName}</p>
    </div>
  );
}

方法2:路由状态传递(不暴露在URL中)

如果不想把数据放在URL里,用useRouter的push方法带状态跳转:

// DropDownModal中修改为点击事件触发跳转
import { useRouter } from 'next/navigation';

export function DropDownModal() {
  const [user, setUser] = useState({ id: 123, name: 'Lee Williams' });
  const router = useRouter();

  const navigateToAccount = () => {
    router.push('/Account', { state: { user } });
  };

  return (
    // ...其他部分不变
    <DropdownMenuItem onClick={navigateToAccount}>
      Profile Page
    </DropdownMenuItem>
  );
}

在app/Account/page.js中读取状态(需要标记为客户端组件):

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

export default function Account() {
  const router = useRouter();
  // 从路由状态中获取数据
  const user = router.state?.user;

  if (!user) {
    return <div>Loading user data...</div>;
  }

  return (
    <div>
      <h1>Profile Page</h1>
      <p>User ID: {user.id}</p>
      <p>User Name: {user.name}</p>
    </div>
  );
}

二、Pages Router(pages目录)

方法1:URL查询参数传递

和App Router逻辑类似,通过URL参数传递:

// DropDownModal中的Link写法
<Link href={`/Account?userId=${user.id}&userName=${encodeURIComponent(user.name)}`}>
  Profile Page
</Link>

在pages/Account.js中用useRouter读取:

import { useRouter } from 'next/router';

export default function Account() {
  const router = useRouter();
  const { userId, userName } = router.query;

  return (
    <div>
      <h1>Profile Page</h1>
      <p>User ID: {userId}</p>
      <p>User Name: {userName ? decodeURIComponent(userName) : ''}</p>
    </div>
  );
}

方法2:路由状态传递(不暴露在URL中)

用useRouter的push方法携带状态:

// DropDownModal中修改跳转逻辑
import { useRouter } from 'next/router';

export function DropDownModal() {
  const [user, setUser] = useState({ id: 123, name: 'Lee Williams' });
  const router = useRouter();

  const goToAccount = () => {
    router.push('/Account', undefined, { state: { user } });
  };

  return (
    // ...其他部分不变
    <DropdownMenuItem onClick={goToAccount}>
      Profile Page
    </DropdownMenuItem>
  );
}

在pages/Account.js中读取状态:

import { useRouter } from 'next/router';

export default function Account() {
  const router = useRouter();
  const user = router.state?.user;

  if (!user) {
    return <div>Loading user data...</div>;
  }

  return (
    <div>
      <h1>Profile Page</h1>
      <p>User ID: {user.id}</p>
      <p>User Name: {user.name}</p>
    </div>
  );
}

为什么你之前传参显示null?

直接给Link组件加自定义props(比如<Link href="/Account" user={user}>)是无效的,因为Link只处理和路由相关的属性,不会透传自定义props到目标页面,必须用上述路由支持的传参方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 04:00:16