react-router 從 v2/v3 to v4 遷移(翻譯)

原文地址

react-router v4 是完全重寫的,所以沒有簡單的遷移方式戈次,這份指南將為您提供一些步驟耸彪,以幫助您了解如何升級應(yīng)用程序。

注意: 這份遷移指南適用于react-router v2和v3栈雳,但為簡潔起見护奈,對以前版本的引用僅提及v3。

The Router

在react-router v3中哥纫,僅有一個<Router> 組件霉旗,需要提供 history 對象作為他的屬性 (prop)。

此外蛀骇,您可以使用 routes 作為 <Router> 的屬性 (prop) 或者作為 children 的方式來定義程序的路由結(jié)構(gòu)厌秒。

// v3
import routes from './routes'
<Router history={browserHistory} routes={routes} />
// or
<Router history={browserHistory}>
  <Route path='/' component={App}>
    // ...
  </Route>
</Router>

使用 react-router v4,一個最大的改變就是可以有很多不同的 router 組件擅憔,每個 router 組件都會為您創(chuàng)造出一個 history 對象鸵闪,<BrowserRouter> 會創(chuàng)建 brower history,<HashRouter> 會創(chuàng)建 hash history暑诸,<MemoryRouter> 會創(chuàng)建 memory history蚌讼。

在v4中,沒有集中的路由配置个榕。任何需要根據(jù)路由渲染內(nèi)容的地方篡石,您只需渲染一個 <Route> 組件。

// v4
<BrowserRouter>
  <div>
    <Route path='/about' component={About} />
    <Route path='/contact' component={Contact} />
  </div>
</BrowserRouter>

有一點需要注意的就是 router 組件只能被賦予一個子元素

// yes
<BrowserRouter>
  <div>
    <Route path='/about' component={About} />
    <Route path='/contact' component={Contact} />
  </div>
</BrowserRouter>

// no
<BrowserRouter>
  <Route path='/about' component={About} />
  <Route path='/contact' component={Contact} />
</BrowserRouter>

Routes

在 v3西采,<Route> 并不是一個組件凰萨,相反,您程序中所有的<Route> 元素僅用于創(chuàng)建路由配置對象。

/// in v3 the element
<Route path='contact' component={Contact} />
// 相當于
{
  path: 'contact',
  component: Contact
}

使用 v4沟蔑,您可以像常規(guī)的 React 程序一樣布局您應(yīng)用中的組件湿诊,您要根據(jù)位置(特別是其 pathname )呈現(xiàn)內(nèi)容的任何位置,您將呈現(xiàn) <Route>

在 v4瘦材,<Route> 其實是一個組件厅须,所以無論你在哪里渲染 <Route>,它里面的內(nèi)容都會被渲染食棕。當 <Route>path 與當前的路徑匹配時朗和,它將會渲染 component, render, or children 屬性中的內(nèi)容,當 <Route>path 與當前的路徑不匹配時簿晓,將會渲染 null

路由嵌套

在 v3 中眶拉,<Route> 組件是作為其父 <Route> 組件的 children 嵌套其中的。

<Route path='parent' component={Parent}>
  <Route path='child' component={Child} />
  <Route path='other' component={Other} />
</Route>

當嵌套的 <Route> 匹配時憔儿,react 元素將會使用子 <Route> 和 父 <Route>component 屬性去構(gòu)建忆植,子元素將作為父元素的 children 屬性。

<Parent {...routeProps}>
  <Child {...routeProps} />
</Parent>

使用 v4谒臼,子 <Route> 應(yīng)該由父 <Route> 呈現(xiàn)朝刊。

<Route path='parent' component={Parent} />

const Parent = () => (
  <div>
    <Route path='child' component={Child} />
    <Route path='other' component={Other} />
  </div>
)

on* 屬性

react-router v3 提供 onEnter, onUpdate, and onLeave 方法。這些方法本質(zhì)上是重寫(覆蓋)了 react 生命周期方法

使用 v4蜈缤,你將會使用生命周期方法 通過 <Route> 渲染的組件拾氓,你可以使用 componentDidMountcomponentWillMount 代替 onEnter,你可以使用 componentDidUpdate 或者 componentWillUpdate (更或者 componentWillReceiveProps) 代替 onUpdate底哥,你可以使用 componentWillUnmount 代替 onLeave咙鞍。

<Switch>

在v3中,您可以指定一些子路由趾徽,并且只會渲染匹配到的第一個续滋。

// v3
<Route path='/' component={App}>
  <IndexRoute component={Home} />
  <Route path='about' component={About} />
  <Route path='contact' component={Contact} />
</Route>

v4 通過 <Switch> 組件提供了相似的功能,當 <Switch> 被渲染時孵奶,它僅會渲染與當前路徑匹配的第一個子 <Route>吃粒。

// v4
const App = () => (
  <Switch>
    <Route exact path='/' component={Home} />
    <Route path='/about' component={About} />
    <Route path='/contact' component={Contact} />
  </Switch>
)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市拒课,隨后出現(xiàn)的幾起案子徐勃,更是在濱河造成了極大的恐慌,老刑警劉巖早像,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件僻肖,死亡現(xiàn)場離奇詭異,居然都是意外死亡卢鹦,警方通過查閱死者的電腦和手機臀脏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門劝堪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人揉稚,你說我怎么就攤上這事秒啦。” “怎么了搀玖?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵余境,是天一觀的道長。 經(jīng)常有香客問我灌诅,道長芳来,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任猜拾,我火速辦了婚禮即舌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘挎袜。我一直安慰自己顽聂,他們只是感情好,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布盯仪。 她就那樣靜靜地躺著紊搪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪磨总。 梳的紋絲不亂的頭發(fā)上嗦明,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天笼沥,我揣著相機與錄音蚪燕,去河邊找鬼。 笑死奔浅,一個胖子當著我的面吹牛馆纳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播汹桦,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼鲁驶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了舞骆?” 一聲冷哼從身側(cè)響起钥弯,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎督禽,沒想到半個月后脆霎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡狈惫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年睛蛛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡忆肾,死狀恐怖荸频,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情客冈,我是刑警寧澤旭从,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站郊酒,受9級特大地震影響遇绞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜燎窘,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一摹闽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧褐健,春花似錦付鹿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谁不,卻和暖如春坐梯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背刹帕。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工吵血, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人偷溺。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓蹋辅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親挫掏。 傳聞我的和親對象是個殘疾皇子侦另,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

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