🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

1回答

1107閲覧

ナビゲーションガードでのページ遷移制御(beforeEach)

sanezane

総合スコア91

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

0クリップ

投稿2019/11/26 05:16

ナビゲーションガードでのページ遷移制御(beforeEach)

やりたいこと

  • URLの直叩きによる画面遷移を権限によって制御する

実装(ナビゲーションガード以外の部分)

  • default.vueには独自のコンポーネントを設置しており、menuというプロパティにメニューと遷移先のデータをバインドすることでメニューを表示している。

default

1 2<template> 3 <cas-default-template 4 id="sideNav" 5 title="タイトル" 6 :page-title="title" 7 :sub-title="subTitle" 8 :menus="availableMenus" //computedで権限に対するメニューを作成している 9 :router="true" 10 @click.native="check" 11 > 12 <nuxt /> 13 </cas-default-template> 14</template> 15 16<script lang="ts"> 17//import等は省略 18created() { 19 this.$store.dispatch('menu/security').then(() => { 20 //ログインユーザの権限情報取得 21 const response: SecurityInfo = this.security 22 }) 23 /**権限情報に基づきメニューを生成 */ 24 this.getAvailableMenus() 25 } 26 27/**取得した権限情報をもとにメニューを構成 */ 28 getAvailableMenus() { 29 for (let i = 0; i < this.menus.length; i++) { 30 if (this.menus[i].disabled) { 31 this.availableMenus.push(this.menus[i]) 32 for (let j = 0; j < this.menus[i].subs.length; j++) { 33 if (this.menus[i].subs[j].disabled) { 34 this.menus[i].subs[j].disabled = false 35 } 36 } 37 } 38 } 39 } 40</script> 41

ナビゲーションガードの実装

  • pluginsにファイルを作成してます(middlewareの方が適切?)

router

1import Vue from 'vue' 2import Router from 'vue-router' 3 4Vue.use(Router) 5 6export default async ({ app, store }) => { 7 8 await store.dispatch('menu/security') 9 let kngnInfo 10 app.router.beforeEach((to, from) => { 11 //ログインユーザの権限情報を取得 12 const security = store.getters['menu/security'] 13 //URLとそれに対する権限のオブジェクトを用意 14 const menus = [ 15 { kngn: 'kngnAAA', url: '/AAA' }, 16 { kngn: 'kngnBBB', url: '/BBB' }, 17 { kngn: 'kngnCCC', url: '/CCC' }, 18 { kngn: 'kngnDDD', url: '/DDD' }, 19 ] 20 //遷移先URLの権限を持っているかを確認 21 const toKngn = menus.find(menu => { 22 return menu.url === to.path 23 }) 24 //権限がない場合は遷移前画面へリダイレクト 25 if (!security[toKngn.kngn]) { 26 kngnInfo = security[toKngn.kngn] 27 next(from.path) 28 } 29 next() 30 }) 31}
  • 現状以下のようにThis page could not be foundが発生しています。

イメージ説明【Vue.js】ナビゲーションガードについてなどを見て`afterEachを使ってみたりしましたが、afterなので権限がなくても一瞬遷移してしまいます。

  • 助言をいただければ幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

公式のこのissueと同じような状況でしょうか。
About the error "This page could not be found" in the next() in router.beforeEach()

この回答によるとmiddlewareによる解決が推奨されているようです。

投稿2019/11/26 08:13

nt4c

総合スコア768

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問