我在SPA中使用Vue和Vue路由器。在视图组件中,我查询资源库。如果找不到资源,我想在保留URL的同时显示404页面。
即。如果我访问/foo/non-existant-id
,则应显示404页面以代替foo
资源的显示页面。
为清楚起见,这是我的路由器地图:
router.map({
'/foo/:id': {name: 'foo-show', component: FooShowPage},
// Utilities
'/': { name: 'home', component: HomePage },
'*': { name: '404', component: NotFoundPage }
})
在我的FooShowPage
中,我执行以下操作:
ready () {
// fetch the foo from the repo (app.foos)
app.foos.fetchById(this.$route.params.id).then(foo => {
this.foo = foo
}).catch(e => {
// foo is not found show a 404 page
// using this.$route.router.go({name: '404'}) does not work as route is a wildcard
console.warn(e)
})
}
基本上,它可能涉及用FooShowPage
替换路由器视图中的NotFoundPage
,或者重定向到定义的404页面,同时保持浏览器历史不变。
答案 0 :(得分:3)
您需要为404页面设置路由,然后将不匹配的路由重定向到该页面。我在地图后使用router.redirect
来做这些事情。
router.map({
'/': { name: 'home', component: HomePage },
'/foo/:id': {name: 'foo-show', component: FooShowPage},
'/404': {name: 'not-found', component: NotFound}
})
router.redirect({
'*': '/404'
})
然后,地图中未列出的所有路线都将重定向到/404
答案 1 :(得分:0)
找到了solution at Vue.js forum-使用navigation guard:
import store from '../store'
{
path: '/lavori/:lavoro',
name: 'lavoro',
component: Lavoro,
beforeEnter: (to, from, next) => {
function isValid (id) {
return store.getters.resourceByID(id) !== undefined
}
if (!isValid(to.params.id)) {
next({ name: 'not-found' });
}
next();
}
},
Edit1:需要import store
才能从此Github issue和此question
还是一个问题,如何保留相同的(请求的)URL
答案 2 :(得分:-1)
我想出的最好办法是将全局拦截器与Axios一起使用,以将通过API收到的所有404响应重定向到404路由。但是,这确实将网址更改为/ 404,就像@Leo的答案一样。
const http = axios.create({
headers: {
'X-Requested-With': 'XMLHttpRequest'
}
});
// Add some global response intercepters
http.interceptors.response.use(function (response) {
// For successes just continue as normal
return response;
}, function (error) {
// If we have a 404 redirect to the error page replacing the history
if (error.response.status === 404) {
return router.replace({ name: 'notfound' });
}
return Promise.reject(error);
});
export default http;