使用的合適的方式做路由跳轉(zhuǎn)

情景描述

  • 項(xiàng)目中使用react-router和react-router-redux這兩種第三方的路由庫
  • 其中包含了很多可以改變路由的方式方式:browserHistory.push、link to()、a潮秘、window.location.href仪际、react-router-redux中的push方法
    • 使用react-router改變路由
      • link to
      • browserhistory.push
    • 使用react-router-redux改變路由
      • push方法(react-router-redux)
    • 使用html標(biāo)簽
      • a
    • 使用window對象的屬性:history和location
      • history.push
      • location.href
  • 這些不同的改變路由的方式有什么區(qū)別呢灼卢?
    • 原理
    • 結(jié)果

使用history 和 location (window屬性)做路由跳轉(zhuǎn)

history

  • 每個(gè)瀏覽器窗口瑰谜,每個(gè)Tab酵镜,每個(gè)iframe都一個(gè)history對象
  • history記錄了從窗口打開開始的所有瀏覽歷史
  • 其中包含了go希坚、back、forward等方法
特點(diǎn)
  • 雖然也可以改變路由狱窘,但是跳轉(zhuǎn)的新路由只可能實(shí)在history對象存儲過得路由
  • 不能通過直接給定新的url方式進(jìn)行跳轉(zhuǎn)
  • 使用history對象永遠(yuǎn)都不可能知道準(zhǔn)確的url

location

  • 提供了當(dāng)前窗口中加載的文檔的location相關(guān)信息杜顺,還提供了一些導(dǎo)航功能
    • 很多屬性不僅可以作為可讀信息,也可以被新的值覆蓋(因此可以做到查閱和設(shè)置)
  • 對象中有很多的方法可以實(shí)現(xiàn)路由的修改
    • location.assign(新的url) === window.loaction.href = 新的url (使用新的url完全的覆蓋舊的url蘸炸,并且在history對象中生成一個(gè)新的url歷史)
    • location.replace(新的url) 和上面的方法作用一直但是特點(diǎn)是不會生成新的history而是直接覆蓋當(dāng)前的history

兩個(gè)對象在修改路由上的區(qū)別

  • history只能將路由改成曾經(jīng)訪問過得路由()
  • location可以導(dǎo)航到任何新的想去的路由
總結(jié): history對象只包含出棧的api甚至不能訪問棧中最后一條歷史記錄的詳情躬络,location只能入棧或者replace瀏覽記錄和查看最后一條歷史記錄的詳情

缺點(diǎn)

  • 每次路由的跳轉(zhuǎn)都會導(dǎo)致頁面刷新(視覺上會出現(xiàn)閃現(xiàn)的效果)

使用react-router做路由跳轉(zhuǎn)

  • 使用link to做路由跳轉(zhuǎn)

    • 特點(diǎn):使用diff算法搭儒,將變化的組件進(jìn)行重新掛載穷当,沒有變化的組件只會調(diào)用其render方法提茁。最大限度的提高效率
      • 和標(biāo)簽a的區(qū)別在于:a會導(dǎo)致頁面全部刷新,重新請求頁面資源(或者重新從緩存中取出頁面資源)馁菜,視覺上會出現(xiàn)一個(gè)閃現(xiàn)的效果茴扁。簡而言之:頁面上所有的組件都會重新的掛載。
  • 使用browserHistory.push做路由跳轉(zhuǎn)

    • 原理和linkto完全一致汪疮,都是用diff算法做跳轉(zhuǎn)
  • 使用this.props.router.push
    • 原理和linkto完全一致峭火,都是用diff算法做跳轉(zhuǎn)
    • 補(bǔ)充:
      • 1.使用react-router相當(dāng)于每一個(gè)Route都是一個(gè)組件,而對應(yīng)的component都是這個(gè)Router的子組件
      • 2.因此Route作為父組件會給子組件傳遞很多的數(shù)據(jù)
        • location對象
        • params對象
        • children
        • route:當(dāng)前路由的路徑和組件內(nèi)容
        • router:其中包含很多瀏覽器的方法

總結(jié)上面三個(gè)方式原理和結(jié)果都一致智嚷,唯一區(qū)別

  • linkto:在組件級別進(jìn)行跳轉(zhuǎn)
  • browserHistory模仿瀏覽器的history對象的行為卖丸,但是api來自于react-router
  • this.props.router.push:api來自父Route類

特點(diǎn)

  • 路由的跳轉(zhuǎn)不會導(dǎo)致閃現(xiàn),使用diff算法對于新路由中還會存在的組件只調(diào)用組件的render方法盏道,對于新路由中不會存在的組件會銷毀然后重新掛載新路由中的組件

解惑項(xiàng)目中使用react-router

  • Q1:項(xiàng)目中使用browserhistory進(jìn)行路由跳轉(zhuǎn)稍浆,沒有閃現(xiàn)。

  • A1:因?yàn)樽钔鈱咏M件中是App摇天,其中包含了Header和Footer粹湃,內(nèi)容是this.props.children,因此不論路由怎樣修改泉坐,這個(gè)App都在,每次之后調(diào)用App的render方法不會將其銷毀

  • Q2:每次使用browserHistory.push會調(diào)用組件的那些生命周期方法呢裳仆?

  • A2:關(guān)系到路由跳轉(zhuǎn)的組件會被分成三種

    • 在新老路由中的都會存在的組件(比如App):render被調(diào)用
    • 只在老路由中存在的組件:ComponentWillUnmount會被調(diào)用腕让,也就說會被銷毀
    • 只在新路由中存在的組件:會被重新掛載(執(zhí)行一套掛載的方法)
  • Q3:為什么選擇使用react-router作為react路由控制的庫呢?

  • A3:原理和React相似歧斟,react是屬性改變引起組件的render ui重新渲染纯丸。而react-router中l(wèi)ocation的改變引起Route組件的render然后ui重新渲染

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市静袖,隨后出現(xiàn)的幾起案子觉鼻,更是在濱河造成了極大的恐慌,老刑警劉巖队橙,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坠陈,死亡現(xiàn)場離奇詭異,居然都是意外死亡捐康,警方通過查閱死者的電腦和手機(jī)仇矾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來解总,“玉大人贮匕,你說我怎么就攤上這事』ǚ悖” “怎么了刻盐?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵掏膏,是天一觀的道長。 經(jīng)常有香客問我敦锌,道長壤追,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任供屉,我火速辦了婚禮行冰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘伶丐。我一直安慰自己悼做,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布哗魂。 她就那樣靜靜地躺著肛走,像睡著了一般。 火紅的嫁衣襯著肌膚如雪录别。 梳的紋絲不亂的頭發(fā)上朽色,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機(jī)與錄音组题,去河邊找鬼葫男。 笑死,一個(gè)胖子當(dāng)著我的面吹牛崔列,可吹牛的內(nèi)容都是我干的梢褐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼赵讯,長吁一口氣:“原來是場噩夢啊……” “哼盈咳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起边翼,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤鱼响,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后组底,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丈积,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年斤寇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了桶癣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡娘锁,死狀恐怖牙寞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤间雀,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布悔详,位于F島的核電站,受9級特大地震影響惹挟,放射性物質(zhì)發(fā)生泄漏茄螃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一连锯、第九天 我趴在偏房一處隱蔽的房頂上張望归苍。 院中可真熱鬧,春花似錦运怖、人聲如沸拼弃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吻氧。三九已至,卻和暖如春咏连,著一層夾襖步出監(jiān)牢的瞬間盯孙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工祟滴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留振惰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓踱启,卻偏偏與公主長得像报账,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子埠偿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容