我目前正试图在我的应用程序中实现Reaction Router,我想在所有页面上使用最新版本(6.4)的布局,所以我使用createBrowserRouter和我的Layout元素以及所有的子元素来创建不同的路由,但实际上我的代码看不到它们中的任何一个.

我想得到每个页面的布局,有条件的渲染依赖于导航,所以我必须把它放在路由里面.

我试着按照DOC(https://reactrouter.com/en/main/routers/create-browser-router),带子元素的筑巢路由项目:

路由组件:

const router = createBrowserRouter([
    {
        element: <Layout />,
        children: [
            {
                path: '/',
                element: <Dashboard />,
            },
            {
                path: 'gestion_preferences',
                element: <ManagePreferences />,
            },
            {
                path: 'trame_preferences',
                element: <ManageTrames />,
            },
        ],
    },
])

布局组件:

const Layout = () => {

  return (
        <Container
            sx={{ height: '100%' }}
            maxWidth={false}
            disableGutters={true}
        >
            <Header  />
            <Box
                sx={{
                 height: "100%",
                  overflowY: "auto",
                  display: 'flex',
                  flexDirection: 'column',
                  justifyContent: 'center',
                  alignItems: 'center',
                  bgcolor: 'background.main',
                  zIndex:1,
                }}
            >
                <Outlet />
            </Box>
            <Footer />
        </Container>
  )
}

应用程序组件:

const router = createBrowserRouter(routesConfig)

const App = () => {
    return (
        <ThemeProvider theme={theme}>
                <CssBaseline />
                <UserProvider>
                    <Layout>
                        <RouterProvider router={router} />
                    </Layout>
                </UserProvider>
        </ThemeProvider>
    )
}


我不想手动重复我所有组件中的元素

编辑:我添加了其他组件一起工作,我也try 在我的布局中放置{Child}而不是Outlet

推荐答案

Issue

根据我对您的代码示例的了解,问题是布局组件在两个地方呈现.一次正确地作为布局路由,其中嵌套路由可以将其element呈现到由布局呈现的Outlet中,并且再次呈现在包装RouterProvider组件的APP组件中.问题是布局不使用和渲染任何childrenprops ,因此包裹的RouterProvider不会被渲染.

布局

const 布局 = () => { // <-- no children prop
  return (
    <Container
      sx={{ height: '100%' }}
      maxWidth={false}
      disableGutters={true}
    >
      <Header />
      <Box ....>
        <Outlet />
      </Box>
      <Footer />
    </Container>
  )
}

APP

const router = createBrowserRouter(routesConfig);

const APP = () => {
  return (
    <ThemeProvider theme={theme}>
      <CssBaseline />
      <UserProvider>
        <布局>
          <RouterProvider router={router} /> // <-- child of 布局
        </布局>
      </UserProvider>
    </ThemeProvider>
  );
};

Solution

The BrowswerRouter data router is already rendering the 布局 component, so it's completely unnecessary in the APP component and should be removed.

APP

const router = createBrowserRouter(routesConfig);

const APP = () => {
  return (
    <ThemeProvider theme={theme}>
      <CssBaseline />
      <UserProvider>
        <RouterProvider router={router} />
      </UserProvider>
    </ThemeProvider>
  );
};

Reactjs相关问答推荐

如何处理具有REACTION-REDUX状态的Nextjs路由警卫

基本react 应用程序正在触发两次Use Effect

GitHub页面未正确显示Reaction应用程序网站

状态更改时的rtk查询触发器

透明MOV文件未出现在我的React网页中

MUI 日期 Select 器 - 最小日期混乱

当从子状态更改复制时,react 父状态更改.我该如何防止这种情况?

我如何使用 React toastify (Promise) toast 和邮箱 js

在 useSelector() 中使用 array.map() 如何导致组件在分派操作时重新渲染?

如何更新redux状态存在的输入框

React:如何使用条件渲染和react 挂钩来更新另一个组件的状态?

从 React 应用程序调用未经身份验证的 graphql 查询时出现错误:没有当前用户

如何在同一路由路径上重新渲染组件(链接,V6)reactjs

NextJS htaccess 设置

在 Spring Cloud Gateway 中运行的 React SPA 页面刷新出现白标错误

getAttribute 函数并不总是检索属性值

将 dict 值转换并插入到react 钩子的列表中

我在使用 Elements of stripe 时使用 React router v6

React useEffect hooks return () => cleanup() vs return cleanup

bootstrap 导航栏切换器在 reactjs 中不起作用