我目前正在开发一个带有管理仪表板的Reaction应用程序,该仪表板有不同的"标签",我将它们集成到一个路由中.管理员登录后,应用程序会导航到/admin.这个页面的 idea 是,我有一个带有不同页面的侧菜单.在AdminView中,我想根据我提供的id显示特定的组件:

以下是显示管理视图的主路由

<Route path="/admin">
   <Route path="login" element={<AdminLogin />} />
   <Route path=":page" element={<AdminView />} />
</Route>

在Admin视图中,我有这样的东西:

我正在 Select 要显示的组件,该组件基于:page:

  const getTable = () => {
    switch (table) {
      case 'realms':
        return RealmsTable;
      case 'clients':
        return ClientsTable;
      case 'users':
        return UsersTable;
      case 'roles':
        return RolesTable;
      case 'management':
        return Management;
      default:
        return NotFoundtView;
    }
  };

  const Table = useMemo(getTable, [table]);

Select 该组件后,我将按如下方式显示它:

    <Layout className="dashboard-layout" hasSider>
      <DSider />
      <Layout>
        <DHeader />
        <Content>
          <Suspense>
            <Routes>
              <Route index Component={Table} />
            </Routes>
          </Suspense>
        </Content>
      </Layout>
    </Layout>

这是我想做的,但我觉得我做错了.有没有更干净的方法?

作为参考:

我用的是react 18react-router-dom v6

更多信息:

我提到了一个与所选表同步的sider:

const { table } = useParams();
return (
    <Sider>
      <Menu
        className="no-bg"
        items={items}
        onClick={onMenuSelect}
        mode="inline"
        defaultSelectedKeys={[table!]}
        inlineCollapsed={collapsed}
        theme="dark"
      ></Menu>
    </Sider>
  );

这是一个基本的antd Menu组件,我使用id作为菜单项的键:

const items: MenuItem[] = [
  {
    type: 'divider',
    className: 'menu-devider'
  },
  {
    key: 'realms',
    label: 'Realms',
    className: 'menu-item',
    icon: <ReactSVG src="/svg/realms.svg" />
  },
  {
    type: 'divider',
    className: 'menu-devider'
  },
  {
    key: 'clients',
    label: 'Clients',
    className: 'menu-item',
    icon: <ReactSVG src="/svg/clients.svg" />
  },
  {
    type: 'divider',
    className: 'menu-devider'
  },
  {
    key: 'users',
    label: 'Users',
    className: 'menu-item',
    icon: <ReactSVG src="/svg/users.svg" />
  },
  {
    type: 'divider',
    className: 'menu-devider'
  },
  {
    key: 'roles',
    label: 'Roles',
    className: 'menu-item',
    icon: <ReactSVG src="/svg/roles.svg" />
  },
  {
    type: 'divider',
    className: 'menu-devider'
  },
  {
    key: 'management',
    label: 'Management',
    className: 'menu-item',
    icon: <ReactSVG src="/svg/management.svg" />
  },
  {
    type: 'divider',
    className: 'menu-devider'
  }
];

推荐答案

我的建议是使AdminView成为布局布线组件,该组件呈现Outlet组件而不是索引布线,并且每个表格组件在其自己的嵌套布线上.这将消除对getTable组件匹配器和组件引用备忘录的需要.换句话说,让Reaction-Router为您做匹配/渲染工作,而不需要重新发明轮子.

示例:

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

...

<Layout className="dashboard-layout" hasSider>
  <DSider />
  <Layout>
    <DHeader />
    <Content>
      <Suspense>
        <Outlet /> // <-- nested routes render content here
      </Suspense>
    </Content>
  </Layout>
</Layout>
<Route path="/admin">
  <Route path="login" element={<AdminLogin />} />
  <Route element={<AdminView />}>
    <Route path="realms" element={<RealmsTable />} />
    <Route path="clients" element={<ClientsTable />} />
    <Route path="users" element={<UsersTable />} />
    <Route path="roles" element={<RolesTable />} />
    <Route path="management" element={<RealmsTable />} />
  </Route>
  <Route path="*" element={<NotFoundtView />} />
</Route>

Reactjs相关问答推荐

如何将google地址lat收件箱设置为输入值?

如何在重新图表中更改悬停时的条形填充 colored颜色 ?

将对象添加到集合中的数组时的no_id字段

react -无法获取函数的最新参数值

Chart.js如何go 除边框

生产部署:控制台中 Firebase 无效 api 密钥错误

尽管所有页面在 Reactjs 中都是公开的,但始终导航到特定页面

通过createRoot创建的React元素无法调用Provider值

console.logs 没有显示在浏览器控制台上,但显示在我的终端上

在 reactJS 中导航时页面重新加载

Material UI v5.11 - Prop sx 在响应式中写了两次

如何在 ChartJS 中操作 Y 轴

React JS:如何判断用户使用的是浏览器 url 还是桌面 electron

如何将我的 ID 值传递给下一个组件?

react-markdown 不渲染 Markdown

使用 React 中的功能组件更改另一个组件的状态

组件焦点上的 MUI 更改栏 colored颜色

将鼠标悬停在仅适用于该类的第一个实例的 p5.js 类上

npm init vite@latest 和 npm init vite 有什么区别?

调用函数以获取数据并在数据到达时导航到链接