动态渲染 Element UI el-menu 组件

2024-05-11 04:48

本文主要是介绍动态渲染 Element UI el-menu 组件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

相信大家在使用 Element UIel-menu 组件的时候,都碰到过如何通过数据动态渲染的问题,而官方的文档却没有这个实例,网上找的一些博客大部分人都实现了 el-menu 的垂直模式,而水平模式却没有,并且垂直模式的 el-menu 在收缩的时候会出现问题,但是他们并没有去解决,让我很苦恼,没办法,只能自己去解决了,先给大家看看效果先:
效果图

如上所示,水平和垂直模式的el-menu都一实现,而且垂直的el-menu收缩也正常,下面给大家贴上代码:

水平 el-menu

水平模式的el-menu主要分为两个js文件:

  1. ch-horizonal-menu.js
  2. ch-horizonal-menu-item.js
ch-horizonal-menu.js
;(function (root , factory) {if(typeof exports === 'object') {module.exports = exports = factory();} else if(typeof define === 'function' && define.amd) {define([] , factory());} else {root.chHorizonalMenu = factory();}
})(this , function () {let chHorizonalMenu = {template:'<ul class="ch-horizonal-menu" :style="{backgroundColor:backgroundColor}">'+'<ch-horizonal-menu-item '+':menus="data" '+':active-text-color="activeTextColor"'+':background-color="backgroundColor"'+':activeId="activeId"'+'@item-click="itemClick">'+'</ch-horizonal-menu-item>'+'</ul>',props:{data:{type:Array , default:function () {return []}},backgroundColor:{type:String,default:'rgb(46, 50, 61)'},activeTextColor:{type:String,default:'rgb(255, 208, 75)'}},data:function () {return {activeId:null,submenuIds:[]}},methods:{itemClick:function (params) {this.activeId = params.id;this.removeActive();this.$emit('item-click' , params);},removeActive:function () {var _this = this ;var activeNodes = this.$el.getElementsByClassName('is_active');[].slice.call(activeNodes).forEach(function (el) {el.className = el.className.replace(/ is_active/ , '');el.style.color = '#fff';})}}}return {name:'ch-horizonal-menu',template:chHorizonalMenu}
})
ch-horizonal-menu-item.js
;(function (root , factory) {if(typeof exports === 'object') {module.exports = exports = factory();} else if(typeof define === 'function' && define.amd) {define([] , factory());} else {root.chHorizonalMenuItem = factory();}
})(this , function () {let chHorizonalMenuItem = {template:'<div>'+'<template v-for = "menu in menus">'+'<li v-if="menu.children && menu.children.length" '+'@mouseenter="onMouseEnter($event , menu.id)"'+'@mouseleave="onMouseLeave($event)"'+'class="ch-horizonal-menu-item ch-horizonal-submenu">'+'<div class="ch-horizonal-submenu__title">'+'<span>{{menu.name}}</span>'+'<i :class=\'[ floor == 1 ? "el-icon-arrow-down" : "el-icon-arrow-right", "ch-horizonal-submenu__icon-arrow"]\'></i>'+'</div>'+'<div class="ch-horizonal-submenu_inner" v-show="current_id == menu.id">'+'<ul class="ch-horizonal-menu__inner" '+':style="{backgroundColor:backgroundColor}">'+'<ch-horizonal-menu-item '+':menus="menu.children" '+':active-text-color="activeTextColor"'+':background-color="backgroundColor"'+':activeId="activeId"'+':level="floor" '+'@item-click="itemClick">'+'</ch-horizonal-menu-item>'+'</ul>'+'</div>'+'</li>'+'<li v-else '+':style="{color:activeId == menu.id ? activeTextColor :\'#fff\' }"'+'class="ch-horizonal-menu-item"'+'@click="itemClick(menu , $event)">{{menu.name}}</li>'+'</template>'+'</div>',props:{menus:{type: Array,default: function () {return [];}},level:{type: Number,default:0},activeId:{type:[Number , String],default:''},activeTextColor:String,backgroundColor:String},data:function () {return {show:false,floor:this.level,timeId:0,current_id:-1,isActive:false}},created:function () {this.floor++;},methods:{onMouseEnter:function (event , id) {clearTimeout(this.timeId);this.current_id = id ;this.$nextTick(function () {if(this.floor > 1) {var innerMenu = event.target.querySelector('.ch-horizonal-menu__inner');var innerMenuItem = event.target.querySelector('.ch-horizonal-menu-item');innerMenu.style.left = (innerMenuItem.offsetWidth - 20 + 5) + 'px';innerMenu.style.top  = (-innerMenuItem.offsetHeight) + 'px';}})},onMouseLeave:function (event) {this.timeId = setTimeout(function () {this.current_id = -1 ;}.bind(this) , 200)},itemClick:function (menu , event) {this.current_id = -1 ;this.$emit('item-click' , menu);if(event) this.setParentNodeActive(event.target.parentNode , 'ch-horizonal-submenu');},setParentNodeActive:function (el , cls) {var classList = el.className.split(' ');if(classList.indexOf('ch-horizonal-menu') == -1) {if(classList.indexOf(cls) != -1) {el.style.color = this.activeTextColor;el.className = el.className.concat(' is_active');}this.setParentNodeActive(el.parentNode , cls);}}}}return {name:'ch-horizonal-menu-item',template:chHorizonalMenuItem}
})

