4

我在 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 页面,同时保持浏览器历史记录不变。

4

3 回答 3

6

您需要为 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

于 2016-07-14T14:24:47.547 回答
1

在 Vue.js 论坛上找到了一个解决方案——使用导航守卫

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 问题和这个问题中访问 getter

仍然是一个问题如何留下相同的(请求的)URL

于 2019-12-19T13:41:22.793 回答
-1

我想出的最好方法是使用带有 Axios 的全局拦截器来重定向通过 API 接收到的所有 404 响应 404 路由。但是,这确实将 url 更改为 /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;
于 2018-09-07T21:24:58.883 回答