重定向
重定向需使用到组件Navigate
import {Navigate} from 'react-router-dom';
<Route path='/car' element={<Navigate to='/first'></Navigate>}></Route>
import React, { lazy,Suspense } from 'react'
import { BrowserRouter as Router, Routes, Route,Navigate } from 'react-router-dom'
import First from '../views/first/index.jsx'
const Des = lazy(() => import('../views/des/index.jsx'))
const Usercenter = lazy(() => import('../views/usercenter/index.jsx'))
const Test = lazy(() => import('../views/test/index.jsx'))
const Testc = lazy(() => import('../views/test/C.jsx'))
const Testd = lazy(() => import('../views/test/D.jsx'))
export default function Index() {
return (
<Router>
<Routes>
<Route path='/first' element={<First></First>}></Route>
<Route path='/des/*' element={<Suspense><Des /></Suspense>}></Route>
<Route path='/center' element={<Suspense><Usercenter /></Suspense>}></Route>
<Route path='/test' element={<Suspense><Test /></Suspense>}>
<Route path='/test/c' element={<Suspense><Testc /></Suspense>}></Route>
<Route path='/test/d' element={<Suspense><Testd /></Suspense>}></Route>
</Route>
<Route path='/car' element={<Navigate to='/first'></Navigate>}></Route>
<Route path='/info' element={<Navigate to='/test/c'></Navigate>}></Route>
<Route path='/*' element={<First />}></Route>
</Routes>
</Router>
)
}
Route中的element不设置组件,而设置别的已经设置好的Route的path,显示效果就是该path对应的组件。
子路由可以重定向到主路由,主路由中也可以重定向到子路由。
主路由重定向到主路由:
重定向到path为/first对应的组件<First />中,网址会显示为/first
<Route path='/car' element={<Navigate to='/first'></Navigate>}></Route>
主路由重定向到子路由:
重定向到path为/test/c对应的组件中,网址会显示为/test/c
<Route path='/info' element={<Navigate to='/first'></Navigate>}></Route>
重定向还有一种方式,在组件的返回值中使用,可以利用这个做路由鉴权。
function Err(){
return (
<Navigate to='/err'></Navigate>
)
}
<Route path='/err' element={<Error1></Error1>}></Route>
<Route path='/*' element={<Err />}></Route>
</Routes>
import React, { lazy,Suspense } from 'react'
import { BrowserRouter as Router, Routes, Route,Navigate } from 'react-router-dom'
import First from '../views/first/index.jsx'
const Des = lazy(() => import('../views/des/index.jsx'))
const Usercenter = lazy(() => import('../views/usercenter/index.jsx'))
const Test = lazy(() => import('../views/test/index.jsx'))
const Testc = lazy(() => import('../views/test/C.jsx'))
const Testd = lazy(() => import('../views/test/D.jsx'))
const Error1 = lazy(() => import('../views/error/index.jsx'))
function Err(){
return (
<Navigate to='/err'></Navigate>
)
}
export default function Index() {
return (
<Router>
<Routes>
<Route path='/first' element={<First></First>}></Route>
<Route path='/des/*' element={<Suspense><Des /></Suspense>}></Route>
<Route path='/center' element={<Suspense><Usercenter /></Suspense>}></Route>
<Route path='/test' element={<Suspense><Test /></Suspense>}>
<Route path='/test/c' element={<Suspense><Testc /></Suspense>}></Route>
<Route path='/test/d' element={<Suspense><Testd /></Suspense>}></Route>
</Route>
<Route path='/car' element={<Navigate to='/first'></Navigate>}></Route>
<Route path='/info' element={<Navigate to='/test/c'></Navigate>}></Route>
<Route path='/err' element={<Error1></Error1>}></Route>
<Route path='/*' element={<Err />}></Route>
</Routes>
</Router>
)
}
路由鉴权
路由鉴权就是写一个用于鉴权的组件,在该组件中统一判断是否登陆,进而决定该组件中是返回需要去的组件还是需要重定向到登录组件。
// 鉴权组件
import React from 'react'
import { Navigate } from 'react-router-dom'
export default function index(props) {
// 接受需要重定向的组件
let Component=props.mycomponent;
if(true){
// 返回true表示用户是登录状态,就加载相应组件
return <Component></Component>
}else{
// 返回false就重定向到登录组件
return <Navigate to='/login'></Navigate>
}
}
import React, { lazy,Suspense } from 'react'
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom'
import First from '../views/first/index.jsx'
import Oauth from '../views/Oauth/index.jsx' //引入鉴权组件
const Login = lazy(() => import('../views/login/index.jsx'))
const Usercenter = lazy(() => import('../views/usercenter/index.jsx'))
const Des = lazy(() => import('../views/des/index.jsx'))
const Register = lazy(() => import('../views/register/index.jsx'))
export default function Index() {
return (
<Router>
<Routes>
<Route path='/first' element={<First></First>}></Route>
{/* 将详情组件作为参数传入鉴权组件 */}
<Route path='/des' element={<Suspense><Oauth mycomponent={Des} /></Suspense>}></Route>
{/* 将个人中心组件作为参数传入鉴权组件 */}
<Route path='/center' element={<Suspense><Oauth mycomponent={Usercenter} /></Suspense>}></Route>
<Route path='/login' element={<Suspense><Login /></Suspense>}></Route>
<Route path='/register' element={<Suspense><Register /></Suspense>}></Route>
<Route path='/*' element={<First />}></Route>
</Routes>
</Router>
)
}
网络代理配置
方法1:用create-react-app脚手架搭建的react项目中的,可以直接在package.json中配置proxy。
"proxy": "http://localhost:7001"
优点:配置简单,前端请求资源时可以不加任何前缀。
缺点:不能配置多个代理。
方法2:通过middleware中间件的方式设置proxy
1.在项目中安装middleware
yarn add http-proxy-middleware --save
npm install http-proxy-middleware --save
2.创建代理配置文件,在src目录中新建setupProxy.js文件
const { createProxyMiddleware } = require('http-proxy-middleware')
module.exports = function(app){
app.use(
createProxyMiddleware('/api1', {
//api1是需要转发的请求,所有带有/api1前缀的请求都会转发给7001
//配置转发目标地址,能返回数据的服务器地址
target: 'http://localhost:7001',
//控制服务器接收到的请求头中host字段的值
changeOrigin: true,
//去除请求前缀,保证交给后台服务器的是正常请求地址
pathRewrite: {'^/api1': ''}
}),
createProxyMiddleware('/api2', {
target: 'http://localhost:8080',
changeOrigin: true,
pathRewrite: {'^/api2': ''}
})
)
}
优点:可以配置多个代理。
缺点:配置繁琐,前端请求资源时必须加前缀。