当前位置:首页 >> 教育
教育

web后部培训React 中Router的必备知识点

2025-12-10 12:19

mponentDidUpdate 分析方法,但不时会被卸载,也就是说,不时会督导 componentDidMount 分析方法。

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。本场赛德布劳内

友情链接