如何使用与普通路由不同的模板处理 vue-router 的 404 错误

Posted

技术标签:

【中文标题】如何使用与普通路由不同的模板处理 vue-router 的 404 错误【英文标题】:How to handle 404 error with vue-router using different templates than normal routes 【发布时间】:2018-12-14 13:45:03 【问题描述】:

您好,我有两个模板:

主站点模板,用于两侧有两条横线的普通页面:Main.vue 错误页面模板,两侧没有错误栏,例如 404:404.vue 如果用户进入普通页面,则应使用Main.vue 模板,每个页面都有嵌套路由。 如果用户进入一个不存在的页面,则应该使用带有错误的404.vue 模板。 我尝试了以下操作,但它始终显示 404 错误,localhost:8080/ 除外(根路径访问):

router.js:

export default new Router(
  mode: 'history',
  routes: [
      path: '/',
      name: 'main',
      component: Main,
      childrens: [
          path: '/',
          name: 'Home',
          components: 
            default: () =>
              import ('@/views/Home'),
            leftInfo: () =>
              import ('@/views/DashboardAdditionalInfo'),
            rightInfo: () =>
              import ('@/components/common/MyTicketsList')
          
        ,
        
          path: 'dashboard',
          name: 'Dashboard',
          components: 
            default: () =>
              import ('@/views/Dashboard'),
            leftInfo: () =>
              import ('@/views/DashboardAdditionalInfo'),
            rightInfo: () =>
              import ('@/components/common/MyTicketsList')
          
        

      ]
    ,

    
      path: '*',
      name: '404',
      component: () =>
        import ('@/templates/404.vue')
    
  ]
)

关于如何处理这种情况的任何想法?当然,我可以将 404 句柄放在 Main 路由中,但这会显示两个侧边栏。

【问题讨论】:

how to create a 404 component in vuejs using vue-router的可能重复 情况不同,因为不需要在该帖子上使用不同的模板。但没关系,我发现让它工作的唯一方法是 【参考方案1】:

您可以使用shards ui vue template 中的动态布局方法。它基本上将您的应用程序级别 <router-view/> 包装在正确的布局组件中,具体取决于您在 router.js 中提供路由的可选元标记。

App.vue:

<template>
  <div id="app">
    <component :is="layout">
      <router-view/>
    </component>
  </div>
</template>

<script>
export default 
    name: 'app',
    computed: 
      layout() 
        // none-layout will be used if the meta.layout tag is not set
        // computed may not be best place in vue lifecycle for this but it works ok
        return `$this.$route.meta.layout || 'none'-layout`;
      
    

</script>

router.js:

import Vue from "vue";
import Router from "vue-router";
import Errors from "./views/Errors.vue";
Vue.use(Router);

export default new Router(
    mode: 'history',
    routes: [
        
            path: "/",
            name: "dash",
            component: () => import('./views/Dashboard.vue'),
            meta:  layout: 'default-dash' 
        ,
        
            path: '/signup',
            component: () => import('./views/Signup.vue'),
            // meta.layout tag not present so 'none' will be used
        ,
        
            path: '*',
            component: Errors,
            meta:  layout: 'none' 
        
    ]
);

main.js:

import Vue from 'vue'
import App from './App.vue'
import router from "./router";

// Layouts
import DefaultDash from '@/layouts/DefaultDash.vue';
import None from '@/layouts/None.vue';

// Layouts as usable components
Vue.component('default-dash-layout', DefaultDash);
Vue.component('none-layout', None);

Vue.config.productionTip = false

new Vue(
    router,
    render: h => h(App),
).$mount('#app')

DefaultDash.vue:

<template>
    <div>
        <NavBar/>
        <SideBar/>
        <slot/>
    </div>
</template>

<script>
import NavBar from "../components/NavBar";
import SideBar from "../components/SideBar";

export default 
  name: "default-dash",
  components:  NavBar, SideBar 
;
</script>

无.vue:

<template>
    <div>
        <slot/>
    </div>
</template>

<script>
export default 
  name: "none"
;
</script>

现在您的 vue 404 错误将在没有任何侧边栏或导航栏的情况下加载。您可以将所有主要内容页面封装在您想要的任何外部布局中,您所要做的就是指定在元标记中使用哪个模板。

【讨论】:

以上是关于如何使用与普通路由不同的模板处理 vue-router 的 404 错误的主要内容,如果未能解决你的问题,请参考以下文章

vue-router 路由简单使用

Vue.js路由组件vue-router如何使用?

vue-router:如何在多个元素中使用视图路由器?

vue-router两个不同的路由共用一个component的问题

使用Vue-Router时如何在组件之间传递数据

vue路由vue-router