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

如何在Material UI仪表板布局中通过Select组件实现页面导航?

问题解决思路与方案

核心问题分析

你的问题本质是Next.js App Router 与 react-router-dom 的路由机制冲突,加上子页面的文件结构不符合App Router的规则,导致Select导航失效:

  1. Next.js App Router 自带路由系统,无需手动添加BrowserRouter,重复添加会引发路由上下文冲突,这也是编译器提示"只能有一个路由"的原因。
  2. 你使用的useNavigate是react-router-dom的API,在App Router环境下无法正常工作,需要替换为Next.js官方的路由钩子。
  3. 子页面的文件命名不符合App Router的要求,无法被识别为有效路由。

具体解决步骤

1. 移除主布局中的BrowserRouter

打开app/(dashboard)/layout.tsx,删除所有BrowserRouter相关代码(包括导入和包裹标签)。App Router会自动处理路由上下文,不需要额外引入react-router-dom的路由容器。

2. 替换路由钩子为Next.js官方API

在app/(dashboard)/diet/page.tsx中,用Next.js的useRouter替代react-router-dom的useNavigate:

'use client'; // 必须声明为客户端组件,因为使用了路由钩子
import { useState } from 'react';
import { Select, MenuItem, FormControl, InputLabel } from '@mui/material';
import { useRouter } from 'next/navigation';

export default function DietPage() {
  const [selectedPage, setSelectedPage] = useState('');
  const router = useRouter();

  const handlePageChange = (e: any) => {
    const targetPath = e.target.value;
    setSelectedPage(targetPath);
    // 用相对路径导航到子页面
    router.push(`./${targetPath}`);
  };

  return (
    <FormControl sx={{ minWidth: 200 }}>
      <InputLabel>选择子页面</InputLabel>
      <Select
        value={selectedPage}
        label="选择子页面"
        onChange={handlePageChange}
      >
        <MenuItem value="meals">饮食记录</MenuItem>
        <MenuItem value="calendar">饮食日历</MenuItem>
      </Select>
    </FormControl>
  );
}

3. 调整子页面的文件结构

Next.js App Router要求子页面必须以page.tsx命名,且放在对应路由文件夹下:

  • 将现有的app/(dashboard)/diet/meals.tsx重命名并移动为app/(dashboard)/diet/meals/page.tsx
  • 同理,将calendar页面改为app/(dashboard)/diet/calendar/page.tsx

这样Next.js才能自动识别这些子路由,无需手动配置Routes。


验证效果

完成上述修改后,点击Select选项时,页面会正确导航到/dashboard/diet/meals或/dashboard/diet/calendar,且不会影响原侧边栏的导航功能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 20:02:36