主页布局+通过接口获取菜单数据+实现首页的路由重定向+设置左侧二级菜单的路由链接
Posted So istes immer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了主页布局+通过接口获取菜单数据+实现首页的路由重定向+设置左侧二级菜单的路由链接相关的知识,希望对你有一定的参考价值。
1.通过接口获取数据
API如果需要授权,必须在请求头中使用Authorization字段提供token令牌
通过axios请求拦截器添加token,保证拥有获取数据的权限
main.js
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import './plugins/element.js'
// 导入全局样式
import './assets/css/global.css'
import axios from 'axios'
// 配置请求的根目录
axios.defaults.baseURL = 'http://127.0.0.1:8888/api/private/v1/'
axios.interceptors.request.use(config => {
console.log(config)
config.headers.Authorization = window.sessionStorage.getItem('token')
return config
})
Vue.prototype.$http = axios
Vue.config.productionTip = false
new Vue({
router,
render: h => h(App)
}).$mount('#app')
2.主页布局
开发流程:主页框架、主页Header布局、主页左侧菜单布局、发起请求获取左侧菜单数据、左侧菜单美化
ps:左侧菜单数据是通过发起请求获取的,具体API接口请查看文档
components/Home.vue
<template>
<el-container class="home-container">
<!-- 头部区域 -->
<el-header>
<div>
<img src="../assets/heima.png" />
<span>电商后台管理系统</span>
</div>
<el-button type="info" @click="logout">退出</el-button>
</el-header>
<!-- 页面主体区域 -->
<el-container>
<!-- 侧边栏 -->
<el-aside :width="isCollapse ? '64px' : '200px'">
<div class="toggle-button" @click="toggleCollapse">|||</div>
<el-menu background-color="#333744" text-color="#fff" active-text-color="#409EFF" :collapse="isCollapse" :collapse-transition="false" router :default-active="activePath">
<el-submenu :index="item.id + ''" v-for="item in menulist" :key="item.id">
<template slot="title">
<i :class="iconsObj[item.id]"></i>
<span>{{item.authName}}</span>
</template>
<el-menu-item :index="'/' + subItem.path" v-for="subItem in item.children" :key="subItem.id" @click="saveNavState('/' + subItem.path)">
<i class="el-icon-menu"></i>
<span>{{subItem.authName}}</span>
</el-menu-item>
</el-submenu>
</el-menu>
</el-aside>
<!-- 右侧内容主体 -->
<el-main>
<router-view></router-view>
</el-main>
</el-container>
</el-container>
</template>
<script>
export default {
data() {
return {
menulist: [],
iconsObj: {
125: 'el-icon-s-custom',
103: 'el-icon-s-management',
101: 'el-icon-s-goods',
102: 'el-icon-s-order',
145: 'el-icon-s-data'
},
// 是否折叠
isCollapse: false,
// 被激活的链接地址
activePath: ''
}
},
created() {
this.getMenuList()
this.activePath = window.sessionStorage.getItem('activePath')
},
methods: {
logout() {
window.sessionStorage.clear()
this.$router.push('login')
},
// 获取所有的菜单
async getMenuList() {
const { data: res } = await this.$http.get('menus')
if (res.meta.status !== 200) return this.$message.erro(res.meta.msg)
this.menulist = res.data
},
// 点击按钮,切换菜单的折叠与展开
toggleCollapse() {
this.isCollapse = !this.isCollapse
},
// 保存链接的激活状态
saveNavState(activePath) {
window.sessionStorage.setItem('activePath', activePath)
this.activePath = activePath
}
}
}
</script>
<style lang="less" scoped>
.home-container {
height: 100%;
}
.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;
}
}
}
.el-aside {
background-color: #333744;
.el-menu {
border-right: none;
}
}
.el-main {
background-color: #eaedf1;
}
.toggle-button {
background-color: #4a5064;
font-size: 10px;
line-height: 24px;
color: #fff;
text-align: center;
letter-spacing: 0.2em;
cursor: pointer;
}
</style>
plugins/elements.js
import Vue from 'vue'
import {
Button,
Form,
FormItem,
Input,
Message,
Container,
Header,
Aside,
Main,
Menu,
Submenu,
MenuItemGroup,
MenuItem
} 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.use(Menu)
Vue.use(Submenu)
Vue.use(MenuItemGroup)
Vue.use(MenuItem)
Vue.prototype.$message = Message
效果
点击下图标志,菜单可折叠收起
3.实现首页的路由重定向
components/Welcome.vue
<template>
<div>
<h3>Welcome</h3>
</div>
</template>
router/index.js
import Vue from 'vue'
import VueRouter from 'vue-router'
import Login from '../components/Login.vue'
import Home from '../components/Home.vue'
import Welcome from '../components/Welcome.vue'
Vue.use(VueRouter)
const router = new VueRouter({
routes: [
{ path: '/', redirect: '/login' },
{ path: '/login', component: Login },
{
path: '/home',
component: Home,
redirect: '/welcome',
children: [{ path: '/welcome', component: Welcome }]
}
]
})
// 挂载导航守卫
router.beforeEach((to, from, next) => {
if (to.path === '/login') return next()
const tokenStr = window.sessionStorage.getItem('token')
if (!tokenStr) return next('/login')
next()
})
export default router
效果
4.设置左侧二级菜单的路由链接
在components/Home.vue中修改
查看官方文档可知,el-menu有个router参数
router | 是否使用 vue-router 的模式,启用该模式会在激活导航时以 index 作为 path 进行路由跳转 | boolean | — | false |
对上面的Home.vue做两处修改
①给le-menu标签添加router参数
<el-menu background-color="#333744" text-color="#fff" active-text-color="#409EFF" :collapse="isCollapse" :collapse-transition="false" router></el-menu>
②修改二级菜单el-menu-item标签的index
<el-menu-item :index="'/' + subItem.path" v-for="subItem in item.children" :key="subItem.id">
<i class="el-icon-menu"></i>
<span>{{subItem.authName}}</span>
</el-menu-item>
效果
点击之后url改变了
5.添加功能
如何点击二级菜单高亮显示,并且刷新当前页面之后,之前点击的菜单仍然高亮显示?
el-menu标签中有个default-active参数,你想让哪个el-menu-item标签(二级菜单)高亮,就把该el-menu-item的index赋值给这个参数
思路:我们这里的el-menu-item标签的index是'/' + subItem.path,点击el-menu-item标签,触发事件,将该标签的index传到本地data中的activePath变量中,而default-active就动态绑定这个activePath变量,这样就实现了点击谁,谁就高亮。
点击的同时,我们把activePath的内容存到sessionStorage中,key为'activePath',value为activePath。每当页面刷新时,会执行created()函数中的内容,所以我们把sessionStorage保存的'activePath'的value赋值给本地data中的activePath变量。从而实现了页面刷新前哪个菜单高亮,刷新后仍然高亮。
以上是关于主页布局+通过接口获取菜单数据+实现首页的路由重定向+设置左侧二级菜单的路由链接的主要内容,如果未能解决你的问题,请参考以下文章