Vue.js公共layout
很多网站侧边栏、头部、尾部都是基本固定不变的,我们可以把这些固定不变的东西写成一个layout,这样可以有效减少代码量,提高可读性,并充分利用Vue.js的组件化特性。
layout文件
其实layout就是一个组件,里面包含了页面固定不变的部分。首先在src
目录下新建layouts
目录,在layouts
目录下新建文件Default.vue
文件,在文件中写好布局,页面预留的可变区域位置用router-view
代替。
1 2 3 4 5 6 7 8 9 10 11 12
| <template> <div class="total"> <Header/> <div class="contents"> <SideBar/> <div class="detail"> <router-view></router-view> </div> </div> </div> </template>
|
引入layout
在main.js
中引入layout,并注册组件
1 2 3 4 5
| import { createApp } from 'vue' import DefaultLayout from './layouts/Default.vue' const app = createApp(App); app.component("layout-default",DefaultLayout)
|
在路由中添加layout信息
需要在路由的index.js
中添加layout信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| let routes = [ { path: '/', name: 'home', layout: "default", component: () => import('../views/HomeView.vue') }, { path: '/login', name: 'login', layout: "default", component: () => import('../views/login.vue') }, ]
|
然后将layout信息添加进路由元信息
1 2 3 4 5 6 7 8 9 10 11
| function addLayoutToRoute(route, parentLayout = "default") { route.meta = route.meta || {}; route.meta.layout = route.layout || parentLayout; if (route.children) { route.children = route.children.map((childRoute) => addLayoutToRoute(childRoute, route.meta.layout)); } return route; }
routes = routes.map((route) => addLayoutToRoute(route));
|
配置App.vue
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <template> <div id="app"> <component :is="layout"> <router-view /> </component> </div> </template>
<script> export default { computed: { layout() { return "layout-" + (this.$route.meta.layout || "default").toLowerCase(); }, }, }; </script>
<style lang="less"></style>
|
完成
在layout中,使用的头部,尾部,侧边栏,都可以注册成组件,减少layout的代码量。