React漫漫学习路之 React Router

React Router 是一个基于 React 之上的强大路由库,它可以让你向应用中快速地添加视图和数据流,同时保持页面与 URL 间的同步。

目前react-router最新版本已经到4.0+,因为新的版本是一次非常大的改动,所以这里直接讨论4.0以上版本。

引用

react-router        // React Router 核心
react-router-dom     // 用于 DOM 绑定的 React Router
react-router-native   // 用于 React Native 的 React Router
react-router-redux     // React Router 和 Redux 的集成
react-router-config    // 静态路由配置的小助手

以上资源库按需引用,本文讨论web端应用,只需要引用react-router-dom即可。(如果需要搭配redux则还需引用react-router-redux)

主要组件

<Route>

Route组件主要的作用就是当一个location匹配路由的path时,渲染某些UI,exp:

 1 import { BrowserRouter as Router, Route } from ‘react-router-dom‘
 2
 3 <Router>
 4   <div>
 5     <Route exact path="/" component={Home}/>
 6     <Route path="/news" component={NewsFeed}/>
 7   </div>
 8 </Router>
 9 // If the location of the app is / then the UI hierarchy will be something like:
10
11 <div>
12   <Home/>
13   <!-- react-empty: 2 -->
14 </div>
15 // And if the location of the app is /news then the UI hierarchy will be:
16
17 <div>
18   <!-- react-empty: 1 -->
19   <NewsFeed/>
20 </div>

<Route> 的三种渲染方式 :

<Route component>  // 只有当访问地址和路由匹配时,一个 React component 才会被渲染,此时此组件接受 route props (match, location, history)
<Route render>    // 此方法适用于内联渲染,不会引起意料之外的重新挂载
<Route children>   // 不管地址匹配与否都会被调用,与render的工作方式基本一样

tips:同一个<Route>中只使用一种渲染方式,多种会被覆盖,优先级为component>render>children。

<Route> 的三个属性:

path(string):   // 路由匹配路径。(没有path属性的Route 总是会 匹配);
exact(bool):   // 为true时,则要求路径与location.pathname必须完全匹配;
strict(bool):  // 为true时,有结尾斜线的路径只能匹配有斜线的location.pathname

<BrowserRouter>

<Router> 使用 HTML5 提供的 history API (pushStatereplaceState 和 popstate 事件) 来保持 UI 和 URL 的同步。

属性:

basename: string

作用:为所有位置添加一个基准URL(假如你需要把页面部署到服务器的二级目录,你可以使用 basename 设置到此目录)

<BrowserRouter basename="/minooo" />
<Link to="/react" />   // 最终渲染为 <a href="/minooo/react">

getUserConfirmation: func
作用:导航到此页面前执行的函数,默认使用 window.confirm

const getConfirmation = (message, callback) => {
  const allowTransition = window.confirm(message)
  callback(allowTransition)
}

<BrowserRouter getUserConfirmation={getConfirmation(‘Are you sure?‘, yourCallBack)} />

forceRefresh: bool
作用:当浏览器不支持 HTML5 的 history API 时强制刷新页面。

const supportsHistory = ‘pushState‘ in window.history
<BrowserRouter forceRefresh={!supportsHistory} />

keyLength: number
作用:设置它里面路由的 location.key 的长度。默认是6。(key的作用:点击同一个链接时,每次该路由下的 location.key都会改变,可以通过 key 的变化来刷新页面。)

<BrowserRouter keyLength={12} />

children: node
作用:渲染单一子元素。

<Link>

为应用提供声明式的、无障碍导航。

import { Link } from ‘react-router-dom‘

<Link to="/about">关于</Link>

属性:

to: string

需要跳转到的路径(pathname)或地址(location)。

<Link to="/courses"/>

to: object

需要跳转到的地址(location)。

<Link to={{
  pathname: ‘/courses‘,
  search: ‘?sort=name‘,
  hash: ‘#the-hash‘,
  state: { fromDashboard: true }
}}/>

replace: bool

当设置为 true 时,点击链接后将使用新地址替换掉访问历史记录里面的原地址。

当设置为 false 时,点击链接后将在原有访问历史记录的基础上添加一个新的纪录。

默认为 false

<NavLink>

<NavLink><Link> 的一个特定版本, 会在匹配上当前 URL 的时候会给已经渲染的元素添加样式参数

属性

activeClassName: string

导航选中激活时候应用的样式名,默认样式名为 active

<NavLink
  to="/about"
  activeClassName="selected"
>MyBlog</NavLink>

activeStyle: object

如果不想使用样式名就直接写style

<NavLink
  to="/about"
  activeStyle={{ color: ‘green‘, fontWeight: ‘bold‘ }}
>MyBlog</NavLink>

exact: bool

若为 true,只有当访问地址严格匹配时激活样式才会应用

