v6路由https://blog.csdn.net/kkkys_kkk/article/details/134851952?spm=1001.2014.3001.5502
目录
类组件
基本配置
路由重定向
Switch的使用
模糊匹配和精确匹配
声明式导航与编程式导航
二级路由
路由配置
动态路由
动态路由的三种方式
1.params方式
2.query方式
3.state方式
路由对象 withRouter
路由守卫
路由懒加载
函数组件
npm i react-router-dom@5
import ReactDOM from 'react-dom/client';
import App from './App';
// 从react-router-dom中引入BrowserRouter模块并重命名为Router
import { BrowserRouter as Router } from 'react-router-dom';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
{/* 将App组件用Router包裹起来 */}
);
3.在app.js文件配置
(在这里因为我们的路由组件包裹的是app文件,所以可以把app.js文件看作路由表来理解)
*创建components文件夹,新建Home.js和New.js文件,引入
import { Link, Route } from 'react-router-dom';
//通过 Route 模块的 path 属性和 component 属性设置路径和组件的对应关系
import Home from './components/Home';
import News from './components/News';
import { Link, Route } from 'react-router-dom'
function App() {
return (
首页 //to属性跳转
新闻
);
}
export default App;
*to属性为对象格式时:
pathname: 设置路由跳转的路径
query: 已经转化成字符串的键值对的对象,保存在 location 中
当我们希望给当前的路由添加一个样式的时候,我们可以使用 NavLink 模块来替代 Link 模块
import { NavLink, Route } from 'react-router-dom'
function App() {
return (
首页
新闻
);
}
*给NavLink添加 activeclassname 属性,属性名为class名。然后在样式中定义 active 的样
*通过redirect实现,from: 从哪个路径而来,to: 要跳转到哪个路径
//引入redirect模块
import { NavLink, Route, Redirect } from 'react-router-dom'
function App() {
return (
首页
新闻
{/* 当我们访问跟路径的时候,就重定向到/home */}
);
*解决路由切换后,刷新页面还停留在本页面问题
//引入Switch模块
import { NavLink, Route, Redirect, Switch } from 'react-router-dom'
function App() {
return (
首页
新闻
{/* 当我们访问跟路径的时候,就重定向到/home */}
);
模糊匹配:
我们的根路径 ‘/‘ 会匹配到任何路径,因为任何路径都是以 / 开头的。我们把 / 这样的路径叫做父路径,把例如: /home 、 /new叫做子路径。那么父路径会匹配它下面的所有子路径。
例如: /home 会匹配到 /home/aaa 、 /home/bbb 等。因为 /home/aaa 、 /home/bbb 都是 /home
import { NavLink, Route, Redirect, Switch } from 'react-router-dom'
import NotFount from "./components/NotFount";
function App() {
return (
首页
新闻
{/* 当我们访问跟路径的时候,就重定向到/home */}
);
}
*通过Link跳转的是声明式导航
*通过js提供的api来实现的跳转的导航叫做编程式导航
// Home.js
*按照上面一级路由的格式,创建Course文件夹和 Course.js文件
import { Component } from 'react';
import { Route, NavLink, Switch, Redirect } from 'react-router-dom';
import JsCourse from './Course/Js';
import VueCourse from './Course/Vue'
import ReactCourse from './Course/ReactCourse'
export default class Course extends Component {
render() {
return (
Course
js课程
Vue课程
React课程
//二级路由配置
//跳转到不同的页面
)
}
}
{ /* 通过:id来声明我们要传递的参数是id */ }
{ /* 此处的1、2就是传递的id参数 */ }
军事新闻
体育新闻
跳转方法:
//直接匹配值
this.props.history.push('/news/1')
//使用对象格式
this.props.history.push({ 'pathname': '/news', 'params': { id: 1 }
})
获取参数方式:
const { id } = this.props.match.params
{ /* 此处的1、2就是传递的id参数 */ }
军事新闻
体育新闻
获取参数方式:
const id = this.props.location.search.split('=')[1]
{ /* 此处的1、2就是传递的id参数 */ }
军事新闻
体育新闻
获取参数方式:
const { id } = this.props.location.state
只有被路由管理的组件的 props 属性上才具有路由三大对象: history 、 location 、 match 。
当前组件必须是通过 Route 组件渲染出来的,该组件的 props 上才有路由三大对象
// 创建一个Home的子组件
class HomeChild extends Component {
componentDidMount() {
// 因为HomeChild这个组件是直接渲染在Home组件中,并不是通过Route组件渲染出来
的。所以HomeChild这个组件并没有被路由所管理,因此该组件的props属性上不具有路
由三大对象
console.log(this.props) // 打印出空对象
}
render() {
return (
我是Home组件的子组件
)
}}
withRouter 模块可以让没有被路由管理的组件也可以获取到路由三大对象
使用方式:
import { withRouter } from 'react-router-dom';
// withRouter方法接收一个组件作为参数,然后返回一个具有路由三大对象的组件
const myComponentWith = withRouter(myComponent)
ex:
// components/HomeChild.js
import { Component } from 'react'
import { withRouter } from 'react-router-dom'
// 创建一个Home的子组件
class HomeChild extends Component {
componentDidMount() {
console.log(this.props) // 打印出路由三大对象
}
render() {
return (
我是Home组件的子组件
) }}
export default withRouter (HomeChild)
*使用withRouter 包裹组件
import { Route, Redirect, Switch } from 'react-router-dom';
import Login from './components/Login';
import Home from './components/Home';
function App(props) {
// 验证是否登录成功的函数
const LoginVerfiy = () => {
if(sessionStorage.token) {
return true;
} else {
return false;
}
}
return (
{/* 通过render属性来渲染组件 */}
LoginVerfiy() ? :
} />
);
}
export default App;
import React, { Component, Suspense } from 'react'
import { Route, NavLink, Switch } from 'react-router-dom'
const Home = React.lazy(() => import('./components/Home'))
const Course = React.lazy(() => import('./components/Course'))
export default class App extends Component {
render() {
return (
{/* 路由跳转 */}
首页
课程
{/* 路由表 */}
加载中... }>
基本配置方法和类组件一样的,在这只说不同的点,传参方法和接受方法
首先是传参,在函数组件中,我们使用的都是钩子函数,所以我们在进行路由跳转的时候,引入useHistory()函数,声明一个变量来接收该方法,在代码中使用push方法进行跳转,传参与类组件是一样的
import {useHistory} from "react-router-dom" // 引入该方法
export default function App() {
const history = useHistory() //定义一个变量来接受该方法
console.log(history);
return (
)
}
接收参数:
使用 params 方法传参时,使用useParams()方法接收;
使用query方法传参时 ,使用useLocation()方法接收
在使用前都要进行方法的引用
import React from 'react'
import { useLocation, useParams } from 'react-router-dom';
export default function Shang() {
const{id} = useParams() //接受的路由动态参数
const {search} =useLocation() //参数在search参数中包括,使用结构赋值获取变量值
console.log(search);
return (
//使用search,需要对数据进行一个处理
商品的页面{search.split("=")[1]}
//使用params传递的动态路由参数
商品的页面{id}
)
}