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

Next.js中如何通过router.push传递userId并在目标组件中使用

实现方案

分两种Next.js路由模式给出具体实现:

一、Pages Router(pages目录结构)

1. PostCard组件跳转逻辑(保持现有写法即可)

import { useRouter } from 'next/router';

const PostCard = (props) => {
  const router = useRouter();

  const handleJumpToUser = () => {
    // 直接跳转到动态路由页面,路径里的_id就是要传递的userId
    router.push(`/user/${props.user._id}`);
  };

  return <div onClick={handleJumpToUser}>查看用户主页</div>;
};

export default PostCard;

2. 目标页面(pages/user/[userId].js)修改数据获取逻辑

原本从localStorage取userId,现在优先使用路由参数里的userId,没有的话再 fallback 到localStorage:

import { useRouter } from 'next/router';
import { useEffect, useState } from 'react';

const UserPage = () => {
  const router = useRouter();
  const { userId } = router.query; // 从动态路由获取传递的userId
  const [userData, setUserData] = useState(null);

  useEffect(() => {
    // 确定要使用的userId:路由参数存在则用它,否则取localStorage的
    const targetUserId = userId || localStorage.getItem('userId');
    
    if (targetUserId) {
      // 调用接口获取用户数据
      fetch(`/api/users/${targetUserId}`)
        .then(res => res.json())
        .then(data => setUserData(data));
    }
  }, [userId]); // 监听userId变化,路由参数更新时重新请求数据

  if (!userData) return <div>加载中...</div>;

  return <div>用户名:{userData.name}</div>;
};

export default UserPage;

二、App Router(app目录结构)

1. PostCard组件跳转逻辑

import { useRouter } from 'next/navigation';

const PostCard = (props) => {
  const router = useRouter();

  const handleJumpToUser = () => {
    router.push(`/user/${props.user._id}`);
  };

  return <div onClick={handleJumpToUser}>查看用户主页</div>;
};

export default PostCard;

2. 目标页面(app/user/[userId]/page.js)修改数据获取逻辑

在App Router中,动态路由参数通过页面组件的params属性获取:

'use client'; // 如果需要在客户端执行逻辑,加上这行
import { useEffect, useState } from 'react';

// 从params中获取动态路由的userId
const UserPage = ({ params }) => {
  const { userId } = params;
  const [userData, setUserData] = useState(null);

  useEffect(() => {
    const targetUserId = userId || localStorage.getItem('userId');
    
    if (targetUserId) {
      fetch(`/api/users/${targetUserId}`)
        .then(res => res.json())
        .then(data => setUserData(data));
    }
  }, [userId]);

  if (!userData) return <div>加载中...</div>;

  return <div>用户名:{userData.name}</div>;
};

export default UserPage;

关键逻辑说明

  • 跳转时直接通过动态路由路径传递userId,比查询参数(?userId=xxx)更符合RESTful规范,也更直观。
  • 目标页面优先使用路由参数中的userId,确保从PostCard跳转过来时能覆盖localStorage的默认值;如果是用户直接访问个人主页(比如从导航栏进入),则 fallback 到localStorage的登录用户ID,兼容原有逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 12:15:12