使用示例

   // 注册 chHorizonalMenuItem 必须在 chHorizonalMenu 前注册Vue.component(chHorizonalMenuItem.name , chHorizonalMenuItem.template);Vue.component(chHorizonalMenu.name , chHorizonalMenu.template);<ch-horizonal-menu :data="menus"background-color="#1B75D5"@item-click="onHorizonalMenuClick"></ch-horizonal-menu>

垂直 el-menu

ch-vertical-menu-item.js
;(function (root , factory) {if(typeof exports === 'object') {module.exports = exports = factory();} else if(typeof define === 'function' && define.amd) {define([] , factory());} else {root.chVerticalMenuItem = factory();}
})(this , function () {var chVerticalMenuItem = {template:'<div class="ch-menu-wrapper">'+'<template v-for="menu in data">'+'<el-menu-item v-if="!menu.children" :index="menu.id" @click="handleMenuItem(menu)"> '+'<i v-if="menu.icon" :class="menu.icon"></i>'+'<span slot="title">{{menu.name}}</span>'+'</el-menu-item>'+'<el-submenu v-else :index="menu.id">'+'<template slot="title">'+'<i v-if="menu.icon" :class="menu.icon"></i>'+'<span>{{menu.name}}</span>'+'</template>'+'<ch-vertical-menu-item :data="menu.children" @item-click="onMenuClick"></ch-vertical-menu-item>'+'</el-submenu>'+'</template>'+'</div> ',props:{data:{type:Array,default:function () {return [] ;}}},methods:{handleMenuItem:function (menu) { this.$emit("item-click" , menu);},onMenuClick:function (menu) {this.$emit("item-click" , menu);}}}return {name:'ch-vertical-menu-item',template:chVerticalMenuItem}
})
使用示例
 // 注册Vue.component(chVerticalMenuItem.name , chVerticalMenuItem.template);<el-menu:default-active="activeMenuId":background-color="themeColor"text-color="#fff":collapse="isCollapse"class="el-menu-vertical-left"active-text-color="#ffd04b"><ch-vertical-menu-item :data="menus" @item-click="onCHMenuClick"></ch-vertical-menu-item></el-menu>

由于垂直模式的 el-menu 只是用 Element UI原生组件进行再封装,所以相关配置请参考其文档,而水平模式的 el-menu 则是自定义的组件,因此两者没有封装到一起,用法上也有所不同,还请各位见谅!

完整代码请查看 vue-web-frame 导航菜单示例

这篇关于动态渲染 Element UI el-menu 组件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/978548

相关文章

QT6中绘制UI的两种方法详解与示例代码

《QT6中绘制UI的两种方法详解与示例代码》Qt6提供了两种主要的UI绘制技术:​​QML(QtMeta-ObjectLanguage)​​和​​C++Widgets​​,这两种技术各有优势,适用于不... 目录一、QML 技术详解1.1 QML 简介1.2 QML 的核心概念1.3 QML 示例:简单按钮

PyQt6中QMainWindow组件的使用详解

《PyQt6中QMainWindow组件的使用详解》QMainWindow是PyQt6中用于构建桌面应用程序的基础组件,本文主要介绍了PyQt6中QMainWindow组件的使用,具有一定的参考价值,... 目录1. QMainWindow 组php件概述2. 使用 QMainWindow3. QMainW

Python Selenium动态渲染页面和抓取的使用指南

《PythonSelenium动态渲染页面和抓取的使用指南》在Web数据采集领域,动态渲染页面已成为现代网站的主流形式,本文将从技术原理,环境配置,核心功能系统讲解Selenium在Python动态... 目录一、Selenium技术架构解析二、环境搭建与基础配置1. 组件安装2. 驱动配置3. 基础操作模

在 PyQt 加载 UI 三种常见方法

《在PyQt加载UI三种常见方法》在PyQt中,加载UI文件通常指的是使用QtDesigner设计的.ui文件,并将其转换为Python代码,以便在PyQt应用程序中使用,这篇文章给大家介绍在... 目录方法一:使用 uic 模块动态加载 (不推荐用于大型项目)方法二:将 UI 文件编译为 python 模

慢sql提前分析预警和动态sql替换-Mybatis-SQL

《慢sql提前分析预警和动态sql替换-Mybatis-SQL》为防止慢SQL问题而开发的MyBatis组件,该组件能够在开发、测试阶段自动分析SQL语句,并在出现慢SQL问题时通过Ducc配置实现动... 目录背景解决思路开源方案调研设计方案详细设计使用方法1、引入依赖jar包2、配置组件XML3、核心配

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

SpringQuartz定时任务核心组件JobDetail与Trigger配置

《SpringQuartz定时任务核心组件JobDetail与Trigger配置》Spring框架与Quartz调度器的集成提供了强大而灵活的定时任务解决方案,本文主要介绍了SpringQuartz定... 目录引言一、Spring Quartz基础架构1.1 核心组件概述1.2 Spring集成优势二、J

MySQL中动态生成SQL语句去掉所有字段的空格的操作方法

《MySQL中动态生成SQL语句去掉所有字段的空格的操作方法》在数据库管理过程中,我们常常会遇到需要对表中字段进行清洗和整理的情况,本文将详细介绍如何在MySQL中动态生成SQL语句来去掉所有字段的空... 目录在mysql中动态生成SQL语句去掉所有字段的空格准备工作原理分析动态生成SQL语句在MySQL