https://reactrouter.com/en/main/components/routes
react-router :核心模块‘ react路由的大部分的核心功能,包括路由匹配算法和大部分的核心组件和钩子
react-router-dom React组件中用于路由的软件包,包括react-router的所有内容,还添加了一些特定的Dom的api
react-router-native 开发reactNavite应用,包括react-router的所有内容,添加了一些react-native的api
路由表配置
src/router/index.js
import React from 'react'
import { Routes, Route } from 'react-router-dom'
import Home from '../Home'
import Course from '../Course'
export default function MRoute() {
return (
// Routes替代了Switch
{/* element替代了component */}
}>
}>
)
}
路由视图
App.js
import React from 'react'
import { BrowserRouter as Router } from 'react-router-dom'
// 引入路由表
import MRoute from './router'
export default function App() {
return (
)
}
React-routerV6版本中已经没有了Redirect组件
第一种:使用Navigate组件替代
src/router/index.js
import React from 'react'
import { Routes, Route, Navigate } from 'react-router-dom'
import Home from '../Home'
import Course from '../Course'
export default function MRoute() {
return (
// Routes替代了Switch
{/* element替代了component */}
}>
}>
{/* 路由重定向 */}
}>
)
}
第二种:自定义Redirect组件
import { useEffect } from 'react'
import { useNavigate } from 'react-router-dom'
export default function Redirect(props) {
const navigate = useNavigate()
useEffect(() => {
// replace: true 代表的是要替换掉之前的页面
navigate(props.to, { replace: true })
})
return null
}
{/* element替代了component */}
}>
}>
{/* 路由重定向 */}
}>
404页面
{/* element替代了component */}
}>
}>
{/* 路由重定向 */}
}>
{/* 404页面 */}
}>
声明式导航
首页
课程
NavLink组件会自动给当前的匹配到的路由NavLink添加一个class名为active,要实现高亮效果设置active样式
自定义class名
(isActive ? 'my-active' : '')}
>
首页
(isActive ? 'my-active' : '')}
>
课程
NavLink有一个属性className,它接收一个函数,该函数的参数是一个对象,里面有一个属性isActive,
我们可以根据这个属性的值是否为true来判断是否添加class名
编程式导航
import React from 'react'
import { useNavigate } from 'react-router-dom'
export default function Home() {
// 使用useNavigate这个钩子 可以通过js的方式实现跳转
const navigate = useNavigate()
return (
Home
)
}
基本配置
import React from 'react'
import { Routes, Route, Navigate } from 'react-router-dom'
import Home from '../Home'
import Course from '../Course'
import Redirect from '../Redirect'
import NotFound from '../NotFound'
import JsCourse from '../JsCourse'
import VueCourse from '../VueCourse'
import ReactCourse from '../ReactCourse'
export default function MRoute() {
return (
// Routes替代了Switch
{/* element替代了component */}
}>
}>
{/* 嵌套路由 */}
{/* index匹配到的父路径 */}
}>
}>
}>
}>
{/* 路由重定向 */}
}>
{/* 404页面 */}
}>
)
}
通过Outlet组件实现嵌套路由的视图显示
import React from 'react'
import { NavLink, Outlet } from 'react-router-dom'
export default function Course() {
return (
js课程
vue课程
react课程
)
}
query形式传参
export default function Home() {
// 使用useNavigate这个钩子 可以通过js的方式实现跳转
const navigate = useNavigate()
return (
Home
{/* 新闻 */}
军事新闻
体育e新闻
娱乐新闻
)
}
//路由配置
{/* element替代了component */}
}>
}>
{/* 嵌套路由 */}
{/* index匹配到的父路径 */}
}>
}>
}>
}>
{/* 新闻 */}
}>
{/* 路由重定向 */}
}>
{/* 404页面 */}
}>
//News.js 获取参数
import React from 'react'
import { useSearchParams } from 'react-router-dom'
export default function News() {
// 通过useSearchParams钩子函数来获取query形式的参数
const [searchparams, setSearchParams] = useSearchParams()
return News{searchparams.get('id')}
}
/*
searchparams.get('id') 获取路由参数的值
searchparams.has('id') 判断参数是否存在
setSearchParams({'id':45}) 在当前页面修改路由参数的值
*/
import React from 'react'
import { useParams } from 'react-router-dom'
export default function NewsDetail() {
// 通过useParams 接收params传递的参数
const params = useParams()
return NewsDetail{params.id}
}
{/* element替代了component */}
}>
}>
{/* 嵌套路由 */}
{/* index匹配到的父路径 */}
}>
}>
}>
}>
{/* 新闻 */}
}>
{/* params形式 */}
}>
{/* 路由重定向 */}
}>
{/* 404页面 */}
}>
{/* params形式传参 */}
军事新闻
体育e新闻
娱乐新闻
路由拦截组件封装
//AuthComponent.js
import React from 'react'
import Redirect from './Redirect'
export default function AuthComponent(props) {
// 获取当前组件
const Comp = props.children.type
return localStorage.getItem('token') ? :
}
配置登录拦截
{/* element替代了component */}
}
>
}>
{/* params形式 */}
}>
{/* 路由重定向 */}
}>
{/* 404页面 */}
}>
登录功能
import React from 'react'
import { useNavigate } from 'react-router-dom'
export default function Login() {
const navigate = useNavigate()
const login = () => {
localStorage.setItem('token', '112222')
navigate('/home')
}
return (
)
}
import React, { Suspense } from 'react'
import { Routes, Route } from 'react-router-dom'
// 通过React.lazy函数配合import 函数实现按需导入模块
const Home = React.lazy(() => import('../Home'))
const Course = React.lazy(() => import('../Course'))
const Login = React.lazy(() => import('../Login'))
const News = React.lazy(() => import('../News'))
const NewsDetail = React.lazy(() => import('../NewsDetail'))
const Redirect = React.lazy(() => import('../Redirect'))
const NotFound = React.lazy(() => import('../NotFound'))
const JsCourse = React.lazy(() => import('../JsCourse'))
const VueCourse = React.lazy(() => import('../VueCourse'))
const ReactCourse = React.lazy(() => import('../ReactCourse'))
const AuthComponent = React.lazy(() => import('../AuthComponent'))
export default function MRoute() {
return (
// 使用Suspense组件包裹所有路由表
// Routes替代了Switch
{/* element替代了component */}
}
>
}>
{/* 嵌套路由 */}
{/* index匹配到的父路径 */}
}>
}>
}>
}>
{/* 新闻 */}
}>
}>
{/* params形式 */}
}
>
{/* 路由重定向 */}
}>
{/* 404页面 */}
}>
)
}
路由懒加载组件封装
import React, { lazy, Suspense } from 'react'
export default function LazyLoad(path) {
const Element = lazy(() => import(`./${path}`))
return (
)
}
使用useRoutes钩子将路由转成配置文件
import React, { Suspense } from 'react'
import { useRoutes } from 'react-router-dom'
import LazyLoad from '../LazyLoad'
import Redirect from '../Redirect'
export default function MRoute() {
const element = useRoutes([
{
path: '/',
element: ,
},
{
path: '/home',
element: LazyLoad('Home'),
},
{
path: '/course',
element: LazyLoad('Course'),
children: [
{
path: 'js',
element: LazyLoad('JsCourse'),
},
{
path: 'vue',
element: LazyLoad('VueCourse'),
},
{
path: 'react',
element: LazyLoad('ReactCourse'),
},
{
path: '',
element: ,
},
],
},
{
path: '/news',
element: LazyLoad('News'),
},
{
path: '/newsdetail/:id',
element: LazyLoad('NewsDetail'),
},
{ path: '*', element: LazyLoad('NotFound') },
])
return element
}