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

如何结合Router实现MUI Dashboard主内容区路由切换(详情页跳转)

实现点击列表行切换至详情组件的方案

1. 完善路由配置

首先在AppProvider的路由配置中,为详情页添加嵌套路由(MUI Dashboard通常用<Outlet />承载主内容区,列表页和详情页需作为布局的子路由):

import { Routes, Route, Outlet } from 'react-router-dom';
import DashboardLayout from './DashboardLayout'; // 你的MUI布局组件
import JobList from './JobList';
import JobDetail from './JobDetail';

function App() {
  return (
    <Routes>
      {/* 外层Dashboard布局,子路由通过Outlet渲染到主内容区 */}
      <Route path="/" element={<DashboardLayout />}>
        <Route path="jobs" element={<JobList />} />
        {/* 带jobId参数的详情页路由 */}
        <Route path="jobs/:jobId" element={<JobDetail />} />
        {/* 其他页面路由... */}
      </Route>
    </Routes>
  );
}

2. 给列表行添加跳转逻辑

在JobList组件中,使用useNavigate钩子实现点击行跳转,给每行绑定点击事件并传递对应ID:

import { useNavigate } from 'react-router-dom';
import { TableRow, TableCell } from '@mui/material';

function JobList() {
  const navigate = useNavigate();
  // 示例数据,实际从接口/状态中获取
  const jobs = [
    { id: '1', title: '前端开发工程师', company: 'XX科技' },
    { id: '2', title: '后端开发工程师', company: 'YY公司' }
  ];

  const handleRowClick = (jobId) => {
    // 跳转到对应详情页,携带jobId参数
    navigate(`/jobs/${jobId}`);
  };

  return (
    <Table>
      {/* 表格表头省略 */}
      <tbody>
        {jobs.map((job) => (
          <TableRow 
            key={job.id} 
            onClick={() => handleRowClick(job.id)}
            sx={{ cursor: 'pointer', '&:hover': { backgroundColor: 'rgba(0,0,0,0.04)' } }}
          >
            <TableCell>{job.title}</TableCell>
            <TableCell>{job.company}</TableCell>
          </TableRow>
        ))}
      </tbody>
    </Table>
  );
}

3. 在详情页获取参数并加载数据

在JobDetail组件中,用useParams钩子获取路由参数,再根据ID加载对应详情数据:

import { useParams } from 'react-router-dom';
import { useEffect, useState } from 'react';
import { Typography, Box } from '@mui/material';

function JobDetail() {
  const { jobId } = useParams();
  const [jobDetail, setJobDetail] = useState(null);

  useEffect(() => {
    const fetchJobDetail = async () => {
      // 替换为实际接口请求
      const res = await fetch(`/api/jobs/${jobId}`);
      const data = await res.json();
      setJobDetail(data);
    };

    jobId && fetchJobDetail();
  }, [jobId]);

  if (!jobDetail) {
    return <Typography>加载中...</Typography>;
  }

  return (
    <Box>
      <Typography variant="h4">{jobDetail.title}</Typography>
      <Typography variant="subtitle1">公司:{jobDetail.company}</Typography>
      <Typography variant="body1" mt={2}>
        {jobDetail.description}
      </Typography>
      {/* 其他详情内容 */}
    </Box>
  );
}

关键注意点

  • 确保DashboardLayout组件中包含<Outlet />,子路由内容才会渲染到主内容区。
  • 若你的路由结构并非嵌套,直接在顶层路由中添加详情页路由即可,跳转逻辑保持不变。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 17:42:37