strict: bool

若为 true,只有当访问地址后缀斜杠严格匹配(有或无)时激活样式才会应用

isActive: func

决定导航是否激活,或者在导航激活时候做点别的事情。不管怎样,它不能决定对应页面是否可以渲染。

<Switch>

只渲染出第一个与当前访问地址匹配的 <Route> 若没有匹配则渲染 <Redirect>

import { Switch, Route } from ‘react-router‘

<Switch>
  <Route exact path="/" component={Home}/>
  <Route path="/about" component={About}/>
  <Route path="/:user" component={User}/>
  <Redirect to={NoMatch}/>
</Switch>

<Redirect>

<Redirect> 渲染时将导航到一个新地址,这个新地址覆盖在访问历史信息里面的本该访问的那个地址。

属性

to: string

重定向的 URL 字符串

to: object

重定向的 location 对象

push: bool

若为真,重定向操作将会把新地址加入到访问历史记录里面,并且无法回退到前面的页面。

from: string

需要匹配的将要被重定向路径。

<Prompt>

当用户离开当前页面前做出一些提示。

属性

message: string

当用户离开当前页面时,设置的提示信息。

<Prompt message="确定要离开?" />

message: func

当用户离开当前页面时,设置的回掉函数

<Prompt message={location => (
  `Are you sue you want to go to ${location.pathname}?`
)} />

when: bool

通过设置一定条件要决定是否启用 Prompt

对象和方法

history

history 对象通常具有以下属性和方法:

length: number        // 浏览历史堆栈中的条目数
action: string        // 路由跳转到当前页面执行的动作,分为 PUSH, REPLACE, POP
location: object       // 当前访问地址信息组成的对象,具有如下属性:
pathname: string       // URL路径
search: string         // URL中的查询字符串
hash: string           // URL的 hash 片段
state: string          // 例如执行 push(path, state) 操作时,location 的 state 将被提供到堆栈信息里,state 只有在 browser 和 memory history 有效。
push(path, [state])    // 在历史堆栈信息里加入一个新条目。
replace(path, [state]) // 在历史堆栈信息里替换掉当前的条目
go(n)                  // 将 history 堆栈中的指针向前移动 n。
goBack()               // 等同于 go(-1)
goForward              // 等同于 go(1)
block(prompt)          // 阻止跳转

history 对象是可变的,因此建议从 <Route> 的 prop 里来获取 location,而不是从 history.location 直接获取。这样可以保证 React 在生命周期中的钩子函数正常执行,exg:

class Comp extends React.Component {
  componentWillReceiveProps(nextProps) {
    // locationChanged
    const locationChanged = nextProps.location !== this.props.location

    // 错误方式,locationChanged 永远为 false,因为history 是可变的
    const locationChanged = nextProps.history.location !== this.props.history.location
  }
}

location

location 是指你当前的位置,将要去的位置,或是之前所在的位置

{
  key: ‘sdfad1‘
  pathname: ‘/about‘,
  search: ‘?name=cz‘
  hash: ‘#af01a‘,
  state: {
    price: 998
  }
}

在以下情境中可以获取 location 对象

在 Route component 中,以 this.props.location 获取
在 Route render 中,以 ({location}) => () 方式获取
在 Route children 中,以 ({location}) => () 方式获取
在 withRouter 中,以 this.props.location 的方式获取

location 对象不会发生改变,因此可以在生命周期的回调函数中使用 location 对象来查看当前页面的访问地址是否发生改变。这种技巧在获取远程数据以及使用动画时非常有用

componentWillReceiveProps(nextProps) {
  if (nextProps.location !== this.props.location) {
    // 已经跳转了!
  }
}

可以在不同情境中使用 location:

