Router base
一篇关于使用路由的Blog
路由简介
在之前的react笔记中,我们已经简单的了解过路由
1.SPA的理解
1.单页Web应用(single page web application,SPA)。
2.整个应用只有一个完整的页面。
3.点击页面中的链接不会刷新页面,只会做页面的局部更新。
4.数据都需要通过ajax请求获取, 并在前端异步展现。
2.路由的理解
- 什么是路由?
一个路由就是一个映射关系(key:value)
key为路径, value可能是function或component - 路由分类
后端路由:
1)理解: value是function, 用来处理客户端提交的请求。
2)注册路由: router.get(path, function(req, res))
3)工作过程:当node接收到一个请求时, 根据请求路径找到匹配的路由, 调用路由中的函数来处理请求, 返回响应数据
前端路由:
1)浏览器端路由,value是component,用于展示页面内容。
2)注册路由:<Route path="/test" component={Test}>
3)工作过程:当浏览器的path变为/test时, 当前路由组件就会变为Test组件
3.react-router-dom的理解
- react的一个插件库。
- 专门用来实现一个SPA应用。
基于react的项目基本都会用到此库。
4.内置组件
1 | 1.<BrowserRouter> //支持H5history,用于包裹顶层组件,监听该组件中URL的变化,管理路由 |
这里我们可以简略的说一下路由的发展哈
最早的最早,用户加载网页,是要等整个页面全部加载完才行,很麻烦很耗时间,后来呢,微软就搞了AJAX的基本概念,也就是XMLHttpRequest的前身,有了AJAX后,用户就不需要每次载完了,比如图片GIF什么的加载慢,就先往后靠靠,我看会儿文字,而不是等你图片加载好我才能看到文字。再后来,Google Map展现了AJAX的真正魅力,让其不仅仅局限于简单的数据和页面交互,为后来异步交互体验方式的繁荣发展带来了根基。
而异步交互体验的更高级版本就是 SPA—— 单页应用。单页应用不仅仅是在页面交互是无刷新的,连页面跳转都是无刷新的,为了实现单页应用,所以就有了前端路由。
路由的使用
先要从’react-router-dom’中引入所需要的。
用<Link > 代替<a >
原生Html中,用a标签实现不同页面的跳转:
<a herf='/path'>tab</a>
而在路由中就该用Link实现单页面跳转:
<Link to='/'>tab</Link>
to的值应和路由组件的path一致达成匹配
<NavLink>中有个属性是activeClassName,默认是active,修改它的值就可以做到给点击的链接添加一个修改内容的类名
注册路由
确定好要跳转的组件后,用Route把一般组件注册成路由组件,路由组件因为类似一个单页面,就要把他们放在一个名为pages的文件夹中和一般组件区分开。
然后再用Switch包裹这些路由组件,实现单一匹配。(防止一个路径匹配多个组件出现bug)
最后可以加上Redirect,表示默认
1 | <Switch> |
别忘了添加路由器
1 | <BrowserRouter> |
路由组件接收到到参数
路由组件会默认接到三个props
1 | history: |
嵌套路由(多级路由)
- 注册子路由时要写上父路由的path值
- 路由的匹配是按照注册路由的顺序进行的
解决多级路径刷新页面样式丢失的问题
- public/index.html 中 引入样式时不写 ./ 写 / (常用)
- public/index.html 中 引入样式时不写 ./ 写 %PUBLIC_URL% (常用)
- 使用HashRouter
路由的严格匹配与模糊匹配
- 默认使用的是模糊匹配(简单记:【输入的路径】必须包含要【匹配的路径】,且顺序要一致)
- 开启严格匹配:<Route exact={true} path=”/about” component={About}/ >
- 严格匹配不要随便开启,需要再开,有些时候开启会导致无法继续匹配二级路由
向路由组件传递参数
1 | 1.params参数 |
withRouter
就是把一个一般组件加工,让其可以使用一些路由组件的API,比如props.history
用法:
1 | import {withRouter} from 'react-dom-router'; |
这样Demo组件就变成了一个新组件,不同于一般组件和路由组件
BrowserRouter与HashRouter的区别
1 | 1.底层原理不一样: |