第十二单元(react路由-使用react-router-dom-认识相关的组件以及组件属性)

#课程目标

  1. 理解路由的原理及应运
  2. 理解react-router-dom以及内置的一些组件
  3. 合理应用内置组件及其属性搭建项目路由

#知识点

  1. 路由的由来
  • 路由就是指随着浏览器地址栏的变化,展示给用户的页面也不相同。这是从路由的用途上来解释路由是什么的,还有一种说法是:路由就是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)。

  1. 相应的内置组件

    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的组件,且子元素只能为或

#授课思路

#案例和作业

  1. 高度还原页面
  2. 利用react-router-dom搭建整个项目的路由

react第十二单元(react路由-使用react-router-dom-认识相关的组件以及组件属性)的更多相关文章

  1. linux基础-第十二单元 硬盘分区、格式化及文件系统的管理一

    第十二单元 硬盘分区.格式化及文件系统的管理一 硬件设备与文件名的对应关系 硬盘的结构及硬盘分区 为什么进行硬盘分区 硬盘的逻辑结构 Linux系统中硬盘的分区 硬盘分区的分类 分区数量的约束 使用f ...

  2. react第十单元(children的深入用法-React.Children对象上的方法)

    第十单元(children的深入用法-React.Children对象上的方法) #课程目标 理解什么是children 掌握React.Children对象上的方法 #知识点 什么是children ...

  3. 十八、React react-router4.x中:实现路由模块化、以及嵌套路由父子组件传值

    一.路由模块化(用字典定义路由,然后循环出来) 1.官方文档参考 [官方文档]https://reacttraining.com/react-router/web/guides/quick-start ...

  4. 前端笔记之React(七)redux-saga&Dva&路由

    一.redux-saga解决异步 redux-thunk 和 redux-saga 使用redux它们是必选的,二选一,它们两个都可以很好的实现一些复杂情况下redux,本质都是为了解决异步actio ...

  5. React之js实现跳转路由

    1.新增知识 /* 实现js跳转路由:https://reacttraining.com/react-router/web/example/auth-workflow 1.要引入Redirect im ...

  6. React 学习笔记(2) 路由和UI组件使用

    安装依赖 cnpm install react-router-dom -S // 或 yarn add react-router-dom 导入 // index.js import React fro ...

  7. react实战系列 —— React 中的表单和路由的原理

    其他章节请看: react实战 系列 React 中的表单和路由的原理 React 中的表单是否简单好用,受控组件和非受控是指什么? React 中的路由原理是什么,如何更好的理解 React 应用的 ...

  8. React简单教程-6-单元测试

    前言 我想大部分人的前端测试,都是运行项目,直接在浏览器上操作,看看功能正不正常.虽然明明有测试库可以使用,但是因为"要快"的原因,让好好做测试变成了一件影响效率的事. 因为这种无 ...

  9. react看这篇就够了(react+webpack+redux+reactRouter+sass)

    本帖将对一下内容进行分享: 1.webpack环境搭建: 2.如何使用react-router: 3.引入sass预编译: 4.react 性能优化方案: 5.redux结合react使用: 6.fe ...

随机推荐

  1. Navicat总是提示主键不存在问题

    Windows 和 Linux:打开navicat > 找到工具 > 点击选项- > 外观 > 点击数据 & 网格 > 取消勾选显示主键警告 > 确定. M ...

  2. 企业级工作流解决方案(十二)--集成Abp和ng-alain--用户身份认证与权限验证

    多租户 如果系统需要支持多租户,那么最好事先定义好多租户的存储部署方式,Abp提供了几种方式,根据需要选择,每一个用户身份认证与权限验证都需要完全的隔离 这里设计的权限数据全部存储在缓存中,每个租户单 ...

  3. 无论PC还是Mac,都能畅快地使用移动硬盘

    如果你拥有一台Mac设备,总会遇到尴尬的那一刻--你在Mac上用得好好的移动硬盘怎么都不能被PC识别到.又或者你朋友在PC上用得好好的移动硬盘,连上你的Mac后,Mac里的文件死活就是拷贝不进移动硬盘 ...

  4. ABBYY FineReader 15 PDF文档查看功能

    PDF文档查看功能是ABBYY FineReader 15(Windows系统)OCR文字识别软件中PDF编辑器的一项基础功能,可供用户查看,搜索PDF文档,无需进入编辑模式,也可复制其中的文本,图片 ...

  5. uniapp自定义picker城市多级联动组件

    uniapp自定义picker城市多级联动组件 支持多端--h5.app.微信小程序.支付宝小程序... 支持自定义配置picker插件级数 支持无限级 注意事项:插件传入数据格式为children树 ...

  6. 日期选择组件(DatePicker)的实现

    一.效果图 日期选择组件大概长这样: 从效果图可以看出,日期选择组件由两部分组成:日历表格和顶部操作栏. 二.日历表格 日期选择组件的核心主体是日历表格: 可以将日历表格表示成一个7️*的二维数组,数 ...

  7. mysql建表和建数据库语句

    一.数据库操作语言 数据库在操作时,需要使用专门的数据库操作规则和语法,这个语法就是 SQL(Structured Query Language) 结构化查询语言. SQL 的主要功能是和数据库建立连 ...

  8. Mybatis学习-配置、作用域和生命周期

    核心配置文件:Mybatis-config.xml Mybatis的配置文件包含了会深深影响Mybatis行为的设置和属性信息 配置(configuration) 在mybatis-config.xm ...

  9. 一文搞懂RESTful API

    RESTful接口实战 原创公众号:bigsai 转载请联系bigsai 文章收藏在回车课堂 前言 在学习RESTful 风格接口之前,即使你不知道它是什么,但你肯定会好奇它能解决什么问题?有什么应用 ...

  10. Java基础学习之数据类型、基础语法与数组(3)

    目录 1.数据类型 1.1.基本数据类型 1.2.引用数据类型 1.3.自动装箱与拆箱 2.基础语法 2.1.标识符 2.2.修饰符 2.2.1.访问控制修饰符 2.2.2.非访问控制修饰符 2.3. ...