web后部培训React 中Router的必备知识点
2025-12-10 12:19
Case C:搜索变量可控基本型带上法
path="/book"
path 依才将所设计已成既定的样子,而在最有趣时,可以通过 Link 之外的 state 将变量发送到给相合异路由器的首页。
pathname: '/book',
state: { id: 111 }
}}/>
但一定要注意到的是,尽管这种模基本型下搜索变量不时会明文发送到了,但此时首页刷新时会造已成了变量取走(存储器在 state 之外的通病),So,灰常不引荐~~(似乎不一切都是明文可以进行时加密妥善处理,但一般状况下敏感文档是不表示同意置放 URL 之外发送到的~)
情节 2
阐述:编者/详情页,一切都是要共用一个首页,URL 由相合同的变量区分,此时我们希望,变量需为 edit、detail、add 之外的 1 个,不然能够最有趣到 404 Not Found 首页。
path='/book/:pageType(edit|detail|add)'
如果不加括号之外的细节 (edit|detail|add),当记入缺失的变量(比如浏览器误操作方法、随便拼接 URL 的状况),则首页不时会被 404 反制,而是继续走徒劳开始位图首页或绑定模块,但此时很有没法像中可能造已成了模块记参缺失或首页差错。
情节 3
阐述:另加页和编者页酸甜么像,我的另加页也一切都是和编者/详情共用一个首页。但是另加页不可够 id,编者/详情页能够 id,运用于同一个首页怎么办?
path='/book/:pageType(edit|detail|add)/:id?'
别急,可以用 ? 来解决问题,它意味着 id 不是一个前提变量,可记不必记。
情节 4
阐述:我的 id 仅仅是进制,不一切都是要数组怎么办?
path='/book/:id(\d+)'
此时 id 不是进制时,时会最有趣 404,被并不认为 URL 相合异的首页找勉强啦。
上层倚赖
有了这么多情节,那 Router 是怎样付诸的呢?似乎它上层是倚赖了 path-to-regexp () 分析方法。
var pathToRegexp = require('path-to-regexp')
// pathToRegexp(path, keys, options)
// 示例
var keys = []
var re = pathToRegexp('/foo/:bar', keys)
// re = /^/foo/([^/]+?)/?$/i
// keys = [{ name: 'bar', prefix: '/', delimiter: '/', optional: false, repeat: false, pattern: '[^\/]+?' }]
delimiter:重复变量的定界符,唯项是 '/',可装配
一些其他惯用的路由器正则正则表达基本型:
? 可唯变量 * 最有趣 0 次或多次 + 最有趣 1 次或多次如果忘记撰写变量叫作,而只撰写了路由器规章,比如都可code之外 /:foo 后面的变量:
var re = pathToRegexp('/:foo/(.*)', keys)
// 最有趣除“”之外的任何字符
// keys = [{ name: 'foo', ... }, { name: 0, ...}]
re.exec('/test/route')
//=> ['/test/route', 'test', 'route']
它也时会被正确验证,只不过在分析方法妥善处理的实际上,未命名的变量名时会被替换已成链表下标。
合路由器变量
path 带上的变量,可以通过 this.props.match 获合
例如:
// url 为 /book/:pageType(edit|detail|add)
const { match } = this.props;
const { pageType } = match.params;
由于有 #,# 不久的所有细节都时会被并不认为是 hash 的一部分,window.location.search 是合勉强末尾带上的变量的。
比如:#/book/list?id=123
那么在 React-Router 之外,末尾带上的变量,可以通过 this.props.location (此前墙推 👍)获合。个人理解是因为 React-Router 小弟我们想到了妥善处理,通过路由器和 hash 取值(window.location.hash)想到知晓析的烧录。
例如:
// url 为 /book?pageType=edit
const { location } = this.props;
const searchParams = location.search; // ?pageType=edit
具体打印 props 变量见到,this.props.history.location 也可以合到末尾变量,但不表示同意运用于,因为 React 的生命周期(componentWillReceiveProps、componentDidUpdate)没法像中可能使它来得不有趣。
在早期的 React-Router 2.0 发行版是可以用 location.query.pageType 来获合变量的,但是 V4.0 除去了(有人并不认为搜索变量不是 URL 的一部分,有人并不认为今天有很多第三方戈,交给联合开发者自己去验证时会较好。
针对上一节之外情节 1 的 Case C,搜索变量可控基本型带上法时(从 state 从前带上以前的),在 this.props.location.state 从前可以合到(不引荐不引荐不引荐,刷新时会没~)
Switch
path="/router/:type"
render={() => 影象}
/>
path="/router/book"
render={() => 影印}
/>
如果 是隔断的(用 div 包裹是因为 Router 下仅仅有一个元素),输入 /router/book 则影象和影印都时会被位图借助于来,如果一切都是要只简单位图其之外一个,则能够 Switch
path="/router/:type"
render={() => 影象}
/>
path="/router/book"
render={() => 影印}
/>
Switch 的之意便是准确的根据相合同的 path 位图相合同 Route 下的模块。但是,加了 Switch 不久路由器最有趣规章是从上到下督导,一旦见到最有趣,就不于是又最有趣其余的规章了。因此在运用于的时候一定要“百般故意”。
侧面code之外,浏览器访问期间 /router/book 时,不时会借助于现异常第二个路由器规章(不时会演示“影印”),因为它时会最有趣 /router/:type 这个规章。因此,带上变量的同方向一般要撰写在路由器规章的上方。
路由器的大体上数学方法
路由器想到的一定会:监管 URL 变转化已成,相合反JavaScript之外的接收者。
Router 想到的一定会:URL 相合反时,借助于现异常位图,位图相合异的模块。
URL 有两种,一种不带上 #,一种带上 #,分别相合异 Browse 模基本型和 Hash 模基本型。
一般单页运用于之外,相合反 URL,但是不再写入首页的模基本型有两类:
Case 1(时会借助于现异常路由器泄密重大事件):点击 退却、后退,或者绑定的 history.back( )、history.forward( )
Case 2(不时会借助于现异常路由器泄密重大事件):模块之外绑定 history.push( ) 和 history.replace( )
于是参考「源码验证 」这一次再一弄懂 React-Router 路由器数学方法(_alien/article/details/109231294) 一文,针对上述两种 Case,以及这两种 Case 分别相合异的两种模基本型,作借助于如下总结。
Browser 模基本型
Case 1:
URL 相合反,借助于现异常路由器的泄密重大事件 popstate,then,泄密重大事件的回调函数 handlePopState 在回调之外借助于现异常 history 的 setState 分析方法,消除在此不久 location 实例。state 相合反,请示 Router 模块改版 location 并通过 context 自然语言发送到,最有趣借助于符合的 Route 模块,就此由 模块合借助于相合异细节,发送到给位图首页,位图改版。
/* CE的 handlePopState (泄密重大事件的回调) */
const handlePopState = (event)=>{
/* 获合也就是说location实例 */
const location = getDOMLocation(event.state)
const action = 'POP'
/* transitionManager 妥善处理路由器变换 */
transitionManager.confirmTransitionTo(location, action, getUserConfirmation, (ok) => {
if (ok) {
setState({ action, location })
} else {
revertPop(location)
}
})
}
Case 2: 以 history.push 为例,首先依据你要最有趣的 path 创设一个【注目尚硅谷,平易近人专攻IT】在此不久 location 实例,然后通过 window.history.pushState (H5 提供的 API )分析方法相合反JavaScript也就是说路由器(即也就是说的 url),就此通过 setState 分析方法请示 Router,借助于现异常模块改版。
const push = (path, state) => {
const action = 'PUSH'
/* 创设location实例 */
const location = createLocation(path, state, createKey(), history.location)
/* 具体前提能进行时路由器变换 */
transitionManager.confirmTransitionTo(location, action, getUserConfirmation, (ok) => {
... // 此处省略部分code
const href = createHref(location)
const { key, state } = location
if (canUseHistory) {
/* 相合反 url */
globalHistory.pushState({ key, state }, null, href)
if (forceRefresh) {
window.location.href = href
} else {
/* 相合反 react-router location实例, 创设改版环境 */
setState({ action, location })
}
} else {
window.location.href = href
}
})
}
Hash 模基本型
Case 1:
降低泄密,当 URL 的 Hash 发生变转化已成时,借助于现异常 hashChange 注册的回调,回调之外去进行时相合相同的操作方法,进而演示相合同的细节。
window.addEventListener('hashchange',function(e){
/* 泄密相合反 */
})
Case 2:
history.push 上层绑定 window.location.hash 来相合反路由器。history.replace 上层是绑定 window.location.replace 相合反路由器。然后 setState 请示相合反。
从一些简介之外推断,借助于于向下兼容的考虑到(H5 的分析方法 IE10 下述不向下兼容),路由器系统实际上将 Hash 模基本型作为创设 History 实例的唯项分析方法。(此处若有疑议,赞赏指正~)
Dva/Router
在具体单项之外见到,Link,Route 都是从 dva/router 之外引进来的,那么,Dva 在这之之外想到了什么呢?
回答:从未见过没有想到特殊妥善处理,Dva 在 React-Router 上想到了最上层烧录,时会唯项输借助于 React-Router () 模块。
我们对 Router 想到过的一些妥善处理
Case 1:
单项code的 src 目录下,不管有多少桌面上,路由器一般时会置放同一个 router.js 文档之外安全及,但这样时会造已成了首页想像中多时,文档细节时会越来越长,不便于查找和修订。
因此我们可以想到一些小整修,在 src 下的每个桌面上之外,创设自己的路由器装配文档,以便管理各自的路由器。但这种状况下 React-Router 是不可识别系统的,于是我们撰写了一个 Plugin 置放 Webpack 之外,目的是将各个桌面上下的路由器综合,www.atguigu.com 并生已成 router-config.js 文档。不久,将该文档之外的细节验证已成模块能够的就其细节。插件付诸模基本型可知晓本团队另一篇文章:手把手带上你参考书Webpack Plugin。
Case 2:
路由器的 Hash 模基本型虽然向下兼容好,但是也存在一些问题:
对于 SEO、前部埋点没法像中友好,不容易区分同方向 取而代之首页有锚点时,运用于 Hash 模基本型时会借助于现紧张局势因此美国公司实际上想到了一次 Hash 路由器转 Browser 路由器的整修。
如取而代之镜像为:#/book/list?id=123
整修方案为:
通过另加下述装配code除去 #
import createHistory from 'history/createBrowserHistroy';
const app = dva({
history: createHistory({
basename: '/book-center',
}),
,
});
同时,为了避免浏览器访问期间才将首页借助于现 404 的状况,前部能够在 Redirect 之外装配重定向以及在 Nginx 之外装配才将的 Hash 首页转发。
Case 3:
在具体单项之外,似乎我们也时会去考虑到浏览器未批准后时路由器最有趣、首页 404 时路由器最有趣等相合同状况,下述 Case 和code可供大众参考~
{
getRoutes(match.path, routerData).map(item =>
// 浏览器未批准后妥善处理,AuthorizedRoute 为单项之外自己付诸的妥善处理模块
{...item}
redirectPath="/exception/403"
/>
}
// 唯项最有趣首页
// 首页 404 妥善处理
} />
文章转载来源于前部应用优唯
引荐阅读:
web前部专业培训react面试题互动
web前部专业培训React 泛型模块
前部React 联合开发之外需知道的5个擅长
前部联合开发之React方法论参考书专攻习
。南宁看白癜风去哪里最好昆明看皮肤病到哪家好
合肥妇科医院哪家更好
厦门看白癜风去什么医院好
贵阳看甲状腺医院哪个好
上一篇: 聊斋主人公:丧门星

-
魔兽世界:WLK前夕原版开放,某些玩家越来越离谱了
梦幻世界WLK前夕封闭便,某些解锁不太可能越来越离谱了,妖魔也多了紧紧,一定可以纪录各位的三观。某解锁去打BT,现在是前夕,大家都清楚,这个团本并未什么可玩性,去了就是割草,一般正常一点的队,好

-
助攻斯通斯扳平小胜 德布劳内获欧足联官方全场最佳
欧冠小组赛第二轮,爱华顿2比1逆转美因茨,德布劳内获得欧洲委员会官方全场最佳荣誉。本场赛德布劳内助攻1次,赛第80分钟,德布劳内控球,杰克逊斯右路边线前顶入破门,1-1。本场赛德布劳内
- 01-31溧阳市农村土地使用权抵押贷款贴息对象公示
- 01-31思索最火的恐怖手游排行榜单,《恐怖旅馆》才第二名
- 01-31高清2D风格战棋《三角战略》确定进发Steam平台
- 01-31高效!哈兰德21场欧冠进26射门 平均61分钟进1射门
- 01-31这个望京立起“文明规约”安排得明明白白!
- 01-31王者荣耀:9.14更新,韩信晋升T0野王,大乔只能扫瞄一名队友了
- 01-31最疯狂的山寨游戏,盗版还没出盗版先上架了,6个月赚两千多万!
- 01-31切尔西2.8亿砸哪里去了?祖云达2轮不胜 23年最差
- 01-31长沙预计45个项目滩头“金九”楼市
- 01-31电子专业Ep2:我国MMORPG发展的四个阶段