vue2-级联选择器

级联选择器

  • 一、市面上的级联选择器
  • 二、功能实现
    • 1、数据类型
    • 2、隐藏下拉框的方法
    • 3、html结构
    • 4、CSS代码
    • 5、各个方法代码
  • 三、实现样式截图
    • 1、一级菜单
      • 1、鼠标放到一级菜单,就显示二级菜单
      • 2、鼠标点击一级菜单的时候
    • 2、二级菜单
      • 1、鼠标放到二级菜单的时候,显示三级菜单
      • 2、鼠标点击二级菜单的时候,显示一级菜单和二级菜单
    • 3、三级菜单
      • 1、鼠标点击三级菜单的时候

一、市面上的级联选择器

用多了组件库以后,发现各种级联选择器都有很多问题,用着很不方便

1、比如我有三级,我只能点击我最后一个级别的时候,我的下拉框才会收回,
2、很多组件都没法实现光点击我的一级或者二级菜单,必须要点击最后一级菜单
3、 而且传的值也是一个数组类型的,处理起来要判断,很麻烦,没法我点击一个传递一个ID

所以我根据功能自己写了一个三级下拉框,

二、功能实现

1、数据类型

数据类型为树形结构,我贴上我的数据

dataList: {name: '总经理',code: 1,level: 1,isSaleDepartment: false,nodes: [{name: '管理部',code: 11,level: 2,isSaleDepartment: false,nodes: [{name: '人事',code: 111,level: 3,isSaleDepartment: true,nodes: [],id: 8,},{name: '行政',code: 112,level: 3,isSaleDepartment: true,nodes: [],id: 9,},{name: '采购',code: 113,level: 3,isSaleDepartment: true,nodes: [],id: 10,},{name: '仓库',code: 114,level: 3,isSaleDepartment: true,nodes: [],id: 11,},{name: '财务',code: 115,level: 3,isSaleDepartment: true,nodes: [],id: 12,},],id: 2,},{name: '销售部',code: 12,level: 2,isSaleDepartment: true,nodes: [{name: '销售部门1',code: 121,level: 3,isSaleDepartment: true,nodes: [],id: 13,},{name: '销售部门2',code: 122,level: 3,isSaleDepartment: true,nodes: [],id: 14,},{name: '销售部门3',code: 123,level: 3,isSaleDepartment: true,nodes: [],id: 15,},{name: '销售部门4',code: 124,level: 3,isSaleDepartment: true,nodes: [],id: 16,},],id: 3,},{name: '业务部',code: 13,level: 2,isSaleDepartment: false,nodes: [{name: '销售',code: 131,level: 3,isSaleDepartment: false,nodes: [],id: 17,},{name: '市场开发',code: 132,level: 3,isSaleDepartment: false,nodes: [],id: 18,},{name: '售后服务',code: 133,level: 3,isSaleDepartment: false,nodes: [],id: 19,},],id: 4,},{name: '工程部',code: 14,level: 2,isSaleDepartment: false,nodes: [{name: '新产品开发',code: 141,level: 3,isSaleDepartment: false,nodes: [],id: 20,},{name: '产品设计',code: 142,level: 3,isSaleDepartment: false,nodes: [],id: 21,},{name: '产品工艺',code: 143,level: 3,isSaleDepartment: false,nodes: [],id: 22,},{name: '资料管理',code: 144,level: 3,isSaleDepartment: false,nodes: [],id: 23,},],id: 5,},{name: '生产部',code: 15,level: 2,isSaleDepartment: false,nodes: [{name: '生产计划',code: 151,level: 3,isSaleDepartment: false,nodes: [],id: 24,},{name: '设备制造',code: 152,level: 3,isSaleDepartment: false,nodes: [],id: 25,},{name: '工程安装',code: 153,level: 3,isSaleDepartment: false,nodes: [],id: 26,},],id: 6,},{name: '品质部',code: 16,level: 2,isSaleDepartment: false,nodes: [{name: '质量管理',code: 161,level: 3,isSaleDepartment: false,nodes: [],id: 27,},{name: '过程控制',code: 162,level: 3,isSaleDepartment: false,nodes: [],id: 28,},],id: 7,},],id: 1,},

2、隐藏下拉框的方法

 hideDropdown() {this.showDropdown = false;this.currentProvinceName = null;this.currentCityName = null;},

3、html结构

