Switch
為了解決
route
的唯一渲染吓揪,它是為了保證路由只渲染一個(gè)路徑。
如果配置了<Switch>
<Router history={history}>
<Switch>
<Route path='/home' render={()=>(<div>首頁(yè)</div>)}/>
<Route path='/home' component={()=>(<div>首頁(yè)</div>)}/>
</Switch>
</Router>
如果沒(méi)有配置<Switch>
<Router history={history}>
<Route path='/home' render={()=>(<div>首頁(yè)</div>)}/>
<Route path='/home' render={()=>(<div>首頁(yè)</div>)}/>
</Router>
<Switch>
是唯一的所计,因?yàn)樗鼉H僅只會(huì)渲染一個(gè)路徑柠辞,當(dāng)它匹配完一個(gè)路徑后,就會(huì)停止渲染了主胧。相比之下(不使用<Switch>
包裹的情況下)叭首,每一個(gè)被location
匹配到的<Route>
將都會(huì)被渲染。
exact
只有頁(yè)面的路由和
<Route>
的path
屬性精確比對(duì)后完全相同該<Route>
才會(huì)被渲染踪栋。
這里想實(shí)現(xiàn)一個(gè)功能焙格,項(xiàng)目剛進(jìn)來(lái)的時(shí)候,路由默認(rèn)為/
夷都,這時(shí)候默認(rèn)進(jìn)頁(yè)面路由一眷唉,如果頁(yè)面改成其他的,跳轉(zhuǎn)其他頁(yè)面囤官。
<Router history={history}>
<Switch>
<Route path='/' render={()=>(<div>頁(yè)面一</div>)}/>
<Route path='/home' component={()=>(<div>頁(yè)面二</div>)}/>
</Switch>
</Router>
會(huì)發(fā)現(xiàn)不管路由怎么切換冬阳,始終渲染的都是path
為/
的頁(yè)面,這是因?yàn)?code>/匹配所有頁(yè)面党饮,所以不管路由怎么切換肝陪,始終渲染頁(yè)面一。針對(duì)以上問(wèn)題劫谅,我們可以采取調(diào)整順序的解決辦法见坑,就是將path
為/
的路由放到最后嚷掠,因?yàn)?code>Switch的特性捏检,只要頁(yè)面匹配完一個(gè)路徑荞驴,它就停止渲染。
<Router history={history}>
<Switch>
<Route path='/home' component={()=>(<div>頁(yè)面二</div>)}/>
<Route path='/' render={()=>(<div>頁(yè)面一</div>)}/>
</Switch>
</Router>
當(dāng)然贯城,這樣可以解決辦法熊楼,但是如果每次書(shū)寫(xiě)路由的話都需要嚴(yán)格控制書(shū)寫(xiě)路由順序的話那代碼真的很不優(yōu)雅,那有沒(méi)有好的解決辦法呢能犯?那肯定必須是有的鲫骗,官方給我們提供了exact
,就是精準(zhǔn)匹配踩晶。
<Router history={history}>
<Switch>
<Route path='/' exact render={()=>(<div>頁(yè)面一</div>)}/>
<Route path='/home' component={()=>(<div>頁(yè)面二</div>)}/>
</Switch>
</Router>