当前位置: 首页 > ops >正文

Vue2+Element 初学

大致实现以上效果
一、左侧自动加载菜单


NavMenu.vue 菜单组件,简单调整了一下菜单直接的距离,代码如下:

<template>
<div>
<template v-for="item in menus">
<!-- 3、有子菜单,设置不同的 key 和 index -->
<el-submenu v-if="item.hasOwnProperty('children') && item.children.length > 0" :key="'submenu' + item.id"
:index="item.id">
<!-- 4、更多菜单,设置不同样式 -->
<template v-if="item.id === 'menu_more'" slot="title">
<i class="el-icon-more"></i>
</template>

                <!-- 5、title 上添加 @click -->
<template v-else slot="title">
<!-- <i class="el-icon-menu"></i> @click="handleClick(item)"-->
<i v-if="item.hasOwnProperty('icon') && item.icon!== ''" :class="item.icon"></i> 
<span  style="display: inline-block">
{{ item.text }}
</span>
</template>

                <!-- 6、此处添加 el-menu-item 是为了 submenu 能够选中 -->
<el-menu-item v-show="false" :index="item.id" :key="item.id">
<span>{{ item.text }}</span>
</el-menu-item>

                <!-- 7、如果有子级数据使用递归组件 v-on="$listeners"-->
<NavMenu :menus="item.children"></NavMenu>
</el-submenu>

            <!-- 5、没有子菜单,添加 @click @click="handleClick(item)"-->
<el-menu-item v-else :index="item.id" :key="item.id" style="height: 40px;line-height: 40px;">
<!-- <i :class="item.icon"></i> -->
<span>{{ item.text }}</span>
</el-menu-item>
</template>

    </div>
</template>
<script>
export default {
name: "NavMenu",
props: {
menus: {
type: Array,
default: () => []
}
},
data() {
return {
iconList: {
"el-icon-s-tools": "el-icon-s-tools",
"el-icon-s-promotion": "el-icon-s-promotion",
"el-icon-s-platform": "el-icon-s-platform",
"el-icon-s-operation": "el-icon-s-operation",
}
}
},
created() {
console.log("NavMenu created");
console.log(this.menus);
},
methods: {
handleClick(item) {
console.log("NavMenu handleClick", item);
}
}
}


</script>
<style>
.el-menu-item-group__title {
/* 隐藏导航分组 */
display: none;
}

div .el-submenu__title {
/* 导航有子集节点 */
height: 45px;
line-height: 45px;
}

</style>
二、点击菜单,加载相应的选项卡

 //根据点击的菜单,加载相应的选项卡
getNavMenu(navMenus, keyPath, index) {
if (!navMenus || index >= keyPath.length) {
return null;
}
for (var i = 0; i < navMenus.length; i++) {
if (navMenus[i].id === keyPath[index]) {
if (index === keyPath.length - 1) {
return navMenus[i];
} else {
return this.getNavMenu(navMenus[i].children, keyPath, index + 1);
}
}
}
return null;
},
handleSelect(key, keyPath) {
// 选中菜单
// this.openedsindex=keyPath[0];
var temps = [];
for (var i = 0; i < keyPath.length - 1; i++) {
temps.push(keyPath[i]);
}
this.openedsindex = temps;
// console.log("handleSelect", key, keyPath);
// console.log("temps", temps);
var elmenu = this.getNavMenu(this.navMenus, keyPath, 0);
// console.log("addTab", elmenu);
if (elmenu) {

        this.addTab(elmenu);
}
},
// elmenuitemClick(e) {
//   console.log(e.$el.dataset.name);
// },
addTab(param) {
var tabs = this.tabs;
if (tabs.length >= 10) {
this.$notify({
title: '消息提醒',
message: '已经打开了10个选项卡,请关闭一个选项卡后再打开新的选项卡。',
position: 'top-left',
type: 'warning',
duration: 3000,
});
return;
}
var tab = tabs.find(item => item.id === param.id);
// this.editableTabsValue=param.id;
if (tab) {
this.activeTab = param.id;
return;
}
else {
this.tabs.push(param);
this.activeTab = param.id;
}

    },
removeTab(targetName) {
try {
// console.log(targetName);
let tabs = this.tabs;
if (tabs.length <= 1) {
return;
}
let activeName = this.activeTab;
// var text = "";
if (activeName === targetName) {
tabs.forEach((tab, index) => {
if (tab.id === targetName) {
let nextTab = tabs[index + 1] || tabs[index - 1];
if (nextTab) {
activeName = nextTab.id;
// text = nextTab.text;
}
}
});
}
// console.log("removeTab", activeName, text);

        this.tabs = tabs.filter(tab => tab.id !== targetName);
this.activeTab = activeName;
} catch (e) {

        // console.log(e);
}

    }

http://www.xdnf.cn/news/18968.html

相关文章:

  • 如何备份 TECNO 手机上的短信
  • position属性
  • rabbitmq学习笔记 ----- 多级消息延迟始终为 20s 问题排查
  • 2025最新uni-app横屏适配方案:微信小程序全平台兼容实战
  • Java开发MongoDB常见面试题及答案
  • DQL单表查询相关函数
  • 【WPF】WPF 自定义控件实战:从零打造一个可复用的 StatusIconTextButton (含避坑指南)
  • 安卓开发---BaseAdapter(定制ListView的界面)
  • 中文PDF解析工具测评与选型指南
  • js AbortController 实现中断接口请求
  • 【面试场景题】三阶段事务提交比两阶段事务提交的优势是什么
  • 《C++进阶之STL》【AVL树】
  • 基于 GPT-OSS 的成人自考口语评测 API 开发全记录
  • 数据分析编程第七步:分析与预测
  • Qt节点编辑器设计与实现:动态编辑与任务流可视化(一)
  • 【拍摄学习记录】07-影调、直方图量化、向右向左
  • 经典扫雷游戏实现:从零构建HTML5扫雷游戏
  • 【Python】Python 实现 PNG 转 ICO 图标转换工具
  • LightGBM 在金融逾期天数预测任务中的经验总结
  • Qt自定义聊天消息控件ChatMessage:初步实现仿微信聊天界面
  • Linux之Shell编程(一)
  • Linux笔记12——shell编程基础-6
  • Swift 解法详解 LeetCode 365:水壶问题
  • Java -- 文件基础知识--Java IO流原理--FileReader
  • 了解ADS中信号和电源完整性的S参数因果关系
  • hintcon2025 Verilog OJ
  • 【python】python进阶——生成器
  • 数据结构01:顺序表
  • 次元小镇官网入口 - 二次元动漫社区|COS绘画插画壁纸分享
  • [数据结构] ArrayList与顺序表(下)