react第十二单元(react路由-使用react-router-dom-认识相关的组件以及组件属性)
第十二单元(react路由-使用react-router-dom-认识相关的组件以及组件属性)
#课程目标
- 理解路由的原理及应运
- 理解react-router-dom以及内置的一些组件
- 合理应用内置组件及其属性搭建项目路由
#知识点
- 路由的由来
路由就是指随着浏览器地址栏的变化,展示给用户的页面也不相同。这是从路由的用途上来解释路由是什么的,还有一种说法是:路由就是URL到函数的映射。
1-1. hash => 路由的实现就是基于location.hash来实现的。其实现原理也很简单,location.hash的值就是URL中#后面的内容
<a href="#/">主页</a>
<a href="#/home">home</a>
<a href="#/index">index</a>
<div id='content'></div>
<script>
/*
URL中hash值只是客户端的一种状态,也就是说当向服务器端发出请求时,hash部分不会被发送。hash值的改变,都会在浏览器的访问历史中增加一个记录。因此我们能通过浏览器的回退、前进按钮控制hash的切换。我们可以使用hashchange事件来监听hash的变化。
*/
class Router{
constructor({routes}) {
this.routes = routes;
this.everyPath = {};
this.init();
this.routes.forEach(item => {
this.everyPath[item.path] = function() {
document.getElementById('content').innerHTML = item.component;
}
})
}
init() {
window.addEventListener('load', this.updateLocation.bind(this))
window.addEventListener('hashchange', this.updateLocation.bind(this))
}
updateLocation() {
let pathRes = window.location.hash.slice(1);
console.log(this.everyPath, '----', pathRes)
this.everyPath[pathRes]();
}
}
new Router({
routes: [
{
path: '/',
component: '主页'
},
{
path: '/home',
component: 'home'
},
{
path: '/index',
component: 'index'
}
]
})
</script>
1-2. history => 前面的hash虽然也很不错,但使用时都需要加上#,并不是很美观。因此到了HTML5,又提供了History API来实现URL的变化。其中做最主要的API有以下两个:history.pushState()和history.repalceState()。这两个API可以在不进行刷新的情况下,操作浏览器的历史纪录。唯一不同的是,前者是新增一个历史记录,后者是直接替换当前的历史记录。
<a href="javascript:;" data-to='/'>去首页</a>
<a href="javascript:;" data-to='/home'>去home页</a>
<a href="javascript:;" data-to='/index'>去index页</a>
<div id="content"></div>
<script>
class Router{
constructor({routes}) {
this.router = routes;
this.init()
this.bindClick();
}
init() {
window.addEventListener('popstate', this.updateView.bind(this));
}
updateView() {
let content = document.getElementById('content');
let clickRes = window.location.pathname
content.innerHTML = this.router.filter(val => val.path === clickRes)[0].component;
}
bindClick() {
let pushA = document.querySelectorAll('a');
[].forEach.call(pushA, item => {
item.addEventListener('click', () => {
let clickRes = item.getAttribute('data-to');
window.history.pushState({}, null, clickRes)
this.updateView()
})
})
}
}
new Router({
routes: [
{
path: '/',
component: '主页'
},
{
path: '/home',
component: 'home'
},
{
path: '/index',
component: 'index'
}
]
})
// 1.状态对象(state object):一个JavaScript对象,与用pushState()方法创建的新历史记录条目关联。无论何时用户导航到新创建的状态,会触发popstate事件,并能在事件中使用该对象。
// 2.标题(title):一般浏览器会忽略,最好传入null。
// 3. 地址(URL):就是需要新增的历史记录的地址,浏览器不会去直接加载改地址,但后面也可能会去尝试加载该地址。此外需要注意的是,传入的URL与当前URL应该是同源的。
</script>1-3. 两种实现方式的对比:基于Hash的路由实现,兼容性更好;而基于History API的路由,则更正式,更美观,可以设置与当前URL同源的任意URL,路径更直观。此外,基于Hash的路由不需要对服务器做改动,基于History API的路由需要对服务器做一些改造,需要对不同的路由进行相应的处理才行(404)。
相应的内置组件
2-1. BrowserRouter
- basename: 该router下路由路径的base url. 应该有一个前置斜杠,但不能有后置斜杠。如果你的页面路由路径为某个子目录,那base url应设置为这个子目录。该页面的其他路由路径即在这个之下。
<BrowserRouter basename="/calendar"/>
<Link to="/today"/> // renders <a href="/calendar/today">
2-2. HashRouter
- 与BrowserRouter一致
2-3. Link
to: string, 路由链接, 由location的path, search, hash属性拼接而成。
to : object { pathname: 跳转路径,search: 查询参数, hash: url中的hash, eg. #a-hash, state:存储到location中的额外状态数据}
replace: 布尔值- 为true时,将会替换history stack中的当前路径
2-4. NavLink
activeClassName: string, 渲染样式
activeStyle:object, 渲染样式
2-5. Redirect
to: string, url地址
to: object, location object, 属性有:pathname: 跳转路径,search: 查询参数, hash: url中的hash, eg. #a-hash, state:存储到location中的额外状态数据. location中的state可以在redirect跳转组件的this.props.location.state访问
push: 为true表示redirect path将往history stack中推一条新数据而不是替换他
from: redirect from url, 会进行正则匹配。只能用在
component: 当传递component渲染UI时,router将会用React.createElement来将组件封装成一个新的React element, 当传递一个inline func, react每次render都会unmount, mount一个新的组件,会消耗性能,此时可以使用render/children prop
render: func, inline func不会有上述性能问题,参数同route props相同
2-7. Switch
- 渲染或中第一个匹配location的组件,且子元素只能为或
#授课思路
#案例和作业
- 高度还原页面
- 利用react-router-dom搭建整个项目的路由
react第十二单元(react路由-使用react-router-dom-认识相关的组件以及组件属性)的更多相关文章
- linux基础-第十二单元 硬盘分区、格式化及文件系统的管理一
第十二单元 硬盘分区.格式化及文件系统的管理一 硬件设备与文件名的对应关系 硬盘的结构及硬盘分区 为什么进行硬盘分区 硬盘的逻辑结构 Linux系统中硬盘的分区 硬盘分区的分类 分区数量的约束 使用f ...
- react第十单元(children的深入用法-React.Children对象上的方法)
第十单元(children的深入用法-React.Children对象上的方法) #课程目标 理解什么是children 掌握React.Children对象上的方法 #知识点 什么是children ...
- 十八、React react-router4.x中:实现路由模块化、以及嵌套路由父子组件传值
一.路由模块化(用字典定义路由,然后循环出来) 1.官方文档参考 [官方文档]https://reacttraining.com/react-router/web/guides/quick-start ...
- 前端笔记之React(七)redux-saga&Dva&路由
一.redux-saga解决异步 redux-thunk 和 redux-saga 使用redux它们是必选的,二选一,它们两个都可以很好的实现一些复杂情况下redux,本质都是为了解决异步actio ...
- React之js实现跳转路由
1.新增知识 /* 实现js跳转路由:https://reacttraining.com/react-router/web/example/auth-workflow 1.要引入Redirect im ...
- React 学习笔记(2) 路由和UI组件使用
安装依赖 cnpm install react-router-dom -S // 或 yarn add react-router-dom 导入 // index.js import React fro ...
- react实战系列 —— React 中的表单和路由的原理
其他章节请看: react实战 系列 React 中的表单和路由的原理 React 中的表单是否简单好用,受控组件和非受控是指什么? React 中的路由原理是什么,如何更好的理解 React 应用的 ...
- React简单教程-6-单元测试
前言 我想大部分人的前端测试,都是运行项目,直接在浏览器上操作,看看功能正不正常.虽然明明有测试库可以使用,但是因为"要快"的原因,让好好做测试变成了一件影响效率的事. 因为这种无 ...
- react看这篇就够了(react+webpack+redux+reactRouter+sass)
本帖将对一下内容进行分享: 1.webpack环境搭建: 2.如何使用react-router: 3.引入sass预编译: 4.react 性能优化方案: 5.redux结合react使用: 6.fe ...
随机推荐
- scala中的val,var和lazy
转自:https://yerias.github.io/2020/03/19/scala/3/#3%EF%BC%9Alazy%E4%BF%AE%E9%A5%B0%E7%AC%A6%E5%8F%AF%E ...
- MathType颜色设置的技巧
MathType功能非常强大,在编辑公式时使用非常方便.运用MathType不仅可以改变公式的字体和字号,也可以改变公式字体颜色,MathType颜色设置还是有一套技术的,下面我们就一起来看看公式编辑 ...
- 如何利用 CleanMyMac X 进行系统清理
CleanMyMac X是一款颇受欢迎的专业清理软件,拥有十多项强大的功能,可以进行系统清理.清空废纸篓.清除大旧型文件.程序卸载.除恶意软件.系统维护等等,并且这款清理软件操作简易,非常好上手,特别 ...
- Linun中配置redis密码
这里以linux服务器为例,为redis配置密码. 1.第一种方式 (当前这种linux配置redis密码的方法是一种临时的,如果redis重启之后密码就会失效,) (1)首先进入redis,如果没有 ...
- NOIP2012 解题报告
TG Day1 T3 开车旅行 1. 预处理出从每座城市两人分别会到达的两座城市. 用 set 可以轻松实现. 2. 用倍增优化 DP 令 \(f_{i,j,k}\) 表示从城市 \(j\) 出发,行 ...
- Java基础教程——Jshell
Jshell 从java9开始,java提供Jshell工具,可以输入代码片段并马上看到运行结果. 对于简单的Java语句测试,不需要新建文件,编译,运行了 Microsoft Windows [版本 ...
- 给你的C/C++学习路线建议
因为程序员的高工资,吸引了大部人学习编程,但是通过书籍和视频来学习,总是别人推荐一点是一点,那么如何才能系统有效的学习呢?今天就为你来介绍~ C语言是所有学习编程的人都应该首要学习的语言,今天就C语言 ...
- PADS经验总结
PADS经验总结 1. 快捷键z+数字,能够快速查看相应层:直接z,会显示所有层: 2. 快捷键l+数字,在走线时能够快速切换层: 3. setup->design Rules能设置线宽,DRC ...
- 20200416_Centos 7.2 在安装系统之前把数据备份出来
第一种方法: 起因: 服务器强制断电, 然后就再也启动不起来了, 进入救援模式, 一直卡死在 charoot /mnt/sysimages; 然后想在救援模式下的shell中挂载我的2T的移动硬盘, ...
- 记一次bug思考过程:HibernateException: Could not obtain transaction-synchronized Session for current thread
场景:把从客户端提交的任务放到线程池执行 异常:HibernateException: Could not obtain transaction-synchronized Session for cu ...