React 路由器 dom 导航方法无法正常工作
React router dom navigate method is not working properly
嘿,我正在尝试构建一个具有导航功能的简单 React 应用程序。主题是我有 3 个组件,App、Test 和 AppShell。 App 组件是默认(初始)组件。我想要的是 每次用户访问 App 组件时,我的应用程序都会重定向到 Test 组件。
我面临的问题是我的重定向只在我第一次加载应用程序时有效,之后我的重定向就不起作用了。
我在下面与索引页一起分享我的三个组件代码!
索引页
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import React from 'react';
import ReactDOM from 'react-dom';
import {
BrowserRouter as Router,
Routes,
Route
} from "react-router-dom";
ReactDOM.render(
<Router>
<Routes>
<Route path='/' element={<App />} />
<Route path='/test' element={<Test />} />
</Routes>
</Router>,
document.getElementById('root')
);
function Test() {
return <h1>Test Me</h1>;
}
reportWebVitals();
应用组件
import "./App.css";
import AppShell from "./components/core/appShell";
import { useNavigate } from 'react-router-dom';
export default function App(props) {
let navigate = useNavigate();
return <AppShell {...props} navigate={navigate} />;
}
应用shell组件
import React, { Component } from 'react';
import { Outlet } from "react-router-dom";
class AppShell extends Component {
componentDidMount() {
this.props.navigate('/test');
}
render() {
return (
<div>
<h1>This is app shell</h1>
<Outlet />
</div>
);
}
}
export default AppShell;
我认为问题出在组件钩子中,所以我也尝试在构造函数中实现重定向,但没有任何效果!
我在这里试图解决的基本业务问题是 - 用户将被重定向到登录页面,每次 he/she 尝试浏览另一个页面,无论是否有效登录(有效user) 可以基于本地存储上的有效令牌
谁能说,我做错了什么?
关于受保护路由的身份验证在 react-router-dom
v6
中实际上非常简单
创建一个访问 auth 上下文(本地状态、redux 存储、本地存储等)的包装器组件,并根据 auth 状态为您要保护的嵌套路由呈现一个 Outlet
组件,或重定向到您的身份验证端点。
示例AuthWrapper
:
const AuthWrapper = () => {
const location = useLocation();
const token = !!JSON.parse(localStorage.getItem("token"));
return token ? (
<Outlet />
) : (
<Navigate to="/login" replace state={{ from: location }} />
);
};
使用:
useLocation
挂钩以获取用户正在尝试访问的当前位置。
Outlet
嵌套保护路由的组件。
Navigate
用于声明式导航的组件,在路由状态中发送当前 location
,以便用户可以在身份验证后重定向回来。
用法示例:
<Router>
<Routes>
<Route element={<AuthWrapper />}>
<Route path="/" element={<App />} />
</Route>
<Route path="/login" element={<Login />} />
<Route path="*" element={<Navigate to="/" replace />} />
</Routes>
</Router>
登录 - 在身份验证处理程序中,一旦通过身份验证,设置 localStorage 并导航到路由状态中传递的位置。
function Login() {
const { state } = useLocation();
const navigate = useNavigate();
const { from = "/" } = state || {};
const login = () => {
localStorage.setItem("token", JSON.stringify(true));
navigate(from);
};
return (
<>
<h1>Test Me</h1>
<button type="button" onClick={login}>Log In</button>
</>
);
}
嘿,我正在尝试构建一个具有导航功能的简单 React 应用程序。主题是我有 3 个组件,App、Test 和 AppShell。 App 组件是默认(初始)组件。我想要的是 每次用户访问 App 组件时,我的应用程序都会重定向到 Test 组件。
我面临的问题是我的重定向只在我第一次加载应用程序时有效,之后我的重定向就不起作用了。
我在下面与索引页一起分享我的三个组件代码!
索引页
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import React from 'react';
import ReactDOM from 'react-dom';
import {
BrowserRouter as Router,
Routes,
Route
} from "react-router-dom";
ReactDOM.render(
<Router>
<Routes>
<Route path='/' element={<App />} />
<Route path='/test' element={<Test />} />
</Routes>
</Router>,
document.getElementById('root')
);
function Test() {
return <h1>Test Me</h1>;
}
reportWebVitals();
应用组件
import "./App.css";
import AppShell from "./components/core/appShell";
import { useNavigate } from 'react-router-dom';
export default function App(props) {
let navigate = useNavigate();
return <AppShell {...props} navigate={navigate} />;
}
应用shell组件
import React, { Component } from 'react';
import { Outlet } from "react-router-dom";
class AppShell extends Component {
componentDidMount() {
this.props.navigate('/test');
}
render() {
return (
<div>
<h1>This is app shell</h1>
<Outlet />
</div>
);
}
}
export default AppShell;
我认为问题出在组件钩子中,所以我也尝试在构造函数中实现重定向,但没有任何效果!
我在这里试图解决的基本业务问题是 - 用户将被重定向到登录页面,每次 he/she 尝试浏览另一个页面,无论是否有效登录(有效user) 可以基于本地存储上的有效令牌
谁能说,我做错了什么?
关于受保护路由的身份验证在 react-router-dom
v6
创建一个访问 auth 上下文(本地状态、redux 存储、本地存储等)的包装器组件,并根据 auth 状态为您要保护的嵌套路由呈现一个 Outlet
组件,或重定向到您的身份验证端点。
示例AuthWrapper
:
const AuthWrapper = () => {
const location = useLocation();
const token = !!JSON.parse(localStorage.getItem("token"));
return token ? (
<Outlet />
) : (
<Navigate to="/login" replace state={{ from: location }} />
);
};
使用:
useLocation
挂钩以获取用户正在尝试访问的当前位置。Outlet
嵌套保护路由的组件。Navigate
用于声明式导航的组件,在路由状态中发送当前location
,以便用户可以在身份验证后重定向回来。
用法示例:
<Router>
<Routes>
<Route element={<AuthWrapper />}>
<Route path="/" element={<App />} />
</Route>
<Route path="/login" element={<Login />} />
<Route path="*" element={<Navigate to="/" replace />} />
</Routes>
</Router>
登录 - 在身份验证处理程序中,一旦通过身份验证,设置 localStorage 并导航到路由状态中传递的位置。
function Login() {
const { state } = useLocation();
const navigate = useNavigate();
const { from = "/" } = state || {};
const login = () => {
localStorage.setItem("token", JSON.stringify(true));
navigate(from);
};
return (
<>
<h1>Test Me</h1>
<button type="button" onClick={login}>Log In</button>
</>
);
}