2017-08-28 37 views
3

我有一個作出反應的應用程序,聲明部分航線:陣營路由器:從來沒有卸載路徑上的組件一旦被安裝,即使路線變化

 <Switch> 
     <Route exact path={'/'} render={this.renderRootRoute} /> 
     <Route exact path={'/lostpassword'} component={LostPassword} /> 
     <AuthenticatedRoute exact path={'/profile'} component={Profile} session={session} redirect={'/'} /> 
     <AuthenticatedRoute path={'/dashboard'} component={Dashboard} session={session} redirect={'/'} /> 
     <AuthenticatedRoute path={'/meeting/:meetingId'} component={MeetingContainer} session={session} redirect={'/'} /> 
     <Route component={NotFound} /> 
    </Switch> 

AuthenticatedRoute是檢查會話啞成分,或者調用<Route component={component} /><Redirect to={to} />,但最後調用component方法)

基本上每個組件都在路由更改時安裝/卸載。我想保留,除了Dashboard路由,它會執行很多操作,而且我希望一旦不在儀表盤上就卸載它(假設您到達會議頁面,您不需要掛載您的儀表板),但是一旦您加載一次儀表板,當您進入個人資料頁面,開會或其他任何事情時,當您返回儀表板時,組件不必再次掛載。

我在React-router doc上看到render或兒童可能是解決方案,而不是組件,但是我們可以將路由與子組件混合嗎?我嘗試了很多東西,從來沒有達到我想要的效果,即使使用renderchildren,我的Dashboard組件仍然是掛載/卸載。

感謝您的幫助

+0

當路由在'Switch'中時,只有第一個匹配的'Route'被渲染,其他的被作爲結果卸載。您應該將儀表板從開關中移出並嘗試.. – hazardous

+0

@hazardous您好!需要一些調整,但它的作品!你想把它作爲一個真正的答案發布,還是應該用適應的代碼回答自己?最好的 – guillaumepotier

+0

你爲什麼要打河?如果您的路線發生變化,那麼不再是您的用戶界面的一部分卸載。 *這就是React的工作原理*,以及它應該如何工作。所以,如果你需要獨立於安裝狀態的數據來持久存儲,只需將其保持在組件外部?你在JS領域,在Dashboard組件之外維護你的Dashboard組件*在一個你需要()的對象中(並且因此緩存對它的引用),並且在'componentWillMount'期間讓你的Dashboard組件引導'根據這些數據。 –

回答

1

Switch組件永遠只能呈現單一路線,最早的比賽的勝利。由於Dashboard組件位於其中,所以只要其他路由匹配,它就會卸載。將此Route移到外面,它將按照預期與renderchildren一起工作。