次のシーケンスが発生しています。
メインスクリーン
ロード画面
結果画面
ホームページで、誰かがボタンをクリックすると、私はそれらをロード画面に送ります:
this.$router.Push({path: "/loading"});
そして、タスクが完了すると、それらは結果画面に送信されます。
this.$router.Push({path: "/results/xxxx"});
問題は、通常、結果からメイン画面に戻りたいが、クリックすると再びロードに送られ、結果に戻るため、無限ループに陥ってしまい、アクセスできないメイン画面に戻ります。
これを修正する方法はありますか?私は理想的には次のようなオプションがあったらいいのに:
this.$router.Push({path: "/loading", addToHistory: false});
履歴に追加せずにルートに送ります。
これは、ルーターのbeforeEach
フックを使用して行うことができます。
あなたがする必要があるのは、データがロードされたときに(loading
コンポーネントにリダイレクトする前に)変数をグローバルにまたはlocalStorageのresults
コンポーネントに保存する必要があることです。
export default {
name: "results",
...
importantTask() {
// do the important work...
localStorage.setItem('DATA_LOADED', JSON.stringify(true));
this.$router.Push({path: "/results/xxxx"});
}
}
そして、beforeEachフックでこの変数を確認し、正しいコンポーネントにスキップする必要があります。
// router.js...
router.beforeEach((to, from, next) => {
const dataLoaded = JSON.parse(localStorage.getItem('DATA_LOADED'));
if (to.name === "loading" && dataLoaded)
{
if (from.name === "results")
{
next({ name: "main"} );
}
if (from.name === "main")
{
next({ name: "results"} );
}
}
next();
});
また、クエリボタンがクリックされたとき(main
コンポーネントにルーティングする前に)、loading
コンポーネントの値をfalseにリセットすることを忘れないでください。
export default {
name: "main",
...
queryButtonClicked() {
localStorage.setItem('DATA_LOADED', JSON.stringify(false));
this.$router.Push({path: "/loading"});
}
}
ロード画面は、vue-routerによってまったく制御されるべきではありません。最良のオプションは、javascriptによって制御される、ローディング画面にモーダル/オーバーレイを使用することです。 Vueの周りには多くの例があります。何も見つからない場合は、vue-bootstrapに実装する簡単な例がいくつかあります。