React Router5
# 相关理解
# SPA
- 单页Web应用(single page web application,SPA)。
- 整个应用只有一个完整的页面。
- 点击页面中的链接不会刷新页面,只会做页面的局部更新。
- 数据都需要通过ajax请求获取, 并在前端异步展现。
# 路由
# 后端路由
理解: value是function, 用来处理客户端提交的请求。
注册路由:
router.get(path, function(req, res))
1工作过程:当node接收到一个请求时, 根据请求路径找到匹配的路由, 调用路由中的函数来处理请求, 返回响应数据
# 前端路由
浏览器端路由,
value
是component
,用于展示页面内容。注册路由:
<Route path="/test" component={Test}>
1工作过程:当浏览器的path变为
/test
时, 当前路由组件就会变为Test
组件
# 相关API
# 内置组件
- BrowserRouter
- HashRouter
- Route
- Redirect
- Link
- NavLink
- Switch
# 其它
- history对象
- match对象
- withRouter函数
# 基本路由使用
1.下载react-router-dom
:
npm install --save react-router-dom
1
# 基本使用
明确好界面中的导航区、展示区
导航区的
a
标签改为Link
标签<Link to="/xxxxx">Demo</Link>
1展示区写
Route
标签进行路径的匹配<Route path='/xxxx' component={Demo}/>
1App
的最外侧包裹了一个<BrowserRouter>
或<HashRouter>
<div className="list-group">
{/*原生html,靠<a>跳转*/}
{/*<a className="list-group-item active" href="./about.html">About</a>*/}
{/*<a className="list-group-item" href="./home.html">Home</a>*/}
{/*在React靠路由链接实现切换组件*/}
<Link className="list-group-item" to="/about">About</Link>
<Link className="list-group-item" to="/home">Home</Link>
</div>
<div className="panel-body">
{/*注册路由*/}
<Route path="/about" component={About}/>
<Route path="/home" component={Home}/>
</div>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 路由组件与一般组件
1.写法不同:
一般组件:<Demo/>
路由组件:
<Route path="/demo" component={Demo}/>
1
2.存放位置不同:
一般组件:components
路由组件:pages
3.接收到的props
不同:
一般组件:写组件标签时传递了什么,就能收到什么
路由组件:接收到三个固定的属性
history:
go: ƒ go(n)
goBack: ƒ goBack()
goForward: ƒ goForward()
push: ƒ push(path, state)
replace: ƒ replace(path, state)
location:
pathname: "/about"
search: ""
state: undefined
match:
params: {}
path: "/about"
url: "/about"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# NavLink与封装NavLink
NavLink
可以实现路由链接的高亮,通过activeClassName
指定样式名
import React, { Component } from 'react'
import {NavLink} from 'react-router-dom'
export default class MyNavLink extends Component {
render() {
return (
<NavLink activeClassName="atguigu" className="list-group-item" {...this.props}/>
)
}
}
<MyNavLink to="/about">About</MyNavLink> === <MyNavLink to="/about" children="About"/>
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# Switch的使用
- 通常情况下,path和component是一一对应的关系。
- Switch可以提高路由匹配效率(单一匹配),匹配到了不再往下看。
<Switch>
<Route path="/about" component={About}/>
<Route path="/home" component={Home}/>
<Route path="/home" component={Test}/>
</Switch>
1
2
3
4
5
2
3
4
5
# 解决多级路径刷新页面样式丢失的问题
public/index.html
中 引入样式时不写./
写/
(常用)public/index.html
中 引入样式时不写./
写%PUBLIC_URL%
(常用)- 使用
HashRouter
# 路由的严格匹配与模糊匹配
- 默认使用的是模糊匹配(简单记:【输入的路径】必须包含要【匹配的路径】,且顺序要一致)
- 开启严格匹配:
<Route exact={true} path="/about" component={About}/>
- 严格匹配不要随便开启,需要再开,有些时候开启会导致无法继续匹配二级路由
# Redirect的使用
一般写在所有路由注册的最下方,当所有路由都无法匹配时,跳转到Redirect指定的路由(兜底的)
<Switch> <Route path="/about" component={About}/> <Route path="/home" component={Home}/> <Redirect to="/about"/> </Switch>
1
2
3
4
5
# 嵌套路由使用
- 注册子路由时要写上父路由的path值
- 路由的匹配是按照注册路由的顺序进行的
// App有两个路由组件Home和About
{/* 注册路由 */}
<Switch>
<Route path="/about" component={About}/>
<Route path="/home" component={Home}/>
<Redirect to="/about"/>
</Switch>
// Home有两个路由组件News和Message
<MyNavLink to="/home/news">News</MyNavLink>
<MyNavLink to="/home/message">Message</MyNavLink>
{/* 注册路由 */}
<Switch>
<Route path="/home/news" component={News}/>
<Route path="/home/message" component={Message}/>
<Redirect to="/home/news"/>
</Switch>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 向路由组件传递参数数据
params参数
路由链接(携带参数):
<Link to='/demo/test/tom/18'}>详情</Link>
1注册路由(声明接收):
<Route path="/demo/test/:name/:age" component={Test}/>
1接收参数:
this.props.match.params
1
search参数
路由链接(携带参数):
<Link to='/demo/test?name=tom&age=18'}>详情</Link>
1注册路由(无需声明,正常注册即可):
<Route path="/demo/test" component={Test}/>
1接收参数:
this.props.location.search
1备注:获取到的
search
是urlencoded
编码字符串,需要借助querystring解析
state参数
路由链接(携带参数):
<Link to={{pathname:'/demo/test',state:{name:'tom',age:18}}}>详情</Link>
1注册路由(无需声明,正常注册即可):
<Route path="/demo/test" component={Test}/>
1接收参数:
this.props.location.state
1备注:刷新也可以保留住参数
# 多种路由跳转方式
# push和replace
<MyNavLink replace to="/about">About</MyNavLink>
<MyNavLink replace to="/home">Home</MyNavLink>
1
2
2
# 编程式导航
借助this.prosp.history
对象上的API对操作路由跳转、前进、后退
- this.prosp.history.push()
- this.prosp.history.replace()
- this.prosp.history.goBack()
- this.prosp.history.goForward()
- this.prosp.history.go()
# BrowserRouter与HashRouter的区别
- 底层原理不一样:
- BrowserRouter使用的是H5的history API,不兼容IE9及以下版本。
- HashRouter使用的是URL的哈希值。
- path表现形式不一样
- BrowserRouter的路径中没有#,例如:
localhost:3000/demo/test
- HashRouter的路径包含#,例如:
localhost:3000/#/demo/test
- BrowserRouter的路径中没有#,例如:
- 刷新后对路由state参数的影响
- BrowserRouter没有任何影响,因为state保存在history对象中。
- HashRouter刷新后会导致路由state参数的丢失!!!
- 备注:HashRouter可以用于解决一些路径错误相关的问题。
上次更新: 2024/08/14, 04:14:33