路由

React路由需要借助react-router-dom

基础用法

1、引入:import {BrowserRouter,NavLink,Route,Switch,Redirect} from 'react-router-dom'
2、去index.js把App包裹起来
<BrowserRouter>
<App />
</BrowserRouter>
3、注册路由:
<MYNavLink to="/about">About</MYNavLink>
<MYNavLink to="/home">Home</MYNavLink>
(这里的MYNavLink是对NavLink的封装,包裹了一些类名)
4、匹配路由
<Switch>
{/* 注册路由 默认的是模糊匹配 ,要开启精准(exact)匹配,需要加上exact /}
<Route path='/about' component={About}/>
<Route path='/home' component={Home}/>
<Redirect to='/home'/>
{/
如果前面的都没有匹配上,就重定向到redirect指定的路径 */}
</Switch>

嵌套路由

需要把多级的路由都写出来,而且上级路由要用模糊匹配,如
<Route path='/about/msg1' component={msg1}/>

向路由组件传参
params传参

<Link to={`/home/msg/${obj.id}/${obj.title}`}>{obj.title}</Link>

<Route path="/home/msg/:id/:title" component={detail}>

然后再detail组件的this.props.match.params里就可以取到包含了id和title属性的数据对象

传递search参数

<Link to={`/home/msg/?id=${obj.id}&title=${obj.title}`}>{obj.title}</Link>
<Route path="/home/msg" component={detail}> 无需显示的声明接受,正常注册即可
在detail组件的this.props.location.search里面,但是,没有自动整理成对象的形式
不过react脚手架为我们提供了一个库可以帮忙做这件事

import qs from "querystring"
var obj = {a:1, b: 2}
qs.stringify(obj) // a=1&b=2
let str = 'name=zhangsan&age=18'
qs.parse(str) // {name:'zhangsan', age: 18}
state 参数(不会把传递的东西在地址栏里展示出来)
<Link to={{pathname:"/home/msg", state:{id: obj.id, title:obj.title}}}>{obj.title}</Link>
<Route path="/home/msg" component={detail}> 无需显示的声明接受,正常注册即可
使用:
this.props.location.state 已经整理好成一个对象了

关于浏览痕迹

在react中,组件的导航用的是push模式,是会留下痕迹的,可以回退。如果我们想用replace模式让它不留痕迹呢怎么办呢?给路由链接加上属性replace={true}

编程式路由导航

去主动的调用this.props.history.push(或是replace)来实现路由跳转

去主动的调用this.props.history.goBack或者是goForward来实现后退或前进
this.props.history.go() 接受一个数值作为参数表示要前进几步,传入负数表示后退多少步

withRouter

在react中,只有路由组件的props里才有history,可是如果我们的需求是想在一般组件里定义一些button来实现back和forward呢 ?

暴露一般组件时,
export default withRouter(componentName)
withRouter是react-router-dom里面的一个函数,它接受一个一般组件,然后给它加上路由组件所拥有的特殊的东西

HashRouter和BrowersRouter的对比

1、兼容性,HashRouter更好,应该BrowersRouter是对H5的History的再封装
2、path上HashRouter多一个#
3、HashRouter刷新后路由参数的state会丢失,BrowserRouter却不会,因为它以及操作在了props.location的state里
4、HashRouter有时候可以解决一些路径错误的问题

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

推荐阅读更多精彩内容