私は新しいVueアプリをベースパスで作成しました。アプリが別のVueアプリに埋め込まれているため、このアプリはrouter-view
起動時。このアプリが別のアプリに組み込まれる方法や理由について詳しく知りたい場合は、こちらをご覧ください。
mount Vueアプリをメインのコンテナに入れるVue app
そして、この問題に対する私自身の答え:
https://stackoverflow.com/a/58265830/994542
アプリケーションを起動すると、router-view
以外のすべてがレンダリングされます。起動時に指定のブラウザURLでリダイレクトしたい。これは私のルーター構成です:
import Vue from 'vue';
import Router from 'vue-router';
import One from './views/One.vue';
import Two from './views/Two.vue';
Vue.use(Router);
const router = new Router({
base: '/my-embedded-app/',
mode: 'history',
routes: [
{
path: '/',
component: One,
},
{
path: '/two',
component: Two,
},
],
});
router.replace(router.currentRoute.fullPath);
export default router;
.../my-embedded-app/two
を呼び出すときに、アプリでコンポーネントTwoをレンダリングする必要があります。残念ながら、router.replace
は常に/
にリダイレクトします(そのため、ブラウザーのURLは.../my-embedded-app/
です)。私はrouter
をデバッグし、パスが/
であることを確認しましたが、/two
であると予期しました。
重要な注意:URLが/two
の場合は常にユーザーを/
にリダイレクトしたくありません。 URLが/two
のときに、ビューTwo
をレンダリングしたいだけです。現在はありません。
何が悪いのでしょうか?多分私はそのリダイレクトさえ必要とせず、よりエレガントな方法で問題を解決できます。
これは通常の動作であり、単一ページアプリケーションの動作方法です。 「#」記号のような「ポンド」は、リンクがアプリケーションを別のページに移動しないことを意味します。
ルーターモードを次のように変更できます
mode:"hash"
beforeEnter
をお試しください。以下のコードを見てください:
const router = new Router({
base: "/my-embedded-app/",
mode: "history",
routes: [
{
path: "/",
component: One,
beforeEnter: (to, from, next) => {
// Your are free to add whatever logic here.
// On first visit
next("/two");
}
},
{
path: "/two",
component: Two
}
]
});
ナビゲーションガードの詳細 こちら
実際にテストするためにgithubリポジトリまたはいくつかを提供できますか?
それ以外の場合、私の最初のアイデアは、ベースとして「空の」ビューを持つ子ルートを使用することです。ここでは、私が試したものの例を示します。 (私の場合は働いています)
router.js
export default new Router({
mode: 'history',
base: '/my-embedded-app/',
routes: [
{
path: '/',
name: 'base',
component: Base,
children: [
{
path: '',
name: 'one',
component: One
},
{
path: 'two',
name: 'two',
component: Two
}
]
}
]
})
Base.vue
<template>
<router-view/>
</template>
One.vue
<template>
<div>One</div>
</template>
Two.vue
<template>
<div>Two</div>
</template>
更新: jsfiddle
何が起こっているのかということですroute.currentRoute.fullPath
は、ルーターの準備が整う前に実行されました。