<Link to={location} />
<NaviveLink to={location} />
<Redirect to={location />
history.push(location)
history.replace(location)

match

match 对象包含了 <Route path> 如何与 URL 匹配的信息,具有以下属性:

params: object   // 路径参数,通过解析 URL 中的动态部分获得键值对
isExact: bool    // 为 true 时,整个 URL 都需要匹配
path: string     // 用来匹配的路径模式,用于创建嵌套的 <Route>
url: string      // URL 匹配的部分,用于嵌套的 <Link>

获取 match 对象

在 Route component 中,以 this.props.match获取
在 Route render 中,以 ({match}) => () 方式获取
在 Route children 中,以 ({match}) => () 方式获取
在 withRouter 中,以 this.props.match的方式获取matchPath 的返回值

更多react-router4.0+详情,请查看官方文档

时间: 2024-10-24 16:39:15

React漫漫学习路之 React Router的相关文章

React漫漫学习路之 利用Create React App命令创建一个React应用

所谓万事开头难,本文旨在为初探React的同学,建立第一个最基本的react应用. Create React App是Facebook官方的一个快速构建新的 React 单页面应用的脚手架工具,它可以帮你配置开发环境,以便你可以使用最新的 JavaScript 特性,还能提供很棒的开发体验,并为生产环境优化你的应用.(如果你使用过vue-cli构建vue应用,那么此处可类比) 话不多说,直接开始. 安装 全局安装create-react-app npm install -g create-rea

React+Redux学习笔记:React+Redux简易开发步骤

前言 React+Redux 分为两部分: UI组件:即React组件,也叫用户自定义UI组件,用于渲染DOM 容器组件:即Redux逻辑,处理数据和业务逻辑,支持所有Redux API,参考之前的文章:Redux学习笔记:Redux简易开发步骤 而React+Redux是以上两部分结合起来,方便在React中使用Redux,专用库为React-Redux.js.React-Redux.js新增了一些新方法: Provider:容器跟组件,可直接把外部的state传递给所有子组件和UI组件: m

为什么要学习React,学习React在大数据开发上有什么好处

为什么要学习React,学习React在大数据开发上有什么好处 分享之前我还是要推荐下我自己创建的大数据学习资料分享群716581014,这是全国最大的大数据学习交流的地方,2000人聚集,不管你是小白还是大牛,小编我都挺欢迎,今天的源码已经上传到群文件,不定期分享干货,包括我自己整理的一份最新的适合2018年学习和零基础入门教程,欢迎初学和进阶中的小伙伴. 如何学习React 如果你是一个 React (或者前端) 新手, 出于以下的原因, 你可能会对这个生态圈感到困惑: React 的目标群

react native 学习一(环境搭配和常见错误的解决)

react native 学习一(环境搭配) 首页,按照http://reactnative.cn/docs/0.30/getting-started.html#content上的介绍,下载安装python2.nodejs.git.Android Studio.这里前面两个都比较好装,android studio装起来相当慢,其实应该只用装sdk就行了,安装sdk可以按http://www.androiddevtools.cn/这个里面的方式设个代理. 软件装好了,就是环境变量设置了,添加AND

React Native学习(1):怎么快速学习一门新技术

React Native学习方法论 这是我技术公众号的第一篇文章,也是ReactNative系列文章的第一篇,对我的文章感兴趣的可以加我微信16230091进行关注. 本文表面上讲React Native(以下简称RN),实际上对于学习任何语言和系统都适用. 对于新技术的学习,分为两种,一种是语言,类似Swift.Objective-C.Java.ES6,另一种是系统,比如Android.iOS.前端. 1. 语言层面,如果你精通某一门语言,那么是可以很快切换到另一门语言的.这就是语言的相通性.

react简单学习路线(实用版)

学习一门新的技术之前有必要了解一下该技术在专业领域的评价,使用的领域,以及整体的学习路线,总之尽可能多的在入坑之前了解相关方面的信息.不要什么都不去查就直接学了,这个是很愚蠢的!!!!! 首先来看一篇文章,它简单讲解了学习react的流程,确实很有帮助,看完之后再开始你的学习,这样会避免走很多的弯路. http://www.jianshu.com/p/ed55b366cd96 接下来可以去http://www.runoob.com/react/react-tutorial.html 这个地方学习

React Native学习-将 &#39;screen&#39;, &#39;window&#39; or a view生成图片

https://github.com/facebook/react-native/commit/ac12f986899d8520527684438f76299675dc0daa 这是react-native自带的生成图片的属性,所以使用之前只需要引用UIManager属性即可: View生成图片: state = { uri: null }; takeToImage() { UIManager.takeSnapshot(this.refs.location, {format: 'png', qu

React架构之路

笔者本人其实对react的项目经验很少,主要是用Angular框架.前段时间和同学合作做了一个酒店加盟平台项目,我负责后台管理系统,采用的是Angular框架.他负责微信小程序,采用react框架.但随着项目的进行,我发现他的项目文件我一时难以理清,整个项目结构比较零散.只有他自己对自己的项目很熟悉.我也提出了一些疑问,说react架构为何如此松散.当然,后续的故事就不赘述了. 笔者现在在校答辩中,利用空余时间对react做了较为深入的一些研究.以下是笔者的个人心得分享. 很多开发者都知道rea

React入门学习

为了获得更好的阅读体验,请访问原地址:传送门 一.React 简介 React 是什么 React 是一个起源于 Facebook 的内部项目,因为当时 Facebook 对于市场上所有的 JavaScript MVC 框架都不太满意,所以索性就自己写了一套,用来架设 Instagram.做出来之后,发现这套东西还蛮好用的,于是就在 2013 年 5 月开源了. 在这里我们需要稍微注意一下 库(Library) 和 框架(Framework) 的区别,React 本身是一个用于构建用户界面的 J