我是用原生的div和ul以及li标签实现的

 <div class="app"><div class="dropdown" @mouseleave="hideDropdown"><div@click="showDropdown = !showDropdown"@mouseenter="showclose = true"@mouseleave="showclose = false":style="{ width: widthLength }"class="selectContent":class="showDropdown ? 'active' : ''"><span style="color: #ccc" v-if="selectedText === '请选择'">{{selectedText}}</span><span v-else>{{ selectedText }}</span><Iconclass="icon"type="md-close"v-if="selectedText &&selectedText !== '请选择' &&showclose &&showcloseIcon"@click.stop="clear"/></div><ul class="menu" v-if="showDropdown"><li@click.stop="clickFirst(dataList)"@mouseenter="showSubmenu(dataList)">{{ dataList.name }}<!-- <div class="arrow-down" v-if="dataList.nodes.length > 0"></div> --><!-- <Icon v-if="dataList.nodes.length > 0" type="ios-arrow-forward" /> --><ulv-if="currentProvinceName === dataList.name && dataList.nodes.length > 0"class="submenu"><liclass="secondMenu"v-for="second in dataList.nodes":key="second.id"@click.stop="clickSecond(dataList.name, second)"@mouseenter="showSubmenuSecond(second)">{{ second.name }}<Icon v-if="second.nodes.length > 0" type="ios-arrow-forward" /><ulv-if="currentCityName === second.name && second.nodes.length > 0"class="thiredMe"><liclass="thirdMenu"v-for="third in second.nodes":key="third.id"@click.stop="selectDistrict(dataList.name, second, third)">{{ third.name }}</li></ul></li></ul></li></ul></div></div>

4、CSS代码

<style scoped>.arrow-down {width: 0;height: 0;border-left: 10px solid transparent;border-right: 10px solid transparent;border-top: 10px solid black;}
.app {font-family: Avenir, Helvetica, Arial, sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;margin: 0 auto;
}
.active {border-color: #57a3f3;outline: 0;box-shadow: 0 0 0 2px rgba(45, 140, 240, 0.2);
}
.icon {position: absolute;right: 5px;font-size: 16px;
}
.selectContent {border: 1px solid #ccc;border-radius: 3px;position: relative;height: 32px;padding: 0 24px 0 8px;display: flex;align-items: center;
}
.selectContent:hover {border-color: #57a3f3;outline: 0;box-shadow: 0 0 0 2px rgba(45, 140, 240, 0.2);
}
.dropdown {display: inline-block;position: relative;cursor: pointer;z-index: 1000;
}
.dropdown .menu {list-style-type: none;padding: 0;margin: 0;position: absolute;top: 102%;left: 0;background: white;border: 1px solid #ccc;border-radius: 5px;z-index: 1000;width: 100px;
}
.dropdown .menu > li {padding: 8px;cursor: pointer;position: relative;
}
.dropdown .menu > li:hover {background: #f3f3f3;
}
.secondMenu {padding: 5px;position: relative;
}
.secondMenu:hover {background: #f3f3f3;
}
.dropdown .submenu {list-style-type: none;padding: 0;margin: 0;position: absolute;top: 0;left: 100%;background: white;border: 1px solid #ccc;border-radius: 5px;display: none;z-index: 500;width: 100px;/* max-height: 200px;overflow-y: auto; */max-height: 200px; /* 设置固定高度 */
}
.thiredMe {border: 1px solid #ccc;position: absolute;left: 100%;width: 100px;top: 0;z-index: 1001;background: white;border-radius: 5px;list-style-type: none;height: 150px;overflow: auto;
}
.thirdMenu {padding: 5px;position: relative;}
.thirdMenu:hover {background: #f3f3f3;
}
.dropdown .menu > li:hover > .submenu {display: block;
}
ul {padding-left: 0 !important;}
</style>

5、各个方法代码

