20. router

使用 HTML5 提供的 history API (pushState, replaceState 和 popstate 事件) 来保持 UI 和 URL 的同步。

import { BrowserRouter } from 'react-router-dom';


  

  1. basename--所有位置的基准 URL。如果你的应用程序部署在服务器的子目录,则需要将其设置为子目录。basename 的正确格式是前面有一个前导斜杠,但不能有尾部斜杠。
  2. forceRefresh--如果为 true ,在导航的过程中整个页面将会刷新。一般情况下,只有在不支持 HTML5 history API 的浏览器中使用此功能。
  3. getUserConfirmation--用于确认导航的函数,默认使用 window.confirm。例如,当从 /a 导航至 /b 时,会使用默认的 confirm 函数弹出一个提示,用户点击确定后才进行导航,否则不做任何处理。译注:需要配合 一起使用。
  4. keyLength--location.key 的长度,默认为 6。

使用 URL 的 hash 部分(即 window.location.hash)来保持 UI 和 URL 的同步。

import { HashRouter } from 'react-router-dom';


  

1). basename--所有位置的基准 URL。basename 的正确格式是前面有一个前导斜杠,但不能有尾部斜杠。


  

上例中的 最终将被呈现为:


2). getUserConfirmation: func--用于确认导航的函数,默认使用 [window.confirm]

3). hashType: string
window.location.hash 使用的 hash 类型,有如下几种:
slash - 后面跟一个斜杠,例如 #/ 和 #/sunshine/lollipops--默认
noslash - 后面没有斜杠,例如 # 和 #sunshine/lollipops
hashbang - Google 风格的 [ajax crawlable],例如 #!/ 和 #!/sunshine/lollipops

注意
该技术仅用于支持旧式(低版本)浏览器,因此对于一些新式浏览器,我们鼓励你使用 代替


在其 path 属性与某个 [location]匹配时呈现一些 UI。


所有 Router 组件的通用低阶接口。通常情况下,应用程序只会使用其中一个高阶 Router。使用低阶 的最常见用例是同步一个自定义历史记录与一个状态管理库,比如 Redux 或 Mobx。请注意,将 React Router 和状态管理库一起使用并不是必需的,它仅用于深度集成。
有一个属性是history,表示网页历史记录。


为你的应用提供声明式的、可访问的导航链接。
to--字符串形式链接地址,通过 pathname、search 和 hash 属性创建。
或对象形式链接地址,pathneme、search、hash和state
replace--true点击链接时替换,false时添加
innerRef--函数。允许访问组件的底层引用。


会在与当前 URL 匹配时为其呈现元素添加样式属性。如className="active"
exact--如果为 true,则只有在位置完全匹配时才应用激活类/样式。


使用 会导航到一个新的位置。新的位置将覆盖历史堆栈中的当前条目
注意:
只能在标签内使用
以上“根据匹配参数进行重定向”的示例存在bug,没有效果。to 中的 :id 并不会继承 from 中的 :id 匹配的值,而是直接作为字符串显示到浏览器地址栏


用于渲染与路径匹配的第一个子
只会渲染一个路由。相反,仅仅定义一系列 时,每一个与路径匹配的 都将包含在渲染范围内。
用于匹配子元素而不是当前历史位置(通常是当前的浏览器 URL)的 [location]对象。
所有 的子元素都应该是 。只有第一个匹配当前路径的子元素将被呈现。
组件使用 path 属性进行匹配,而 组件使用它们的 from 属性进行匹配。没有 path 属性的 或者没有 from 属性的 将始终与当前路径匹配。
当在 中包含 时,你可以使用任何 拥有的路径匹配属性:path、exact 和 strict。from 只是 path 的别名。
如果给 提供一个 location 属性,它将覆盖匹配的子元素上的 location 属性。


  
  
  
  

