react-router 和react-router-dom

1、区别

react-router:实现了路由的核心功能
react-router-dom:基于react-router,加入了在浏览器运行环境下的一些功能,例如Link组件、BrowserRouter和HashRouter组件。

2、引入

import {Swtich, Route, Router, HashHistory, Link} from 'react-router-dom';
import {Switch, Route, Router} from 'react-router';
import {HashHistory, Link} from 'react-router-dom';

3、组件

<BrowserRouter>---<Router>的一种,通过使用HTML5提供的history API(pushState,replaceState,propstate)机制来维持页面UI同RUL的统一。
Props

basename: 该router下路由路径的base url. 应该有一个前置斜杠,但不能有后置斜杠。如果你的页面路由路径为某个子目录,那base url应设置为这个子目录。该页面的其他路由路径即在这个之下。
getUserConfirmation: 路由跳转的二次确认函数,用来拦截Prompt组件, 默认情况下使用window.confirm弹框。
forceRefresh: 布尔值,为true时, router在进行路由跳转的时候会进行页面刷新,可能只在浏览器不支持H5 history api的情况下需要使用。
keyLength: 自定义location.key的长度,默认为6. location.key 或者location.state(废弃)可以用来保存页面滚动条位置。
children: 需要渲染的‘单个reactNode元素组件’。

<BrowserRouter basename={'/home'} getUserConfirmation={setConfirmation}>
  <div>
    <Prompt message={'Are you sure to leave'}/>
    <Link to={'/test'}>ceshi</Link>
    <Route path={'/test'} component={Test}/>
  </div>
 </BrowserRouter>

<HashRouter>---<Router>的一种,通过URL hash部分,如location.hash、 hashChange来保持UI同URL一致。
props

basename
getUserConfirmation
hashType:string : 带斜杠,不带斜杠。eg. #/ and #/sunshine/lollipops, # and #sunshine/lollipops
children:reactNode 需要render的‘单个子元素’

<Link>---进入页面路由的链接,最终被渲染成a标签。
props

to: string, 路由链接, 由location的path, search, hash属性拼接而成。
to : object { pathname: 跳转路径,search: 查询参数, hash: url中的hash, eg. #a-hash, state:存储到location中的额外状态数据}
replace: 布尔值- 为true时,将会替换history stack中的当前路径
innerRef: function 允许访问Link的底层组件<a></a>,eg. <Link to='/' innerRef={(node)=>{this.refNode=node}} />
others: 可以传入<a> 元素的属性,eg. title, id, className, etc.

<Link to={{
  pathname: `/Detail/${itemFuns.name}`,
  state: {
    name: `${itemFuns.name}`
  },
}}>
  {itemFuns.description}
</Link>

<NavLink>---<Link> 的特殊版本,当匹配当前URL时,会给当前link添加样式。
props

activeClassName: string, 渲染样式
activeStyle:object, 渲染样式
exact: bool, 为true时,表示精准匹配路由。
strict: bool, 为true时,当进行路由匹配时,后置斜杠将会被考虑在内。
isActive: func, 额外函数来进一步验证当前路由是否匹配。
location: isActive用来比较当前路径是否匹配路由,location用来比较不同的路径。
ariaCurrent : string, link的语义化标识,page| step| location | date| time | true

<Prompt>---当想阻止用户跳转路由,可以使用<prompt>提示用户是否跳转,与router的getUserConfirmation属性结合使用。
props

message: string, 提示的信息。
message : func, 参数为即将跳转的location对象,返回message。
when : bool, true表示阻止跳转,false,接受跳转。

<MemoryRouter>---<Router>一种, 将url history保存在内存中,不可再页面地址栏中读取,通常用于测试或者非浏览器的环境,如react native。
props

initialEntries: array, history stack中保存的locations 数组,locations可以为对象或者url字符串
initialIndex : number, 初始化location在initialEntries中的位置
getUserConfirmation: func, 跳转路由的二次确认函数,与<Prompt>结合使用
keyLength:number, location.key的长度,默认6位
children: node, 单个元素react 组件

<Redirect>---重定向。使用redirect将跳转到一个新的路由,新的location将会覆盖history stack中的当前location。
props

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, 会进行正则匹配。只能用在<Switch>中
exact: bool, 精准匹配
strict: bool, 严格模式,后斜杠将考虑在内

<Route>---React router中最重要的模块,主要职责是当location匹配路由时,会将UI render出来。
props

component: 当传递component渲染UI时,router将会用React.createElement来将组件封装成一个新的React element, 当传递一个inline func, react每次render都会unmount, mount一个新的组件,会消耗性能,此时可以使用render/children prop
render: func, inline func不会有上述性能问题,参数同route props相同
children: func, 有时,无论location是否匹配路由,你都想render某个UI,此时可以使用children prop ,等同于render。 函数参数同route props
component, render优先级高于children,所以不要一次使用一种以上的渲染方式
path: string | string[], 一个url字符串,或者一组url 字符串,会进行正则匹配,如果path为空,那么会认为匹配
exact: bool, 为true, 要精准匹配,path同location.pathname完全一致
strict: bool, 为true, path的后置斜杠将在进行匹配时被考虑在内。
location: object, route path每次都会与当前浏览器的url进行匹配,来确定是否渲染,但是location可以使一个不匹配的pathname通过这种匹配,从而渲染。注意:如果一个<Route>写在了<Switch>中,<Switch>中的location prop将覆盖<Route>中的location
sensitive: bool, pathname,current url匹配时,大小写是否敏感.

<Router>---所有路由组件的最底层接口。
props

history: object, 路由导航历史记录对象
children: 单个子元素组件

<Switch>---渲染<Route>或<Redirect>中第一个匹配location的组件,且子元素只能为<Route>或<Redirect>。
props

location: object,
children: switch的children组件只能为<Route>或<Redirect>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351