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

MERN栈中页面间项目数据传递的技术方案咨询

解决方案:通过路由参数传递项目ID(推荐)

这是React项目中实现页面间动态数据传递最常规、高效的方式,无需全局状态或静态页面,具体实现步骤如下:

1. 配置带动态参数的路由

在路由配置文件(如App.js或routes.js)中,添加包含项目ID参数的路由,指向工单展示页面:

import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import Dashboard from './pages/Dashboard';
import ProjectTickets from './pages/ProjectTickets';

function App() {
  return (
    <Router>
      <Routes>
        <Route path="/dashboard" element={<Dashboard />} />
        {/* :projectId 为动态路由参数,用于接收项目ID */}
        <Route path="/project/:projectId/tickets" element={<ProjectTickets />} />
      </Routes>
    </Router>
  );
}

2. 仪表盘页面添加跳转逻辑

在仪表盘的map()循环中,通过Link组件或useNavigate钩子生成带项目ID的跳转路径:

方式一:用Link组件实现跳转

import { Link } from 'react-router-dom';

function Dashboard() {
  const projects = [/* 从数据库获取的项目数组 */];

  return (
    <div>
      {projects.map(project => (
        <div key={project._id}>
          <h3>{project.name}</h3>
          <Link to={`/project/${project._id}/tickets`}>打开项目</Link>
        </div>
      ))}
    </div>
  );
}

方式二:用按钮触发跳转(useNavigate钩子)

import { useNavigate } from 'react-router-dom';

function Dashboard() {
  const navigate = useNavigate();
  const projects = [/* 从数据库获取的项目数组 */];

  const openProject = (projectId) => {
    navigate(`/project/${projectId}/tickets`);
  };

  return (
    <div>
      {projects.map(project => (
        <div key={project._id}>
          <h3>{project.name}</h3>
          <button onClick={() => openProject(project._id)}>打开项目</button>
        </div>
      ))}
    </div>
  );
}

3. 工单页面获取ID并请求数据

在ProjectTickets页面中,通过useParams钩子提取路由中的项目ID,再根据ID请求对应工单:

import { useEffect, useState } from 'react';
import { useParams } from 'react-router-dom';

function ProjectTickets() {
  const { projectId } = useParams();
  const [tickets, setTickets] = useState([]);

  useEffect(() => {
    // 调用后端API,根据projectId获取对应工单
    const fetchTickets = async () => {
      try {
        const res = await fetch(`/api/tickets?projectId=${projectId}`);
        const data = await res.json();
        setTickets(data);
      } catch (err) {
        console.error('获取工单失败:', err);
      }
    };

    fetchTickets();
  }, [projectId]);

  return (
    <div>
      <h2>项目{projectId}的工单列表</h2>
      {tickets.map(ticket => (
        <div key={ticket._id} className="ticket-item">
          <h4>{ticket.title}</h4>
          <p>{ticket.description}</p>
        </div>
      ))}
    </div>
  );
}

4. 后端API处理

在Express后端中,添加接收projectId参数的工单查询接口:

const Ticket = require('../models/Ticket');

app.get('/api/tickets', async (req, res) => {
  try {
    const { projectId } = req.query;
    const tickets = await Ticket.find({ project: projectId });
    res.json(tickets);
  } catch (err) {
    res.status(500).json({ message: '查询工单失败' });
  }
});

对你提出的两个方案的分析
  • React Context方案:属于过度设计,全局状态适合共享跨组件的通用数据(如用户登录状态),单个页面跳转传递ID用路由参数更直接,不存在所谓安全隐患,但完全没必要这么做。
  • 为每个项目创建单独页面:不可行,项目是数据库中的动态数据,无法提前为每个项目写死页面,动态路由参数正是用来解决这类动态内容场景的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 12:15:40