history
history 指的是 [history] 包,它是 React Router 的两个主要依赖之一(除了 React 本身),并且提供了几种不同的实现方式,用于在各种环境中管理 JavaScript 中的会话历史。
history 对象通常具有以下属性和方法:

  • length - number 历史堆栈中的条目数
  • action - string 当前的导航操作(pushreplacepop
  • location - object 当前访问的位置信息,可能具有以下属性:
    • pathname - string URL 路径
    • search - string URL 中的查询字符串
    • hash - string URL 中的 hash 片段
    • state - object 存储至 location 中的额外状态数据,仅在 browser historymemory history 中有效。
  • push(path, [state]) - function 将一个新条目推入到历史堆栈中
  • replace(path, [state]) - function 替换历史堆栈中的当前条目
  • go(n) - function 将历史堆栈中的指针移动 n 个条目
  • goBack() - function 返回到上一个页面,相当于 go(-1)
  • goForward() - function 进入到下一个页面,相当于 go(1)
  • block(prompt) - function 阻止导航(请参阅 history 文档)
    注意:history 对象是可变的。因此建议从 渲染组件时接收的属性中直接访问 location,而不是通过 history.location 进行访问。这样可以保证 React 在生命周期中的钩子函数正常执行。

location
location 代表应用程序的位置。如当前的位置,将要去的位置,或是之前所在的位置。它看起来像这样:

{
  key: 'ac3df4', // 使用 hash history 时,没有这个属性
  pathname: '/somewhere'
  search: '?some=search-string',
  hash: '#howdy',
  state: {
    [userDefined]: true
  }
}

Router 将在以下几个地方为您提供一个 location 对象:
在 Route component 中,以 this.props.location 方式获取
在 Route render 中,以 ({ location }) => () 方式获取
在 Route children 中,以 ({ location }) => () 方式获取
在 withRouter 中,以 this.props.location 方式获取
location 对象永远不会发生改变,因此可以在生命周期钩子函数中使用 location 对象来查看当前访问地址是否发生改变。这种技巧在获取远程数据以及使用动画时非常有用。
最终,location 将传递给以下组件:

  • Route
  • Switch
    这将阻止它们在 Router 状态下使用实际位置。这对动画和等待导航非常有用,或者任何时候你想诱导一个组件在不同于真实位置的地方渲染。

match
一个 match 对象包含有关 如何匹配 URL 的信息。它具有以下属性:
params - object 根据 path 中指定的动态片段,从 URL 中解析出的键值对
isExact - boolean 如果整个 URL 匹配(不包含尾随字符),则为 true
path - string 用于匹配的路径模式。可用于构建嵌套的
url - string URL 的匹配部分。可用于构建嵌套的
您可以在以下几个地方访问 match 对象:
在 Route component 中,以 this.props.match 方式获取
在 Route render 中,以 ({ match }) => () 方式获取
在 Route children 中,以 ({ match }) => () 方式获取
在 withRouter 中,以 this.props.match 方式获取
matchPath 的返回值
如果 没有定义 path,并因此始终匹配,则会得到最接近的父匹配。withRouter 也是一样。

image.png

使用Route 会自动在props方法中添加许多东西,以便调用,没有使用Route的使用 withRouter(组件名)之后,就能调用没有添加的东西

react loadable
安装:
引入:
import Loadable from 'react-loadable';
import Loading from './Loading';

image.png

使用:分片打包,按需加载
优点:
基于import()的自动代码拆分
避免组件加载闪烁
预加载


说了这么多,是时候上项目了:

利用路由实现跳转页面及页面中的元素跳转页面

  1. 新建一个react项目
  2. 安装配件
    cnpm i react-router-dom react-loadable -S
  3. 项目目录:


    image.png

(1)/src/app.css
(2)/src/index.js
(3)/src/App.js
(4)/src/routes
(5)/src/component/BackButton/index.js
(6)/src/compoment/index.js
(7)/src/pages/Home/index.js
(8)/src/pages/Mall/index.js
(9)/src/pages/About/index.js
(10)/src/pages/Detail/index.js
(11)/src/pages/index.js

你可能感兴趣的:(20. router)