vue.js: Route guard 等待异步值
vue.js: Route guard wait for async value
在每个应用程序中,我都有几条路线。例如(router/index.js
摘录):
[{
path: '/reporting',
name: 'Reporting',
component: reporting,
meta: {
adminOnly: true
}
},
...]
在路由定义中可以看到,访问reporting
时用户需要有admin权限,在vuex store中是属性。问题:这个 属性 是异步的,当最初在守卫中访问时当然是错误的。怎么才能让守卫等着呢?
后卫:
if (to.matched.some(route => route.meta.adminOnly)) {
if (store.getters.userInfo.isAdmin) {
next()
} else {
next('/')
}
} else {
next()
}
使用 store.watch 观看 getter 怎么样?
假设您的 getter returns null
如果尚未获取数据。
if (store.getters.userInfo.isAdmin === null) {
const watcher = store.watch(store.getters.userInfo.isAdmin, isAdmin => {
watcher(); // stop watching
if (isAdmin) next();
else next('/');
});
}
else if (store.getters.userInfo.isAdmin) next();
else next('/');
在每个应用程序中,我都有几条路线。例如(router/index.js
摘录):
[{
path: '/reporting',
name: 'Reporting',
component: reporting,
meta: {
adminOnly: true
}
},
...]
在路由定义中可以看到,访问reporting
时用户需要有admin权限,在vuex store中是属性。问题:这个 属性 是异步的,当最初在守卫中访问时当然是错误的。怎么才能让守卫等着呢?
后卫:
if (to.matched.some(route => route.meta.adminOnly)) {
if (store.getters.userInfo.isAdmin) {
next()
} else {
next('/')
}
} else {
next()
}
使用 store.watch 观看 getter 怎么样?
假设您的 getter returns null
如果尚未获取数据。
if (store.getters.userInfo.isAdmin === null) {
const watcher = store.watch(store.getters.userInfo.isAdmin, isAdmin => {
watcher(); // stop watching
if (isAdmin) next();
else next('/');
});
}
else if (store.getters.userInfo.isAdmin) next();
else next('/');