React 路由 V5(完整版)

一.什么是路由?
指路径url与不同的页面和内容进行相应匹配,可以友好的解决Component到url之间的同步映射关系
二.路由的使用
(1).下载react-router
指令(指定v5版本):npm install react-router-dom@5
(2).app内引入

import {HashRouter,Route} from 'react-router-dom'//hash模式,路径
中会带#号
<div>
<HashRouter>
	<Route path='路径' component={组件名称}>//一级路由
<HashRouter/>
<div/>

(3).路由组件封装
为了方便对路由管理,可单独封装起来
创建一个router文件夹
–router.js

import {HashRouter,Route} from 'react-router-dom'

export default function Routers (){
	return (
	<div>
		<HashRouter>
			<Route path='路径' component={组件名称}>//一级路由
		<HashRouter/>
	</div>
)
}

在app文件中引入:

import Routers from './router/router';

function App() {
  return (
    <div className="App">
     	{/*其他内容*/}
        <Routers ></Routers >
    </div>
  );
}

注:需要用路由进行加载的页面可单独创建view文件进行存放管理

三.路由重定向
在根路径下,或者不存在的路径会自动匹配到Redirect指定的路径(模糊匹配)

import {HashRouter,Route,Redirect} from 'react-router-dom'
<Redirect from="/根路径" to="需要跳转到的路径"/>

问题:会存在即使在其他路径下只要刷新页面就会跳转到to指定的路径页面
解决方法:使用switch进行包裹,只渲染匹配到的第一个路由

import {HashRouter,Route,Redirect,Switch} from 'react-router-dom'
<Switch>
<Redirect from="/根路径" to="需要跳转到的路径"/>
</Switch>

当我们需要将不存在的路径跳转到我们自己设置的404页面时,可以将Redirect设置成精确匹配模式,exact

import {HashRouter,Route,Redirect,Switch} from 'react-router-dom'
<Switch>
<Redirect from="/" to="需要跳转到的路径" exact / > //只有在/下会跳转到指定路径

//当路径不存在时会自动跳转至notfound页面,需要自定义此页面
<Route component={NotFound}>
</Switch>

四.嵌套路由
也是二级路由,需要在同一页面下展示不同组件时可以使用
与一级路由结构完全相同,只命名方式不同。此嵌套路由需要在一级路由对应的组件内部进行编写

import {HashRouter,Route,Redirect,Switch} from 'react-router-dom'
<Switch>
<Route path='/一级路由路径/子路径' component={组件名称}>//一级路由
<Redirect from="/一级路由路径" to="/一级路由路径/子路径" / > //当处于一级路由时指定展示二级路由显示页面


</Switch>

五.声明式导航与编程式导航
(1)声明式导航
提供了NavLink标签供我们做跳转使用(类似于js原生a标签)
注意:NavLink必须写在route下面

import {NavLink } from 'react-router-dom'
<NavLink to="要跳转的页面路径" activeClassName="自定义高亮样式名称"></NavLink>

(2)编程式导航
类似与window.location.href=“要跳转的路径”,当组件写在route中被渲染时,会继承route提供的属性,可在props中获得到history等,可用props.history.push(路径${id})进行跳转,函数式组件封装了useHistory,可引入进行代替

import {useHistory} from 'react-router-dom'

const history=useHistory()

//使用
history.push(`路径${id}`)
类组件中使用this.props.history.push(`路径${id}`)进行跳转

六.动态路由(路由传参)
当我们需要获取不同id值展示不同的详情页面时,需要使用到动态路由获取参数

//动态路由传参(params传参)
history.push(`路径${id}`)
<Route path:'/detail/:id' component={Detail}>
//可通过props.match.params拿到我们传递的值id

其他路由传参方式

//query传参
history.push({pathName:"/detail" query:{myid:id})
<Route path:'/detail' component={Detail}>
//可通过props.location.query拿到我们传递的值id
//state传参
history.push({pathName:"/detail" state:{myid:id})
<Route path:'/detail' component={Detail}>
//可通过props.location.state拿到我们传递的值id

注意:动态路由不会出现路由参数丢失的情况
七.路由拦截
例如我的信息页面,订单,购物车页面都需要进行路由守卫(拦截)处理
将Route的component换成render函数的写法来进行路由限制

<Route path="/center" render={(props)=>{
		//此处可进行逻辑编写,判断用户是否登录以及是否有权限
		return 是否授权?<Center {...props}/> : < Redirect to='/login' />
}}/>
//单独设置登录页面
<Route path='/login' component={Login}/>

八.路由模式(不携带路由格式中的#号)

<HashRouter>替换成<BrowserRouter>
将导入的Router重命名可以用as
import {HashRouter as Router } from 'react-router-dom'
<Router >
</ Router >

注意:BrowserRouter会真正朝后端发请求要页面,后端如果没有对应的路径处理路径,就会404
九.WithRouter

import {WithRouter } from 'react-router-dom'
//包裹需要传值的子组件
const wRouter = WithRouter(mycomponent)
//mycomponent组件内部会继承父组件的传参,高阶组件原理
  • 14
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React Router v5 中,获取由参数的方式会略有不同。你可以通过以下步骤在类组件中获取由参数: 1. 首先,确保你已经正确配置了 React Router,并在应用的根组件中包裹了 `<Router>` 组件。这样才能使由参数在整个应用中可用。 2. 在类组件中,你可以通过 `this.props.match.params` 来访问由参数。`match` 对象中的 `params` 属性是一个包含由参数的对象。 下面是一个示例: ```jsx import React from 'react'; import { BrowserRouter as Router, Route, Link } from 'react-router-dom'; class MyComponent extends React.Component { render() { const { id } = this.props.match.params; // 获取名为 "id" 的由参数 return ( <div> <h1>My Component</h1> <p>由参数: {id}</p> </div> ); } } class App extends React.Component { render() { return ( <Router> <div> <h1>App</h1> <ul> <li> <Link to="/component/1">组件 1</Link> </li> <li> <Link to="/component/2">组件 2</Link> </li> </ul> <Route path="/component/:id" component={MyComponent} /> </div> </Router> ); } } export default App; ``` 在上面的示例中,我们定义了一个 `MyComponent` 类组件,它通过 `this.props.match.params` 获取名为 "id" 的由参数。然后,我们在 `App` 组件中使用 `<Route>` 组件来将 `MyComponent` 组件与 `/component/:id` 径匹配。 通过这种方式,当访问 `/component/1` 或 `/component/2` 径时,`MyComponent` 组件会被渲染,并可以获取到对应的由参数。 请注意,上述示例是使用了 React Router v5 的方式获取由参数。如果你正在使用 React Router v6,请参考之前我提供的关于 v6 的回答。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值