methods: {showSubmenu(item) {this.currentProvinceName = item.name;this.currentCityName = null;},showSubmenuSecond(item) {this.currentCityName = item.name;},hideDropdown() {this.showDropdown = false;this.currentProvinceName = null;this.currentCityName = null;},// 点击一级菜单clickFirst(first) {this.$emit('current', first);this.selectedText = first.name;this.hideDropdown();},// 点击二级菜单clickSecond(firstname, second) {this.$emit('current', second);this.selectedText = firstname + '-' + second.name;this.hideDropdown();},// 点击三级菜单selectDistrict(first, second, third) {console.log('firs', first, second.name, third.name);this.selectedText = first + '-' + second.name + '-' + third.name;this.hideDropdown();this.$emit('current', third);},},

三、实现样式截图

1、一级菜单

1、鼠标放到一级菜单,就显示二级菜单

在这里插入图片描述

2、鼠标点击一级菜单的时候

就直接显示一级的内容,并且下拉框也是隐藏状态
在这里插入图片描述

2、二级菜单

1、鼠标放到二级菜单的时候,显示三级菜单

在这里插入图片描述

2、鼠标点击二级菜单的时候,显示一级菜单和二级菜单

并且下拉框也是隐藏状态
在这里插入图片描述

3、三级菜单

1、鼠标点击三级菜单的时候

直接显示三个菜单的内容,并且下拉框隐藏了,
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/389784.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中的二叉搜索树(如果想知道Java中有关二叉搜索树的知识点,那么只看这一篇就足够了!)

前言&#xff1a;Java 提供了丰富的数据结构来处理和管理数据&#xff0c;其中 TreeSet 和 TreeMap 是基于红黑树实现的集合和映射接口。它们有序地存储数据&#xff0c;提供高效的搜索、插入和删除操作。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主…

软件测试 -- 黑盒、灰盒、白盒测试,冒烟测试、回归测试

软件测试目的&#xff1a;查找软件中缺陷&#xff08;bug&#xff09;&#xff0c;保障软件质量。

MyBatis 动态代理和映射器

一、映射器简介 1.什么是mapper动态代理? 在接口中有方法的返回值定义&#xff0c;参数的定义&#xff0c;方法名&#xff0c;在sqlMapper.xml 中也对应这接口给予了赋值&#xff0c; 这时候dao的实现类就显得多余&#xff0c;这是Mybatis可以帮助我们自动产生实现类&#xf…

HarmonyOS多目标产物构建最佳实践

背景 在Android或iOS开发时经常会有打“马甲”包的场景&#xff0c;就是一套代码打出不同主题的包&#xff0c;一个公司的产品可能针对不同用户提供不同的应用&#xff0c;比如抖音有国内版也有国外版&#xff0c;滴滴有个人版还有企业版&#xff0c;同样的在鸿蒙平台也有类似…

C++初学(9)

9.1、结构简介 虽然数组能够和存储多个元素&#xff0c;但所有元素必须相同&#xff0c;也就是说&#xff0c;同一个数组不能既存放int类型也存放float类型&#xff0c;而C的结构可以满足要求。结构是一种比数组更灵活的数据格式&#xff0c;因为同一个结构可以存储多种类型的…

QtQuick Text-文本样式

属性 Text项目的style属性可以设置文本的样式。 支持的文本样式有&#xff1a; Text.Normal&#xff08;默认&#xff09;Text.OutlineText.RaisedText.Sunken 示例 import QtQuickRow{spacing: 10padding: 10Text {font.pointSize: 40text: "Normal"}Text {font…

数据库原理之多表查询——使用Mysql进行内连接和外连接

作者&#xff1a;CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境&#xff1a;Idea 目录 1.内连接 1.1隐式内连接 1.1.1定义 1.1.2举例 1.1.3优缺点 1.2显式内连接 1.2.1定义 1.2.2举例 1.2.3优缺点 2.外连接 2.1左外连接 2.1.1定义 2.1.2举例 2.…

【从零开始一步步学习VSOA开发】开发环境搭建

开发环境搭建 开发 VSOA 首先需要搭建开发环境&#xff0c;这里讲解 Windows 下 C/C 开发环境搭建方法。 下载 IDE 并申请授权码 SylixOS 的开发和部署需要 RealEvo-IDE 的支持&#xff0c;因此您需要先获取 RealEvo-IDE 的安装包和注册码。 RealEvo-IDE 分为体验版和商业版…

如何确保PLC系统安全的可靠性,这几个注意事项你需要牢记

PLC&#xff08;可编程逻辑控制器&#xff09;是现代工业自动化系统中的关键组成部分。在设计 PLC 系统时&#xff0c;安全性是至关重要的考虑因素。本文将介绍 PLC 系统设计中的一些安全注意事项&#xff0c;包括电源设计、接地设计、关键数字量输入输出设计和报警设计。 一.…

vue实现简易的全局加载动画效果

效果展示 思路 封装一个组件&#xff0c;放Img&#xff0c;伪类样式&#xff0c;固定在屏幕fixed 然后App应用这个组件&#xff0c;Z index拉最大&#xff0c;防止用户在加载动画时乱点&#xff0c; v-show绑定loading&#xff0c;该数据可以放vuex还是任一的公共状态管理变…

PDF文件点击打印无反应?是何原因造成能解决吗?

PDF无法打印怎么处理&#xff1f;在我们工作中&#xff0c;经常会遇见各种各样的文件问题&#xff0c;当我们想要将PDF文件打印出来纸质版使用&#xff0c;却不知什么原因&#xff0c;显示PDF无法打印&#xff0c;这时应该怎么处理呢&#xff1f; 一般情况下&#xff0c;PDF文件…

cesium canvas广告牌

在有些业务中&#xff0c;对场景中的广告牌样式要求比较高&#xff0c;需要动态显示一些数据&#xff0c;这个时候&#xff0c;我们可以通过将复杂背景样式制作成图片&#xff0c;通过canvas绘制图片和动态数据&#xff0c;从而达到比较好的显示效果。 1 CanvasMarker 类封装 …

学Python可少不了项目练手,这8个小项目有趣又实用,小白也能做出来_python练手项目,python教程

学习之路比较科学的学习方法是理解了之后把知识点进行运用&#xff0c;找一些开源的小项目做是最好的&#xff0c;站在岸上是学不会游泳的&#xff0c;光看健身视频是减不了肥的&#xff0c;不自己动手敲代码是学不会编程的。 我在找了8个比较有趣的小项目&#xff0c;技术水平…

E5092A可配置的多端口测试仪

E5092A 可配置的多端口测试仪 多达 10 个端口的全交叉测量&#xff0c;或者最多 22 个端口的测量功能。 概述 E5092A 多端口测试仪可以灵活配置&#xff0c;并可与4 端口ENA 网络分析仪&#xff08;E5070B/E5071B/E5071C/E5080A&#xff09;结合使用&#xff0c;组成频率范…

web3 solana

网址&#xff1a;HACKQUEST 学习初衷&#xff1a; 1.web3概念较为小众&#xff0c;相比于web2&#xff0c;机会较多 2.有机会remote work&#xff0c;带着笔记本到处浪&#xff0c;听着就不错 3.面对越来越卷的国内&#xff0c;有机会并有能力拥抱国外job&#xff0c;感觉是…

鸿蒙系统开发【应用接续】基本功能

应用接续 介绍 基于ArkTS扩展的声明式开发范式编程语言编写的一个分布式视频播放器&#xff0c;主要包括一个直播视频播放界面&#xff0c;实现视频播放时可以从一台设备迁移到另一台设备继续运行&#xff0c;来选择更合适的设备继续执行播放功能以及PAD视频播放时协同调用手…

《LeetCode热题100》---<5.②普通数组篇五道>

本篇博客讲解LeetCode热题100道普通数组篇中的六道题 第三道&#xff1a;轮转数组&#xff08;中等&#xff09; 第四道&#xff1a;除自身以外数组的乘积&#xff08;中等&#xff09; 第三道&#xff1a;轮转数组&#xff08;中等&#xff09; 方法一&#xff1a;使用额外的数…

vscode+cmake+msys2工具链配置

1、msys2下载编译器和cmake工具 pacman -S mingw-w64-x86_64-toolchain pacman -S mingw-w64-x86_64-cmaketoolchain包中包含很多不必要的工具包&#xff0c;应该可以指定具体的工具g&#xff0c;gcc&#xff0c;mingw32-make的下载&#xff0c;详细命令请自行搜索。 2、将 m…

QT 应用程序输出中文乱码

一 &#xff0c;选择文本编码 1. 点击编辑再点击Select Encoding选择编码 2 .在弹出的窗口&#xff0c;选择UTF-8再点击按编码保存即可 3. 重新编译&#xff0c;可以发现中文乱码问题解决

思维+dfs,CF 269C - Flawed Flow

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 269C - Flawed Flow 二、解题报告 1、思路分析 考虑源点相连的边的方向是确定的&#xff0c;因为流量是从源点往外流的 我们设cap[u] 为 和u相连边的容量和&#xff0c;显然入边容量要和出边容量相等&…