vue菜单

1、创建组件 TreeMenu

html 复制代码
<template>
	<template v-for="item in menuTree" :key="item._id">


		<el-sub-menu v-if="item.children && item.children.length > 0" :key="item._id" :index="item.name">
			<template #title>
				<el-icon>
					<component class="icons" :is="item.meta.icon"></component>
				</el-icon>
				<!-- <component class="icons"  :is="item.icon" style="font-size: 5px; " width="20"></component> -->
				<span>{{ item.meta.title }}</span>
			</template>
			<el-menu-item-group>

				<tree-menu :menuTree="item.children" />
			</el-menu-item-group>

		</el-sub-menu>

		<!-- v-else-if="item.ismenu == 1"  -->
		<el-menu-item v-else :index="item.name" @click="clickMenu(item)" style="">
			<el-icon>
				<component class="icons" :is="item.meta.icon"></component>
			</el-icon>
			<!--  -->
			<span>{{ item.meta.title }}</span>
		</el-menu-item>
	</template>
</template>

<script>
export default {
	name: 'TreeMenu',
	props: {
		menuTree: {
			type: Array,
			default: () => []
		}
	},
	methods: {
		//点击把菜单的名字传出去
		clickMenu(val) {
			// alert(1);
			this.$store.commit("pushtags", val)

		}
	}

}
</script>
 <style>

.el-menu-item,.el-menu-item{
  width: 230px;
}</style>

2、conf.json 菜单数据

json 复制代码
{
    "code": 1,
    "msg": "成功",
    "time": 1683615337,
    "data": {
        "config": {
            "site_name": "real-tinke",
            "beian": "备案",
            "configgroup": [],
            "mail_type": "",
            "mail_smtp_host": "q",
            "mail_smtp_port": "",
            "mail_smtp_user": "",
            "mail_smtp_pass": "",
            "mail_verify_type": "1",
            "mail_from": "",
            "": "备案2"
        },
        "menu": [
            {
                "id": 1,
                "pid": 0,
                "name": "/welcome",
                "title": "控制台",
                "remark": "",
                "ismenu": 1,
                "createtime": 1491635035,
                "updatetime": 1652348263,
                "weigh": 9999,
                "status": "1",
                "apipath": "dashboard\/index",
                "icon": "user-filled",
                "component": 0,
                "menuCode": 0,
                "spacer": "",
                "childlist": []
            },
            {
                "id": 2,
                "pid": 0,
                "name": "general",
                "title": "常规管理",
                "remark": "",
                "ismenu": 1,
                "createtime": 1491635035,
                "updatetime": 1491635035,
                "weigh": 0,
                "status": "1",
                "apipath": "0",
                "icon": "user-filled",
                "component": 0,
                "menuCode": 0,
                "spacer": "",
                "childlist": [
                    {
                        "id": 3,
                        "pid": 2,
                        "name": "config",
                        "title": "配置",
                        "remark": "",
                        "ismenu": 1,
                        "createtime": 1491635035,
                        "updatetime": 1491635035,
                        "weigh": 0,
                        "status": "1",
                        "apipath": "general\/Configs\/index",
                        "icon": "user-filled",
                        "component": 0,
                        "menuCode": 0,
                        "spacer": " ├",
                        "childlist": []
                    },
                    {
                        "id": 7,
                        "pid": 2,
                        "name": "profile",
                        "title": "个人信息",
                        "remark": "",
                        "ismenu": 1,
                        "createtime": 1491635035,
                        "updatetime": 1491635035,
                        "weigh": 0,
                        "status": "1",
                        "apipath": "general\/profile\/index",
                        "icon": "user-filled",
                        "component": 0,
                        "menuCode": 0,
                        "spacer": " ├",
                        "childlist": []
                    },
                    {
                        "id": 9,
                        "pid": 2,
                        "name": "database",
                        "title": "数据库列表",
                        "remark": "",
                        "ismenu": 1,
                        "createtime": 1491635035,
                        "updatetime": 1491635035,
                        "weigh": 0,
                        "status": "1",
                        "apipath": "general\/database\/index",
                        "icon": "user-filled",
                        "component": 0,
                        "menuCode": 0,
                        "spacer": " └",
                        "childlist": []
                    }
                ]
            } 
        ],
        "getUserinfo": {
            "id": 1,
            "group_id": 1,
            "username": "admin",
            "nickname": "极梦测试1",
            "password": "8f72fa6ae8f467ec362d24c437b0fbef",
            "salt": "ltcuEk",
            "email": "[email protected]",
            "mobile": "18354393242",
            "avatar": "http:\/\/real-think.jmwl51.com\/storage\/upload\/20220511\/e9ccc0994c0bb8f40f4483304c3f6dc2.jpg",
            "level": 1,
            "gender": 0,
            "birthday": "1996-02-01",
            "bio": "",
            "money": "0.00",
            "score": 0,
            "successions": 1,
            "maxsuccessions": 5,
            "prevtime": 1652851903,
            "logintime": 1683614107,
            "loginip": "27.209.133.148",
            "loginfailure": 0,
            "joinip": "47.103.65.214",
            "jointime": 1631927605,
            "createtime": 1631927605,
            "updatetime": 1632638617,
            "token": "",
            "status": "1",
            "verification": "",
            "group": {
                "id": 1,
                "name": "默认组",
                "rules": "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55",
                "createtime": 1491635035,
                "updatetime": 1652824082,
                "status": "1"
            }
        }
    }
}

