赞
踩
第一章-项目初始化
第二章-登录/退出功能
第三章-Git提交代码
element-ui组件库中找到 Container布局容器第四个
<el-container>
<el-header>Header</el-header>
<el-container>
<el-aside width="200px">Aside</el-aside>
<el-main>Main</el-main>
</el-container>
</el-container>
把button按钮放到el-header里面
<el-container>
<!-- 头部区域 -->
<el-header>Header<el-button type="info" @click="logout">退出</el-button>
</el-header>
<!-- 页面主体区域 -->
<el-container>
<!-- 侧边栏 -->
<el-aside width="200px">Aside</el-aside>
<!-- 右侧内容主体 -->
<el-main>Main</el-main>
</el-container>
</el-container>
在element-ui中导入这些组件并注册为全局组件
import Vue from 'vue'
import { Button, Form, FormItem, Input, Message, Container, Header, Aside, Main } from 'element-ui'
Vue.use(Button)
Vue.use(Form)
Vue.use(FormItem)
Vue.use(Input)
Vue.use(Container)
Vue.use(Header)
Vue.use(Aside)
Vue.use(Main)
Vue.prototype.$message = Message
注意:每一个element-ui中提供的组件的组件名就是类名,直接加类选择器
给el-container添加一个自定义class,用于设置容器撑满全屏
<style lang="less" scoped>
.home-container{
height: 100%;
}
.el-header{
background-color: #373d41;
}
.el-aside{
background-color: #333744;
}
.el-main{
background-color: #eaedf1;
}
</style>
使用flex布局,左侧设置一个div盒子放图标和文本
<!-- 头部区域 -->
<el-header>
<div>
<img src="../assets/star.png" alt="">
<span>电商后台管理系统</span>
</div>
<el-button type="info" @click="logout">退出</el-button>
</el-header>
.el-header{ background-color: #373d41; display: flex; justify-content: space-between; padding-left: 0; // 去掉图标左边缝隙 align-items: center; // 按钮上下居中 color: #fff; font-size: 20px; > div { // 文本纵向居中对齐 display: flex; align-items: center; span { // 文本和图标之间间距 margin-left: 15px; } } img{ width: 61px; height: 61px; } }
使用组件库中 NavMenu 导航菜单
在element-ui中导入这些组件并注册为全局组件
在el-menu里面嵌套一级菜单el-submenu,一级菜单里面通过template指定图标和文本;
在一级菜单里面嵌套了二级菜单el-menu-item,二级菜单里面通过template指定图标和文本
<!-- 侧边栏 --> <el-aside width="200px"> <!-- 侧边栏菜单区域 --> <el-menu background-color="#333744" text-color="#fff" active-text-color="#ffd04b"> <!-- 一级菜单 --> <el-submenu index="1"> <!-- 一级菜单模板区域 --> <template slot="title"> <!-- 图标 --> <i class="el-icon-location"></i> <!-- 文本 --> <span>导航一</span> </template> <!-- 二级菜单 --> <el-menu-item index="1-4-1"> <!-- 二级菜单模板区域 --> <template slot="title"> <!-- 图标 --> <i class="el-icon-location"></i> <!-- 文本 --> <span>选项</span> </template> </el-menu-item> </el-submenu> </el-menu> </el-aside>
//axios请求拦截 请求在到达服务器之前,先会调用use中的这个回调函数来添加请求头信息
axios.interceptors.request.use(config=>{
//为请求头对象,添加token验证的Authorization字段
config.headers.Authorization = window.sessionStorage.getItem("token")
return config
})
在API接口文档中找到左侧菜单权限的请求路径和方法
在页面刚加载的时候就应该立即获取左侧菜单栏数据,所以在行为区域定义一个生命周期函数 created() ,调用 getMenuList() 来获取所有的左侧菜单,在methods中定义这个函数,get函数返回值是promise,用async简化promise操作,通过解构赋值把data属性解构出来重命名为res进行接收
拿到数据后,接下来为了能在页面中渲染出来,应该把获取到的数据立即挂载到data中,再定义一个组件的私有数据,然后再根据status值进行判断,保存到menulist里
<script> export default { data () { return { // 第三步:左侧菜单数据挂载到data中 menulist: [] } }, // 第一步:在created阶段请求左侧菜单数据 created () { this.getMenuList() }, methods: { logout () { window.sessionStorage.clear() this.$router.push('/mylogin') }, // 第二步:获取所有的菜单数据 async getMenuList () { const { data: res } = await this.$http.get('menus') // 第四步:根据status判断 if (res.meta.status !== 200) return this.$message.error(res.meta.msg) this.menulist = res.data console.log(res) } } } </script>
给一级菜单加v-for指令 循环渲染,每一个v-for都提供一个唯一的key属性,id是唯一的 可以直接指定
把每个item项对应的authname属性当作名称,为template中的span标签动态绑定一个菜单的名称
此时都已经渲染出来了,但展开一项,其他项也展开了
此时需要为el-submenu指定一个唯一的index,给index绑定一个动态的值 :index="item.id"
此时报错,原因是index只接收字符串不接收数值,所以拼接一个空字符串 :index="subItem.id + ''"
接着渲染二级菜单
<!-- 一级菜单 --> <el-submenu :index="item.id + ''" v-for="item in menulist" :key="item.id"> <!-- 一级菜单模板区域 --> <template slot="title"> <!-- 图标 --> <i class="el-icon-location"></i> <!-- 文本 --> <span>{{ item.authName }}</span> </template> <!-- 二级菜单 --> <el-menu-item :index="subItem.id + ''" v-for="subItem in item.children" :key="subItem.id"> <!-- 二级菜单模板区域 --> <template slot="title"> <!-- 图标 --> <i class="el-icon-location"></i> <!-- 文本 --> <span>{{ subItem.authName }}</span> </template> </el-menu-item>
active-text-color="#409fff"
<i class="el-icon-menu"></i>
<!-- 图标 --> <i :class="iconsObj[item.id]"></i> data () { return { // 第三步:左侧菜单数据挂载到data中 menulist: [], iconsObj: { 125: 'iconfont icon-user', 103: 'iconfont icon-tijikongjian', 101: 'iconfont icon-shangpin', 102: 'iconfont icon-danju', 145: 'iconfont icon-baobiao' } } },
再设置一下图标和文本间的距离
.iconfont {
margin-right: 10px;
}
限制一级菜单每次只能展开一个,添加一个属性unique-opened设置为true,再加冒号进行数据绑定
<el-menu background-color="#333744" text-color="#fff" active-text-color="#409fff" :unique-opened="true">
发现展开的菜单右边框会有点突出去,检查发现多了border-right
通过类名选择器修改为none
.el-aside{
background-color: #333744;
.el-menu {
border-right: none;
}
}
<div class="toggle-button" >|||</div>
<div class="toggle-button" @click="toggleCollapse">|||</div>
isCollapse: false
:collapse="isCollapse"
toggleCollapse () { this.isCollapse = !this.isCollapse }
:collapse-transition="false"
<el-aside :width="isCollapse ? '64px' : '200px'">
实现登录成功后首页显示welcome这个组件,在home中嵌套子组件
1.新建子组件welcome.vue
2.在router/index.js中导入子路由组件
并在home路由规则内部设置子组件路由规则以及子级路由的默认重定向规则
3.在Home.vue main的主体区域放一个路由占位符
//router/index.js
import Welcome from '../components/Welcome.vue'
const router = new VueRouter({
routes: [
{ path: '/', redirect: '/mylogin' },
{ path: '/mylogin', component: myLogin },
{
path: '/home',
component: Home,
redirect: '/welcome',
children: [{ path: '/welcome', component: Welcome }]
}
]
})
// Home.vue
<!-- 右侧内容主体区域 -->
<el-main>
<!-- 路由占位符 -->
<router-view></router-view>
</el-main>
将 el-menu 的 router 属性重置为true :router="true"
此时,点击二级菜单会跳转到:
我们不希望跳转到id而是path,因此重新绑定index的值为 :index=" ‘/’ + subItem.path",服务器没有给地址加斜线,所以手动补全斜线
此时已经实现侧边栏路由跳转
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。