首页 > 其他分享 >Vue从后端取数据,实现动态路由

Vue从后端取数据,实现动态路由

时间:2024-04-01 13:58:56浏览次数:23  
标签:Vue 从后 route item import 端取 data store icon

1.App.vue

将获取菜单的方法放在全局中,以便每次刷新页面时,能够加载出。this.$store.state.userInfo是登入后存放在Vuex的用户信息

TODO:把数据放到本地存储,没有的时候再加载,这只是demo

<template>
  <div id="app">
    <router-view />
  </div>
</template>
 
<script>
import { generaMenu } from '@/assets/js/menu'
export default {
  created() {
    if (this.$store.state.userInfo != null) {
      generaMenu()
    }
  }
}
</script>

2.menu.js(@/assets/js路径下)

import Layout from '@/layout/index.vue'
import router from '@/router'
import store from '@/store'
import axios from 'axios'
import Vue from 'vue'
 
export function generaMenu() {
  axios.get('/api/admin/user/menus').then(({ data }) => {
    if (data.flag) {
      let userMenus = data.data;
      userMenus.forEach((item) => {
        if (item.icon != null) {
          item.icon = 'iconfont ' + item.icon
        }
        if (item.component == 'Layout') {
          item.component = Layout
        }
        if (item.children && item.children.length > 0) {
          item.children.forEach((route) => {
            route.icon = 'iconfont ' + route.icon;
            route.component = loadView(route.component)
          })
        }
      })
      store.commit('saveUserMenus', userMenus);
      userMenus.forEach((item) => {
        router.addRoute(item)
      })
    } else {
      Vue.prototype.$message.error(data.message);
      router.push({ path: '/login' })
    }
  })
}
 
export const loadView = (view) => {
  return (resolve) => require([`@/views${view}`], resolve)
}

3.SideBar.vue(侧边栏)

<template>
  <div>
    <el-menu
      class="side-nav-bar"
      router
      :collapse="this.$store.state.collapse"
      :default-active="this.$route.path"
      background-color="#304156"
      text-color="#BFCBD9"
      active-text-color="#409EFF">
      <template v-for="route of this.$store.state.userMenus">
        <template v-if="route.name && route.children && !route.hidden">
          <el-submenu :key="route.path" :index="route.path">
            <template slot="title">
              <i :class="route.icon" />
              <span>{{ route.name }}</span>
            </template>
            <template v-for="(item, index) of route.children">
              <el-menu-item v-if="!item.hidden" :key="index" :index="item.path">
                <i :class="item.icon" />
                <span slot="title">{{ item.name }}</span>
              </el-menu-item>
            </template>
          </el-submenu>
        </template>
        <template v-else-if="!route.hidden">
          <el-menu-item :index="route.path" :key="route.path">
            <i :class="route.children[0].icon" />
            <span slot="title">{{ route.children[0].name }}</span>
          </el-menu-item>
        </template>
      </template>
    </el-menu>
  </div>
</template>
 
<style scoped>
.side-nav-bar:not(.el-menu--collapse) {
  width: 210px;
}
.side-nav-bar {
  position: fixed;
  top: 0;
  left: 0;
  bottom: 0;
  overflow-x: hidden;
  overflow-y: auto;
}
.side-nav-bar i {
  margin-right: 1rem;
}
*::-webkit-scrollbar {
  width: 0.5rem;
  height: 1px;
}
*::-webkit-scrollbar-thumb {
  border-radius: 0.5rem;
  background-color: rgba(144, 147, 153, 0.3);
}
</style>

效果

标签:Vue,从后,route,item,import,端取,data,store,icon
From: https://www.cnblogs.com/qcy-blog/p/18108250

相关文章

  • vue记事本渲染以及交互
    以下是记事本的源码<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>记事本</title>......
  • Vue自定义指令directive(主要是钩子函数及其参数)
    Vue自定义指令directive(主要是钩子函数及其参数):https://blog.csdn.net/weixin_46037781/article/details/119637729?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171194263116777224467854%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request......
  • vue-router
    [什么是vue-router]传统的路由是针对服务器不同文件,这样路由的变动就会导致新页面加载,导致页面刷新。vue-router实现了在vue组件基础上,不加载页面文件,而是更改部分页面组件的方式来展现不同路由时显示的内容。同时节约了客户端和服务端资源。[安装]npmivue-router@4......
  • vue表单点击按钮增加或者删除一行
    vue表单点击按钮增加或者删除一行不需要动态改变的就不用放在一个form-item中,可以单独写一个form-item。需要点击增加和删除的表单项目可以用v-for来循环渲染。<a-form:label-col="{span:8}":wrapper-col="{span:12}"> <a-form-itemlabel="服务器名称">......
  • 【前端面试3+1】07vue2和vue3的区别、vue3响应原理及为什么使用proxy、vue的生命周期
    一、vue2和vue3的区别1.性能优化:        Vue3在性能方面有很大的提升,主要是通过虚拟DOM的优化和响应式系统的改进实现的。虚拟DOM重构:Vue3中对虚拟DOM进行了重构,使得更新算法更加高效,减少了更新时的开销,提升了性能。静态树提升:Vue3可以通过静态树提升技术......
  • vue3 点击按钮跳转到对应的tab页面
     大家好呀,我又来记录一下啦实现功能:点击”查看“按钮,跳转到对应的tab页面方法:router按钮部分:<el-buttonsize="small"@click="check(scope.row.name)">查看</el-button>对应的方法:check(){this.$router.push({path:'/about'})},router:import......
  • 从虚拟dom知识无痛深入vue与react的原理
     我们都知道像vue、react都有用到虚拟dom,那么虚拟dom到底是什么?框架为什么不直接操作真实dom而要在中间要引入虚拟dom呢?vue和react的虚拟dom又有什么异同呢?我们就从虚拟dom开始讲起,再来逐步引入讲解vue与react的部分原理及其异同,这里会顺便讲解到数据驱动视图及视图驱动数据,......
  • vue-路由详解
    路由vue-router1.对路由的理解:vue的一个插件库,专门用来实现SPA应用2.对SPA应用的理解:1.单页web应用2.整个应用只有一个完整的页面(index.html)3.点击页面中的导航链接不会刷新页面,只做页面的局部更新4.数据需要通过ajax请求获取3.什么是路由?1.......
  • Vite + Vue3 项目的创建 ,启动 ,停止
    第一步:使用命令行创建工程在磁盘的合适位置上,创建一个空目录用于存储多个前端项目用vscode打开该目录在vocode中打开命令行运行如下命令npmcreatevite@latest第一次使用vite时会提示下载vite,输入y回车即可,下次使用vite就不会出现了注意:选择vue+JavaScript选项即可......
  • 数据下钻--vue+springboot+echarts
    今天下午整了下数据下钻直接上成果: 然后左边可以选范围:左边调范围,然后对应的会显示那些省份满足条件。 然后就是鼠标悬停在某个省份,就显示相应数量: 然后可以点击对应省份进行下钻到市然后可以继续下钻到县:  同样的呢,市和县都可以向省一样那样显示范围和调试: ......