如何在Vuejs中添加多个布局?

2022-03-28 00:00:00 javascript vue.js vue-router

我正在创建一个vuejs应用程序,其中我希望有两个不同的布局,一个用于用户界面,另一个用于管理界面。 在用户界面中,我有一个名为"管理面板"的按钮,单击此按钮可以转到管理端并呈现新布局。到目前为止,我已经做到了以下几点:

  • 我已在src中创建了一个容器文件夹来保存布局文件

    • UserPanel.vue
    • AdminPanel.vue
  • 以及用于保存路由文件的路由器文件夹

    • user.js
    • admin.js
    • index.js

#UserPanel.js#

<template>
  <v-app> 
    <h4>User Layout</h4>
    <router-view></router-view>
  </v-app>
</template>
<script>
export default {
}
</script>

#AdminPanel.js#

<template>
  <v-app> 
    <h4>Admin Layout</h4>
    <router-view></router-view>
  </v-app>
</template>

<script>
export default {
}
</script>

#user.js#

import UserPanel from 'Container/UserPanel';
const HomeV1 = () => import('Views/HomeV1');
const HomeV2 = () => import('Views/HomeV2');
const HomeV3 = () => import('Views/HomeV3');

export default{
  path: '/',
  component: UserPanel,
  redirect:'/home',
  children:[
    { 
        path: '/',               
        component: HomeV1 ,
        meta: {
            header: 1
         }
    },
    { 
        path: '/home',               
        component: HomeV1 ,
        meta: {
            header: 1
         }
    },
    { 
        path: '/home-two',               
        component: HomeV2 ,
        meta: {
            header: 2
        }
    },
    { 
        path: '/home-three',               
        component: HomeV3 ,
        meta: {
            header: 3
        }
    }
  ]
}

#admin.js#

import Admin from 'Container/Adminpanel.vue';
const Reports = () => import('Views/AdminPanel/Reports.vue');
const Invoice = () => import('Views/AdminPanel/Invoices.vue');
const AdminAccount = () => import('Views/AdminPanel/Account.vue');

export default {
  path: '/admin-panel',
  component: Admin,
  redirect:'/admin-panel/reports',
  children:[
    { 
        path: '/admin-panel/reports',  
        component: Reports, 
        name:'Reports'
    },
    { 
        path: '/admin-panel/invoices',  
        component: Invoice, 
        name:'Invoice'
    },
    { 
        path: '/admin-panel/products',  
        component: AdminProducts, 
        name:'AdminProducts'
    }
  ]
}

#index.js#

import Vue from 'vue'
import Router from 'vue-router'
import userRoutes from './user';
import adminRoutes from './admin';
Vue.use(Router);

export default new Router({
  mode: 'history',
  routes: [
    userRoutes,
    adminRoutes
  ]
})

现在只有我的用户路由在工作。要显示admin的页面,我必须将其路由放在user.js中,然后,它将呈现用户的布局而不是管理员的布局。

谢谢您。


解决方案

我以前曾尝试过这一点,我的方法是使用根据route meta field.

切换的替代布局

因此在定义路由时,可以添加元字段:

path: '/admin-panel/reports',  
        component: Reports, 
        name:'Reports',
        meta: { template: 'admin' }

然后,您需要在路由更改时检查它们。要做到这一点,最简单的方法是在全局导航保护中(就像他们的页面上的示例一样)。如果它检测到这是一个管理页面,它会更改Vuex属性,然后该属性将切换您正在使用的模板。

我要说的是,最后我停止使用此方法,并用包装器组件(admin/user/等)包装了所有页面,这样我就可以从Vue本身控制一切。这主要是由于Vue Router在等待用户进行身份验证方面的限制,因此这对您来说可能不是问题。

相关文章