Передайте состояние Частным вложенным маршрутам на маршрутизаторе React v6

#reactjs #react-router #react-router-dom #react-router-v6

Вопрос:

Итак, я настроил маршрутизацию приложения React с помощью маршрутизатора React v6 с вложенными маршрутами.

Проблема в том, что когда я получаю доступ к любому из моих частных маршрутов (определенных следующим образом) Я теряю состояние сеанса, теряю такую информацию, как параметры запроса и источник ссылки (предыдущий путь), и, похоже, не могу понять, как я могу передать это состояние своему частному компоненту маршрута дочерним маршрутам.

Это моя конфигурация маршрутизации:

App.js:

 import routes from './routes';

const App = () => {
    const routing = useRoutes(routes);

    return (
        <ThemeProvider theme={theme}>
            <UserProvider>
                    <GlobalStyles />
                    {routing}
            </UserProvider>
        </ThemeProvider>
    );
};
export default App;
 

Index.js:

 import App from './App';

ReactDOM.render((
  <BrowserRouter>
    <App />
  </BrowserRouter>
), document.getElementById('root'));
 

Routes.js:

В console.log(местоположение) отображается пустое местоположение.состояние

 const Private = ({ component: Component, ...rest }) => {

  const [state] = React.useContext(UserContext);

  const location = useLocation()
  const path = location.pathname

  console.log(location)
  if (state.auth){
    console.log('Authenticated');
    return <Component {...rest} />
  }
    
  else {
    console.log('Not Authenticated')
    return <Navigate to = {'/login?from='   path} />
  }
  

};


const routes = [
  {
    path: 'app',
    element: <Private component={DashboardLayout} />,
    children: [
      {
        path: 'account', children: [
          { path: 'integrations', element: <Integrations /> },
        ]
      },
      { path: 'dashboard', element: <Dashboard /> },
      { path: 'audiences', element: <Audiences /> },
      { path: 'creatives', element: <Creatives /> },
      { path: 'copywriting', element: <Copywriting /> },


      { path: 'settings', element: <ProjectSettings /> },
      { path: 'user_settings', element: <UserSettings /> },
      
      { path: 'fb_interests', element: <FbInterestsExplorer /> },
      { path: '*', element: <NotFound /> },
    ]
  },
  {
    path: '/',
    element: <MainLayout />,
    children: [
      { path: 'login', element: <Login /> },
      { path: 'user/activate/:user_id', element: <UserConfirmation /> },
      { path: '/', element: <Navigate to="/app/dashboard" /> },
      { path: '*', element: <NotFound /> }
    ]
  }
];

export default routes;
 

DashboardLayout.js

 const DashboardLayout = () => {
  const [isMobileNavOpen, setMobileNavOpen] = useState(false);

  return (
    <DashboardLayoutRoot>
      <DashboardNavbar onMobileNavOpen={() => setMobileNavOpen(true)} />
      <DashboardSidebar
        onMobileClose={() => setMobileNavOpen(false)}
        openMobile={isMobileNavOpen}
      />
      <DashboardLayoutWrapper>
        <DashboardLayoutContainer>
          <DashboardLayoutContent>
            <Outlet />
          </DashboardLayoutContent>
        </DashboardLayoutContainer>
      </DashboardLayoutWrapper>
    </DashboardLayoutRoot>
  );
};

export default DashboardLayout;
 

Комментарии:

1. У меня точно такая же проблема

Ответ №1:

Попробуйте это, чтобы получить состояние в v6:

     const location = useLocation()
    console.log(location)
    const state = location.state
    console.log(state)
 

Ответ №2:

Это произошло со мной при распространении объекта внутри состояния истории.

 <MenuItem
  onClick={() => {
    history("/users/form", {
      state: { isNew: false, ...row },
    })
  }}
>
  Edit
</MenuItem>
 

Это устранило проблему

 <MenuItem
  onClick={() => {
    history("/users/form", {
      state: {
        isNew: false,
        type: row.type,
        email: row.email,
        kind: row.kind || "",
        role: row.role,
        permissions: row.permissions,
      },
    })
  }}
>
  Edit
</MenuItem>