3、引用组件

html 复制代码
<template>
  <div class="basic-layout" style="display: flex;">

    <!-- , isCollapse ? 'fold' : 'unfold' -->
    <el-aside :class="['nav']" ref="navmenuwin">

      <!-- 导航菜单 -->
      <el-menu :default-active="activeMenu" class="nav-menu" :router="true" :show-timeout="3000" :collapse="isCollapse">
        <!-- 系统logo -->
        <div class="logo">
          <img src="../assets/img/logo-small.png" />
          <span v-if="!isCollapse" style="display: block;width: 110px;white-space: nowrap;">{{ site.site_name }}</span>
        </div>
        <tree-menu :menuTree="menuTree" />
      </el-menu>

    </el-aside>
    <el-container class="content">

      <!-- 头部 -->
      <el-header>
        
      </el-header>
      <!-- 内容 -->
      <el-main>

       
      </el-main>

    </el-container>
  </div>
</template>

<script>

//   import confjson from "../cpmponets/framework/conf.json";
import confjson from "../components/framework/conf.json"; 
import TreeMenu from "../components/framework/TreeMenu.vue"; 
import { useRouter } from 'vue-router'
export default {
  name: "home",
  components: { TreeMenu, Topcrumb, confjson },
  data() {
    return {
      confjson,
      islogo: true,
      activeMenu: location.hash.slice(1),
      isCollapse: false,
      site: {},
      menuTree: [],
      userInfo: {},
      noticeCount: 0,
      isFullScreen: false,

    };
  },
  watch: {
    //监视路由,一开始就监视,获取routeName,来判断是否激活
    $route: {
      immediate: true,
      handler(val) {
        // this.routeName=val.name
        console.log(val);
        this.activeMenu = val.name;

      }
    }
  },
  mounted() {
    this.getNoticeCount();
    this.getMenuList();
    const Router = useRouter()
    this.menuTree = Router.options.routes[0].children;
    console.log(this.menuTree)
  },
  methods: {
    toggleNav() {
      this.isCollapse = !this.isCollapse;
    },

    async getNoticeCount() {

      this.noticeCount = 5;
    },
    async getMenuList() {
      if (this.menuTree.length === 0) {
        try {
          const res = this.confjson.data
          console.log(res, "1111")
          // const res = await this.$api.getMenuList(); 
          this.userInfo = res.getUserinfo;
          // this.menuTree = res.menu; 
          this.site = res.config;
          this.$store.commit("pushtags", "")

          // this.$store.commit('changeMenuList',res.data.menu)
        } catch (error) {
          console.error(error);
        }
      }
    },




  },
};
</script>
  
 
 

备注:可以加个判断;是网页还是vue内部路径

相关推荐
来自星星的坤1 分钟前
如何解决 Vue.js 导航栏下拉菜单“闪现“问题 ! ! !
前端·javascript·vue.js
jianzhi00110 分钟前
深入理解 HTML5 Web Workers:提升网页性能的关键技术解析
前端·html·html5
最新资讯动态19 分钟前
掌握DevEco Studio模拟器这些“隐藏功能”,让鸿蒙应用调试效率事半功倍
前端
irises38 分钟前
tabby-vscode代码补全的一些阅读笔记
前端·javascript
2501_9068014838 分钟前
BY组态-低代码web可视化组件
前端·物联网·低代码·数学建模·编辑器·web
hang_bro40 分钟前
element-plus e-tabs与pinia 一起使用的问题
前端·vue.js
VitStratUp41 分钟前
antdvue+tree+transfer+vue3 实现树形带搜索穿梭框
前端·vue.js
wangpq42 分钟前
微信小程序map组件渲染几百个marker后,页面卡顿,如何解决?
vue.js·微信小程序
千野竹之卫42 分钟前
2025最新云渲染网渲100渲染农场使用方法,渲染100邀请码1a12
开发语言·前端·javascript·数码相机·3d·3dsmax
前端提桶人1 小时前
Win11 安装 Sentry 监控
linux·前端