前回までの記事はこちら↓
グローバルビフォーガード
全てのページ遷移前に特定の処理を施すことが可能。
main.jsでimportしたrouter.jsに.beforeEachを使って、実装を行う。
router.beforeEach(() => { })
.beforeEach には3つの引数を取ることができる。
router.beforeEach((to,from,next) => { })
to,fromは、現在の$routeの状態を表すルートオブジェクト。
.beforeEachは、最後に必ずnext関数を記載する必要がある。記載しないと、次に進まず真っ白い画面のままになってしまう。
router.beforeEach((to,from,next) => { next(); })
特定のページ遷移前にナビゲーションガードを加える
特定のページ遷移前にナビゲーションガードをつける場合は、router.jsの各pathにbeforeEnterを使って記載していく。
グローバルでは、beforeEachだったが、今回はbeforeEnterなので注意。
beforeEnter(to,from,next){ next(false); }
beforeEachと同様に引数を取ることができる。
pathを含んだコードはこちら↓
routes: [ { path: '/home', components: { default: Home, header: HeaderHome }, beforeEnter(to,from,next){ next(false); } }]
コンポーネントにナビゲーションガードを加える
ルートコンポーネントに付けることができる。
※routerに設定されて動かされるコンポーネント
コンポーネントに付けることができるナビゲーションガードは3種類ある。
beforeRouteEnter(to, from, next) { next(); }, beforeRouteUpdate(to, from, next) { next(); }, beforeRouteLeave(to, from, next) { next(); }
beforeRouteEnter…コンポーネントが表示される時に実行される。
beforeRouteUpdate…ルートが変わった時に実行される。※例えば、/home/1から/home/2に変わった時
beforeRouteLeave…コンポーネントのルートから離れた時に実行される。
コンポーネントの読み込みを遅らせる
コンポーネントが膨大になった場合、アクセス時のページ読み込みがかなり遅くなる。(一気にすべてローディングを行うため)
これを回避するために、ローディングの読み込みを遅らせることができる。
コンポーネントの読み込みを行っているwebpackに、必要な時に読み込みがされるように命令をかく。
const Home = () => import("./views/Home.vue");
networkのnameが自動連番されてしまう。命名したい時は、コメントを追記する。
/* webpackChunkName:“Home” */
const Home = () => import(/* webpackChunkName:"Home" */"./views/Home.vue");
Vue CLI3は、prefetchが走るため、responseが暇な時に必要そうなパーツを読み込んで、キャッシュで持っておく仕組みがある。