【发布时间】:2022-11-15 18:34:28
【问题描述】:
我正在尝试从 BrowserRoute 组件切换到 React Router 6.4.3 中的 createBrowserRouter 但出现错误:
useNavigate() 只能在组件的上下文中使用。
我该如何解决?错误来自 AuthProvider 组件,我想我需要用 RouterProvider 包装它,但不清楚我该怎么做。
Index.tsx 组件
const container = document.getElementById('root')!; const root = createRoot(container); root.render( <React.StrictMode> <Provider store={store}> <AuthProvider> <ThemeProvider theme={theme}> <App /> </ThemeProvider> </AuthProvider> </Provider> </React.StrictMode> );App.tsx 组件
const router = createBrowserRouter([ { element: <ProtectedRoute />, children: [ { path: '/', element: <DashboardLayout />, children: [ { index: true, element: <HomePage />, }, { path: 'about', element: <AboutPage />, }, ], }, ], }, { path: '/auth', element: <Auth />, }, ]); const App = () => { const { isLoading } = useAuth0(); if (isLoading) { return <LoaderPage />; } return ( <> <Box> <CssBaseline /> <RouterProvider router={router} /> </Box> </> ); };错误来自 AuthProvider.tsx
export const AuthProvider = ({ children }: PropsWithChildren<Auth0ProviderWithConfigProps>): JSX.Element | null => { const domain = process.env.REACT_APP_AUTH0_DOMAIN; const clientId = process.env.REACT_APP_AUTH0_CLIENT_ID; const navigate = useNavigate(); if (!(domain && clientId)) { return null; } const onRedirectCallback = (appState: any) => { navigate(appState?.returnTo || window.location.pathname); }; return ( <Auth0Provider domain={domain} clientId={clientId} redirectUri={window.location.origin} onRedirectCallback={onRedirectCallback} > {children} </Auth0Provider> ); };
【问题讨论】:
-
Provider 包装器应该在 Router 包装器内....
标签: reactjs typescript react-router react-router-dom