npm i react-router-dom@5
npm i react-router-dom
// 将引入的BrowserRouter模块取一个别名 叫做Router
import { BrowserRouter as Router } from 'react-router-dom'
root.render(
{/* 将App组件用Router包裹起来 */}
)
import React from 'react'
import { BrowserRouter as Router } from 'react-router-dom'
// 引入路由表
import MRoute from './router'
export default function App() {
return (
)
}
}>
}>
import { Route, Switch } from 'react-router-dom'
import { Route, Routes } from 'react-router-dom'
}>
}>
在V5中我们希望一进入页面就可以访问到/home页面,使用Redirect模块
在V6中有两种方法进行路由重定向
React-routerV6版本中已经没有了Redirect组件,使用Navigate组件替代Redirect模块
import { Routes, Route, Navigate } from 'react-router-dom'
// 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 */}
}>
}>
{/* 路由重定向 */}
}>
在V5中当我们希望给当前的路由添加一个样式的时候,我们可以使用NavLink模块来代替Link模块,给NavLink添加activeClassName属性,属性名为class名,在样式中定义active样式
{/* 路由跳转*/}
首页
课程
{/* 路由出口 */}
在V6中NavLink组件会自动给当前的匹配到的路由NavLink添加一个class名为active,要实现高亮效果设置active样式
首页
课程
在V5中使用js进行跳转
export default class NotFound extends Component {
render() {
return (
)
}
handleClick = () => {
console.log(this.props)
this.props.history.push('/course')
}
}
history对象的常用方法
- push路由跳转,push里面传递的参数和NavLink中的to属性的参数是一样的
- go(num) 前进或后退num级
- goBack() go(-1) 后退一级
- goForward() go(1) 前进一级
在V6中使用useNavigate这个钩子 可以通过js的方式实现跳转
import React from 'react'
import { useNavigate } from 'react-router-dom'
export default function Home() {
// 使用useNavigate这个钩子 可以通过js的方式实现跳转
const navigate = useNavigate()
return (
Home
)
}
在V5中需要在那个路由下面嵌套路由,就直接去所需嵌套路由的路由页面里面去创建所需要的路由
//App.js
export default class App extends PureComponent {
render() {
return (
{/* 路由跳转*/}
首页
新闻
课程
)
}
}
//二级路由页面
import { Component } from 'react'
import { NavLink, Redirect, Route, Switch } from 'react-router-dom'
import JsCourse from './course/JsCourse'
import VueCourse from './course/VueCourse'
import ReactCourse from './course/ReactCourse'
export default class Course extends Component {
render() {
return (
Course
js课程
vue课程
react课程
)
}
}
在V6中需要在那个路由下面嵌套路由,就直接在该路由里面直接写路由组件直接写所需要嵌套的路由,在二级路由里面通过Outlet组件实现嵌套路由的视图显示
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页面 */}
}>
)
}
import React from 'react'
import { NavLink, Outlet } from 'react-router-dom'
export default function Course() {
return (
js课程
vue课程
react课程
)
}
query形式传参
在V5中query方式传递的参数不需要在注册路由的时候声明
this.props.location.search.split('=')[1]
在V6中通过useSearchParams钩子函数来获取query形式的参数
searchparams.get(‘id’) 获取路由参数的值
searchparams.has(‘id’) 判断参数是否存在setSearchParams({‘id’:45}) 在当前页面修改路由参数的值
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')}
}
params方式
在V5中 在组件中获取params方式传递参数
const { id } = this.props.match.params
在V6中通过useParams 接收params传递的参数
import React from 'react'
import { useParams } from 'react-router-dom'
export default function NewsDetail() {
// 通过useParams 接收params传递的参数
const params = useParams()
return NewsDetail{params.id}
}
在V6中增加了useRoutes钩子将路由转成配置文件
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: '/course',
element: LazyLoad('Course'),
children: [
{
path: 'js',
element: LazyLoad('JsCourse'),
},
......
],
},
{
path: '/news',
element: LazyLoad('News'),
},
{
path: '/newsdetail/:id',
element: LazyLoad('NewsDetail'),
},
{ path: '*', element: LazyLoad('NotFound') },
])
return element
}