在侧菜单的路线中反应路线

Posted

技术标签:

【中文标题】在侧菜单的路线中反应路线【英文标题】:React Routes within Routes for Side Menu 【发布时间】:2022-01-23 03:56:12 【问题描述】:

我有两种类型的路由,一种是网站/应用级别,一种是 SideMenu 级别,这是一种嵌套路由。 我的问题是通过单击 SideMenu 的菜单项来更改内容。不知何故,我无法正确完成这项工作。 重要的一点,我使用 react-router-dom v6

在我的应用中,我有以下内容:

function App(props) 
    return (
        <BrowserRouter>
            <Routes>
                <Route exact path="/" element=<MainApp ...props />></Route>
                <Route path="/signin" element=<SignIn />></Route>
                <Route path="/register" element=<SignUp />></Route>
                <Route path="*" element=<PageNotFound />></Route>
            </Routes>
        </BrowserRouter>
    );

在 MainApp 我有以下内容:

export default function MainApp(props) 
    const  classes  = props;

    return (
        <div className=classes.root>
            <AppBar classes=classes />
            <SideMenu classes=classes />
            <main className=classes.appContent>
                <Routes>
                    <Route path="dashboard" render=() => <Dashboard /> />
                    <Route path="checkout" render=() => <Checkout /> />
                    <Route path="users" render=() => <Users /> />
                </Routes>
            </main>
        </div>
    );

我的 SideMenu 如下所示:

const SideMenu = ( classes ) => 
    return (
        <Drawer
            variant="permanent"
            className=classes.drawer
            classes= paper: classes.drawerPaper 
        >
            <NavItems />
        </Drawer>
    );
;

最后是 ListItems,它们是 SideMenu 的菜单项:

function NavItems(props) 
    return (
        <div>
            <List>
                MenuItemsData.map((item) => 
                    return (
                        <ListItem
                            button
                            key=item.id
                            to=item.url
                            component=Navigate
                        >
                            <ListItemIcon>item.icon()</ListItemIcon>
                            <ListItemText primary=item.title />
                        </ListItem>
                    );
                )
            </List>
        </div>
    );

我确实通过将句柄单击传递给列表项来使用道具钻取它。但我更喜欢路由器,因为它更简洁、更易于理解。

所以我的问题是,如何在路由器中使用 SideMenu 和路由器来导航内容?

【问题讨论】:

你不能把路由器放在其他路由器里面。 MainApp 中的所有 Route 组件都错误地使用了 RRDv6 中不存在的 render 属性。另外,ListItemcomponent 属性不应该是 LinkNavLink 而不是 Navigate 组件吗?我不明白这怎么可能奏效。 如果嵌套路由器不可行,如何使用 SideMenu 更改 main 中的内容,而不将 handleClick-callback 传递给 props 并将其向下钻取到 ListItem(SideMenu 的)?我以为 Link 来自 RRD v5,所以我使用了 v6 的 Navigate。我对 RRD 和 MUI 的抽屉有点陌生。 你将什么回调道具传递给任何东西? LinkNavLink 在 RRDv6 中仍然可用。 Navigate 有效地替换了 v5 中的 Redirect 组件。 我将 handleClick 函数传递给 ListItem 以执行内容更改,但后来想用 Routers 替换此模式,因为它更简洁,更易于其他开发人员理解。我解决了问题,请参阅我自己的答案。 【参考方案1】:

感谢这篇博文,我找到了解决方案:https://www.codingdeft.com/posts/react-router-tutorial/

在我的应用程序功能中,我将根“/”替换为:

<Route path="main/*" element=<MainApp ...props />></Route>

在 MainApp 中,我将嵌套路由(允许)修改为:

<Routes>
    <Route path="dashboard" element=<Dashboard />></Route>
    <Route path="checkout" element=<Checkout />></Route>
    <Route path="users" element=<Users />></Route>
</Routes>

感谢 Drew Reese 的评论。

最后在 ListItems 我有这个:

<ListItem button key=item.id to=item.url component=NavLink>
    <ListItemIcon>item.icon()</ListItemIcon>
    <ListItemText primary=item.title />
</ListItem>

item.url 可以是“仪表板”、“结帐”或“用户”。

【讨论】:

以上是关于在侧菜单的路线中反应路线的主要内容,如果未能解决你的问题,请参考以下文章

如何在反应导航中更改后退按钮路线

反应路线将子路线移动到单独的模块?

从反应导航堆栈中删除最后一条路线

渲染道具 - 反应路线

反应 - 从功能改变路线

javascript 反应路线历史가