常见代码逻辑
- 定义状态管理:可以使用React的
useState
钩子来管理登录状态,例如const [isLoggedIn, setIsLoggedIn] = useState(false);
。也可以使用更复杂的状态管理工具如Redux、MobX等。
- 条件渲染:在需要的地方根据
isLoggedIn
的值进行组件渲染,例如:
import React from'react';
function App() {
const [isLoggedIn, setIsLoggedIn] = useState(false);
return (
<div>
{isLoggedIn? <ComponentA /> : <ComponentB />}
</div>
);
}
React Router v5 与 v6 实现差异
React Router v5
- 使用
withRouter
高阶组件(HOC):可以将需要进行条件渲染的组件通过withRouter
包装,这样组件就能访问到路由相关的属性。
import React from'react';
import { BrowserRouter as Router, Route, Switch } from'react-router-dom';
import { withRouter } from'react-router';
import ComponentA from './ComponentA';
import ComponentB from './ComponentB';
function App() {
const [isLoggedIn, setIsLoggedIn] = useState(false);
const ConditionalComponent = withRouter(({ location }) => {
return isLoggedIn? <ComponentA location={location} /> : <ComponentB location={location} />;
});
return (
<Router>
<Switch>
<Route path="/" component={ConditionalComponent} />
</Switch>
</Router>
);
}
- 利用
history
对象:通过history
对象来处理导航逻辑,例如在登录/登出后进行页面跳转。
React Router v6
- 使用
useNavigate
钩子:v6
中不再使用withRouter
,而是通过useNavigate
钩子来进行导航。
import React from'react';
import { createBrowserRouter, RouterProvider } from'react-router-dom';
import ComponentA from './ComponentA';
import ComponentB from './ComponentB';
function App() {
const [isLoggedIn, setIsLoggedIn] = useState(false);
const navigate = useNavigate();
const handleLogin = () => {
setIsLoggedIn(true);
navigate('/');
};
const handleLogout = () => {
setIsLoggedIn(false);
navigate('/login');
};
const router = createBrowserRouter([
{
path: "/",
element: isLoggedIn? <ComponentA /> : <ComponentB />
}
]);
return (
<RouterProvider router={router}>
{/* 其他UI元素,如登录/登出按钮 */}
</RouterProvider>
);
}
- 路由配置变化:
v6
中使用createBrowserRouter
和RouterProvider
进行路由配置,element
属性直接接收要渲染的组件,而不是像v5
使用component
属性。同时v6
移除了Switch
组件,使用Routes
代替,并且路由匹配逻辑也有所改变,采用更扁平的配置方式。