2017-04-01 16 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にあるように見えますが、それは文書化されておらず、混乱しているようにも見えません)。

もう1つの方法は上記のロジックを使用することですが、リダイレクトしましたが、正しいコンポーネントをターゲットとした動的/新規ルートを作成する方法がないことがわかりました。

ビルド時に知られていない目的地までのルートを作成するにはどうすればよいですか?

+0

もっと冒険:私は私が '.beforeEach'ルート内のAJAX要求を行うことについては慎重になるルート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()を実装してコミット示して見つけました。

注意すべき点の1つは、新しいルートが最後に追加される(意味がある)ので、存在するワイルドカードが意図しない一致を作成する可能性があることです。私はデフォルトのページにリダイレクトされたキャッチオールルートを用意していました。しかし、これは新しく追加された試合の前にマッチしました。スタックオーバーフローが発生しました。実際にはif (to.matched.length === 0)の後のコードがデフォルトルートです。

+2

を追加することが可能であることがわかりましたガード。これはあなたのアプリを遅くする(またはそれが遅く感じることができる)。 小さな改良点は、if文を追加してから 'get_data_from_server'を呼び出すことです。この方法では、ルートがまだ追加されていない場合にのみデータを取得します。 – Maurice

+0

公正なコメント - 宛先ページのコンテンツは、残念ながら、サーバーベースのコード管理システムで定義されています。したがって、ターゲットコンポーネントは、ルートが追加されたかどうかに関係なく、そのページのデータを必要とします。しかし、あなたの提案の行に沿って、正しいデータが既に存在するときに、コードが重複した '.beforeEach()'呼び出しを防ぐことをぼかしました。 – bmacnaughton

+0

私はある時点でキャッシュを追加して、あなたの提案ごとにコードを再構成することができます。 – bmacnaughton