通过后台接口获取菜单数据

axios请求拦截器

 axios请求拦截器
后台除了登录接口之外,都需要token权限验证,我们可以通过添加axios请求拦截器来添加token,以保证拥有获取数据的权限
在main.js中添加代码,在将axios挂载到vue原型之前添加下面的代码
```
//请求在到达服务器之前,先会调用use中的这个回调函数来添加请求头信息
axios.interceptors.request.use(config=>{
  //为请求头对象,添加token验证的Authorization字段
  config.headers.Authorization = window.sessionStorage.getItem("token")
  return config
})
```

 

<script>
export default {
  data() {
    return {
      // 左侧菜单数据
      menuList: null
    }
  },
  created() {
    // 在created阶段请求左侧菜单数据
    this.getMenuList()
  },
  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.error(res.meta.msg)

      this.menuList = res.data
      console.log(res)
    }
  }
}
</script>
```
通过v-for双重循环渲染左侧菜单
```
<el-menu
  background-color="#333744"
  text-color="#fff"
  active-text-color="#ffd04b">
  <!-- 一级菜单 -->
  <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>
  </el-submenu>
</el-menu>
```

 

 

icon配置:

图片与id对应关系表

绑定id与view

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 可以通过使用 axios 或者 fetch 等插件来发送请求,从后台接口获取菜单路由的数据,并将其动态添加到 Vue 的路由配置中。 首先,在 Vue 组件中使用 axios 或者 fetch 发送请求,获取后台接口返回的菜单路由数据。可以在组件的 created 钩子函数中发送请求,并将返回的数据保存在组件的 data 中。 然后,在 Vue 的路由配置中动态添加菜单路由。可以在路由配置文件(一般为 router/index.js)中,引入获取菜单路由数据的组件,然后将组件的菜单路由数据遍历添加到路由的 children 数组中。 示例代码如下: ```JavaScript // 组件中发送请求获取菜单路由的数据 import axios from 'axios'; export default { data() { return { menuRoutes: [] // 菜单路由数据 }; }, created() { axios.get('/api/menu') // 假设后台接口为 /api/menu .then(response => { this.menuRoutes = response.data; // 保存获取菜单路由数据 }) .catch(error => { console.error('Failed to get menu routes.', error); }); } } // 路由配置文件中动态添加菜单路由 import Vue from 'vue'; import Router from 'vue-router'; import Home from '@/views/Home.vue'; Vue.use(Router); const router = new Router({ mode: 'history', base: process.env.BASE_URL, routes: [ // 其他静态路由 { path: '/home', name: 'Home', component: Home, children: [] // 动态添加的菜单路由 }, // 其他静态路由 ] }); // 在动态添加菜单路由的地方导入获取菜单路由数据的组件 const menuRoutes = require('./menuRoutes'); // 遍历菜单路由数据,动态添加到路由的 children 数组中 menuRoutes.forEach(route => { router.options.routes[0].children.push(route); }); export default router; ``` 需要注意的是,在获取菜单路由数据后,需要将其转换为 Vue Router 可用的路由对象格式,包括 path、name、component 等属性。另外,还可以根据需要设置路由的其他属性,如 meta。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值