2017-04-01 64 views
3

我正在嘗試動態設置vue-router路由的目標組件。如何在Vue路由器中動態設置目標組件

原因是我需要從服務器檢索數據以瞭解要定位的正確組件。

一個解決方案,我想過是添加類似於全局後衛:

router.beforeEach((to, from, next) => { 
    get_data_from_server(to.fullPath).then(() => { 
    // set the "to" component, but how? 
    next(); 
}) 

但是,正如評論說,我將如何設置「組件」 - 有中沒有組件屬性的「到」目的。 (它看起來像是在components.default.render中,但沒有記錄,看起來也不應該混淆)。

另一種選擇是使用上面的邏輯,但添加了特殊情況代碼重定向,但後來我發現沒有辦法創建針對正確組件的動態/新路由。

應該如何創建到構建時未知的目標的路由?

+0

更多的冒險:我發現這是可以添加的路由https://github.com/vuejs/vue-router/commit/0e0fac91ab9809254174d95c14592e8dc2e84d33 – bmacnaughton

回答

1

此解決方案似乎工作。

router.beforeEach((to, from, next) => { 
    get_data_from_server(to.fullPath).then(component => { 
    if (to.matched.length === 0) { 
     // the target route doesn't exist yet 
     router.addRoutes({path: to.path, component: component}) 
     next(to.fullPath) 
     return 
    } else { 
     // the route and component are known and data is available 
     next() 
    } 
}) 

的關鍵是發現,在上面我的評論鏈接顯示VUE路由器致力於實現addRoutes()

有一點需要注意的是,新的路線被添加到最後(有意義),所以任何出現的通配符都可能會產生意想不到的匹配。我有一個重定向到默認頁面的流暢路由。但是在新增加的比賽之前匹配,因爲它早於列表。這導致了堆棧溢出。實際上,if (to.matched.length === 0)之後的代碼是默認路由。

+2

我是持謹慎態度的'.beforeEach'路線內的AJAX請求守衛。這可能會減慢你的應用程序(或使其感覺緩慢)。 一個小的改進是在調用get_data_from_server之前添加if語句。這樣,如果路由尚未添加,您只能獲取數據。 – Maurice

+0

公平評論 - 不幸的是,目標頁面的內容在基於服務器的代碼管理系統中定義。所以目標組件需要來自該頁面的數據是否添加了路由。但是,根據您的建議,我暗示說,當正確的數據已經存在時,代碼將阻止重複的.beforeEach()調用。 – bmacnaughton

+0

我可以在某些時候添加緩存,在這種情況下,根據您的建議重新構建代碼是有意義的。 – bmacnaughton