vue動的に追加されたルートページの更新時に失効する原因と解決策
問題の説明
昨日、vueバックグランド管理システムの権限ページをルーティングの機能に動的に追加すると、問題が発生しました。動的に追加されたルートページは、ページリフレッシュ時に404の状況が発生しました。
シーン
バックグラウンド管理システムの権限制御は、フロントエンドページで権限コードを定義することにより、コードをバックグラウンドの学生に保存してテーブルに配置し、バックグラウンドから戻ってきた権限コードリストとフロントページに配置されたコードメニューリストをフィルタリングしてマッチングします。コードが等しいページは、権限があるページです。また、router.addRoute()を通じて経路に動的に追加されます。アクセスできるルートがあります。そうでなければ、権限がないことをヒントにします。
固定ルートは最初からnew Routerにおいて登録ページのloginなどです。
インターフェース
フロントエンドメニュー定義
vuexの中の方法
発生した問題
ログイン後、vuexのメソッドを呼び出して、アクセス権限コードを取得し、動的にフィルタ権限を持つルーティングページの操作を完了した後、router.addRoute()を介して、権限メニューをルートに追加し、動的に追加されたルートページに進み、ページを更新する404。
原因分析
ページ更新時に、ルーティングが再初期化され、動的に追加されたルーティングはこの時点では存在しなくなり、一部の固定ルート(例えば登録ページ)がまだ残っているため、404の状況が発生した。
ソリューション
VUEX storeに保存されているデータはページ更新時に空になります。
ルートのグローバルナビゲーションrouter.beforeEachで判断して、VUEXに保存されているリストの値によってページが更新されているかどうかを判断します。0でないと初めて登録して、登録後にルートに合う方法があります。問題がないです。list.lengthが0であれば、ページを更新するために、ルーティング・マッチングを再実行し、ダイナミック・ルーティングを新たに追加すれば良い。
コードroute/index.jsのナビゲーションガードに論理判定を追加することを実現します。
――router.js――――――――
主にグローバルナビゲーションでVUEX中のデータが存在するかどうかを判断して、ページが更新されているかを判断します。そうであれば、もう一度アクセス権のルートマッチングを行う方法です。
以上がVue動的に追加されたルートページの更新時に失効した原因と解決策の詳細です。Vueルートページの更新に関する資料は他の関連記事に注目してください。
昨日、vueバックグランド管理システムの権限ページをルーティングの機能に動的に追加すると、問題が発生しました。動的に追加されたルートページは、ページリフレッシュ時に404の状況が発生しました。
シーン
バックグラウンド管理システムの権限制御は、フロントエンドページで権限コードを定義することにより、コードをバックグラウンドの学生に保存してテーブルに配置し、バックグラウンドから戻ってきた権限コードリストとフロントページに配置されたコードメニューリストをフィルタリングしてマッチングします。コードが等しいページは、権限があるページです。また、router.addRoute()を通じて経路に動的に追加されます。アクセスできるルートがあります。そうでなければ、権限がないことをヒントにします。
固定ルートは最初からnew Routerにおいて登録ページのloginなどです。
インターフェース
フロントエンドメニュー定義
vuexの中の方法
発生した問題
ログイン後、vuexのメソッドを呼び出して、アクセス権限コードを取得し、動的にフィルタ権限を持つルーティングページの操作を完了した後、router.addRoute()を介して、権限メニューをルートに追加し、動的に追加されたルートページに進み、ページを更新する404。
原因分析
ページ更新時に、ルーティングが再初期化され、動的に追加されたルーティングはこの時点では存在しなくなり、一部の固定ルート(例えば登録ページ)がまだ残っているため、404の状況が発生した。
ソリューション
VUEX storeに保存されているデータはページ更新時に空になります。
ルートのグローバルナビゲーションrouter.beforeEachで判断して、VUEXに保存されているリストの値によってページが更新されているかどうかを判断します。0でないと初めて登録して、登録後にルートに合う方法があります。問題がないです。list.lengthが0であれば、ページを更新するために、ルーティング・マッチングを再実行し、ダイナミック・ルーティングを新たに追加すれば良い。
コードroute/index.jsのナビゲーションガードに論理判定を追加することを実現します。
――router.js――――――――
const constantRoutes = [
{
path: '/',
redirect: '/login'
},
{
path: '/login',
name: 'login',
meta: {
auth: false
},
component: () => import('@/views/login')
},
{
path: '/layout',
name: 'layout',
meta: {
auth: true
},
component: () => import('@/views/layout/index'),
children: [
{
path: '/index',
name: 'index',
component: () => import('@/views/home')
}
]
},
{
path: '*',
component: () => import('@/views/error/404')
}
]
Vue.use(VueRouter)
const createRouter = () =>
new VueRouter({
routes: constantRoutes
})
export function resetRouter() {
const newRouter = createRouter()
router.matcher = newRouter.matcher // reset router
}
const router = createRouter()
// , 404
const reSetPermissionList = to => {
return new Promise((resolve, reject) => {
if (to.path !== '/login' && store.state.permission.permissionList.length === 0) {
store
.dispatch('permission/getPermissionList')
.then(() => {
resolve('permCode')
})
.catch(error => {
resolve('permCode')
})
} else {
resolve()
}
})
}
router.beforeEach((to, from, next) => {
const accessToken = localStorage.getItem('accessToken')
if (_.isEmpty(accessToken)) {//
next({
path: '/login',
query: {
redirect: to.fullPath
}
})
} else { //
if (to.path === '/login') {
next({ path: '/index' })
} else {
reSetPermissionList(to).then(data => {
data === 'permCode' ? next({ path: to.path, query: to.query }) : next()
})
}
}
})
締め括りをつける主にグローバルナビゲーションでVUEX中のデータが存在するかどうかを判断して、ページが更新されているかを判断します。そうであれば、もう一度アクセス権のルートマッチングを行う方法です。
以上がVue動的に追加されたルートページの更新時に失効した原因と解決策の詳細です。Vueルートページの更新に関する資料は他の関連記事に注目してください。