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": "admin@qq.com",
            "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 分钟前
金三银四,一个面试官连连夸赞的个人网页技术分享
前端·面试·three.js
兆子龙8 分钟前
Vite 插件系统与构建流水线源码解析:从 Rollup 插件到 HMR
前端
代码老中医13 分钟前
Node_modules 比黑洞还重,我们的硬盘到底做错了什么?
前端
兆子龙14 分钟前
Vue 3 响应式系统 Reactivity 源码深度解析:从 ref 到 effect 的完整链路
前端
Smoothcloud_润云17 分钟前
GORM 事务管理与 Repository 模式完整指南
前端·数据库·代码规范
兆子龙17 分钟前
Turborepo 与 Monorepo 任务调度源码解析:从 DAG 到增量构建
前端·架构
兆子龙20 分钟前
React 18 并发与 Reconciler 源码解析:Fiber、调度器与可中断渲染
前端
张一凡9324 分钟前
easy-model 领域驱动实践
前端·react.js
我命由我1234525 分钟前
Element Plus - Cascader 观察记录(基本使用、动态加载、动态加载下的异常环境)
开发语言·前端·javascript·vue.js·typescript·html5·js
陈林梓25 分钟前
ESLint + Prettier + Husky + lint-staged + Commitlint 的完整配置
前端