vue2-级联选择器

news2024/9/22 5:36:22

级联选择器

  • 一、市面上的级联选择器
  • 二、功能实现
    • 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>

        <Icon
          class="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" /> -->
          <ul
            v-if="
              currentProvinceName === dataList.name && dataList.nodes.length > 0
            "
            class="submenu"
          >
            <li
              class="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" />
              <ul
                v-if="
                  currentCityName === second.name && second.nodes.length > 0
                "
                class="thiredMe"
              >
                <li
                  class="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.coloradmin.cn/o/1967158.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

合规征程新里程碑:ATFX荣获香港SFC牌照,运营再上新台阶

全球知名金融科技品牌ATFX又传来好消息&#xff0c;继2023年6月获得阿联酋SCA第五类牌照后&#xff0c;ATFX全球合规运营策略再次取得重大成功。日前&#xff0c;ATFX宣布获得中国香港证券及期货事务监察委员会&#xff08;SFC&#xff09;颁发的第三类牌照&#xff08;号码&am…

GAMES104:06(下)游戏中地形大气和云的渲染2-学习笔记

文章目录 三、大气Atmosphere3.1 大气散射理论3.1.1 Analytic Atmosphere Appearance Modeling&#xff08;经验模型&#xff09;3.1.2 Participating Media参与介质3.1.3 辐射传递方程RTE(Radiative Transfer Equation)3.1.4 体积渲染公式VRE(Volume Rendering Equation) 3.2 …

比原生Transformer快的LMDeploy

创建conda环境 conda create lmdeploy conda activate lmdeploy 安装依赖包(注&#xff1a;下对应的版本要不然容易报错) pip install pytorch2.1.2 pip install lmdeploy[all]0.3.0 下载模型 通过Git协议下载模型。首先安装git-lfs组件 此处使用的root权限 curl -s ht…

YOLOv8改进 | 主干网络 | 简单而优雅且有效的VanillaNet 【华为诺亚方舟】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效…

【C++核心篇】—— C++面向对象编程:封装相关语法使用和注意事项详解(全网最详细!!!)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、封装&#xff08;类&#xff09;1.封装的使用&#xff08;类和对象&#xff09;2. 对象的初始化和清理2.1 构造函数2.2 析构函数2.3 构造函数的分类及调用 …

海外仓代理模式,借鸡生蛋也能成为跨境新出路

国际物流是跨境电商生态圈同质化最严重跨境电商最开放的“地带”。唯独海外仓&#xff0c;算是国际物流行业唯一的一块“世外桃源”&#xff0c;但一个1000平米的小仓库&#xff0c;每年至少要花费100万的运转资金&#xff0c;无论是新企业还是成熟的企业&#xff0c;建立海外仓…

成都云飞浩容文化传媒有限公司怎么样?靠谱吗?

在数字经济的浪潮中&#xff0c;电商行业如同一艘巨轮&#xff0c;乘风破浪&#xff0c;不断前行。而在这片波澜壮阔的蓝海中&#xff0c;成都云飞浩容文化传媒有限公司犹如一颗璀璨的新星&#xff0c;以其专业的电商服务能力和前瞻性的市场洞察&#xff0c;为众多品牌搭建起通…

【Python机器学习】支持向量机——基于最大间隔分隔数据

有些人认为&#xff0c;SVM是最好的现成的分类器&#xff0c;这里说的“现成”指的是分类器不加修改即可直接使用。同时&#xff0c;这就意味着在数据上应用基本形式的SVM分类器就可以得到低错误率的结果。SVM能够对训练集之外的数据点做出很好的分类决策。 支持向量机&#x…

SAP ABAP SUBMIT 用法详解(看这一篇就够了)

文章目录 前言一、案例介绍/笔者需求二、B报表&#xff08;被SUBMIT的程序&#xff09;三、A报表&#xff08;用SUBMIT的程序&#xff09; a.SUBMIT B程序 b.AND RETURN 详解 c.CL_SALV_BS_RUNTIME_INFO 捕获ALV数据的方法 d.捕获…

使用STM32实现一个线性代数计算器

文章目录 背景挑战与困难如何整合编译&#xff1f;error: non-ASM statement in naked function is not supportederror: #pragma import is an ARM Compiler 5 extension, and is not supported by ARM Compiler 6error: redefinition of __FILE 改造demo中的cout改造delete运…

gdb调试 查找段错误

先设置 程序崩溃时的core文件产生 ulimit -c unlimited http://t.csdnimg.cn/BBGBQ 记得改完之后重启虚拟机。 core文件&#xff1a;当程序发生异常&#xff08;如段错误&#xff09;并退出时&#xff0c;操作系统可以选择生成一个 core 文件。这个文件包含了程序崩溃时刻…

【吊打面试官系列-Dubbo面试题】Dubbo 支持服务降级吗?

大家好&#xff0c;我是锋哥。今天分享关于 【Dubbo 支持服务降级吗&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; Dubbo 支持服务降级吗&#xff1f; 以通过 dubbo:reference 中设置 mock"return null"。mock 的值也可以修改为 true&#xff0c;然…

软测面试二十问(最新面试)

1.软件测试的流程是什么 参加需求评审会&#xff0c;解决需求疑问---写测试用例---对测试用例进行评审---评审后开始执行测试---提交bug---追踪bug---关闭bug---回归测试---交叉测试---编写测试报告---冒烟测试 2.什么是黑盒测试和白盒测试&#xff1f;它们有何区别 黑盒测试…

医院HIS搭建|HIS系统开发|HIS系统源码

在现代医疗管理中&#xff0c;医院信息系统&#xff08;HIS&#xff09;扮演着至关重要的角色。它是一个综合性的信息平台&#xff0c;旨在提高医院运营效率&#xff0c;优化患者护理&#xff0c;并确保医疗数据的准确性和安全性。以下是HIS系统包含的一些核心功能&#xff1a;…

抖音短视频矩阵管理系统:短视频运营的得力助手

1. 抖音短视频矩阵管理系统介绍 随着短视频行业的迅速发展&#xff0c;越来越多的企业和自媒体人开始关注短视频运营。抖音作为国内最受欢迎的短视频平台之一&#xff0c;拥有庞大的用户群体和丰富的内容资源。为了更好地管理和运营短视频&#xff0c;抖音短视频矩阵管理系统应…

数据结构:线性表(上)

谈到线性的数据结构&#xff0c;那肯定离不开两个最基础的&#xff1a;数组和链表&#xff0c;当然有了数组和链表就会聊到栈和队列。 那么本篇我们就来介绍数组和链表 一、数组 数组&#xff08;Array&#xff09; 是一种很常见的数据结构。它由相同类型的元素&#xff08;…

Linux操作系统及gcc工具实验报告

Linux操作系统及gcc工具实验 一、 实验目的 1&#xff0e;学习在VMware虚拟机上搭建Linux操作系统。 2&#xff0e;掌握Linux操作系统的环境配置及使用。 3. 学会使用gcc工具编译。 二、 实验环境 硬件&#xff1a;PC机 软件&#xff1a;VMware虚拟机、Linux系统。 三、…

8-springboot集成nacos config

本文介绍spring boot集成nacos config&#xff0c;注意这里和spring cloud没任何关系&#xff0c;单纯基于spring boot。 0、环境 jdk 1.8nacos 2.0.3Idea 2021.1maven 3.8.1 1、springboot搭建 Idea新建maven项目&#xff0c;构建完成后&#xff0c;添加以下依赖&#xff…

新160个crackme - 018-crackme_0006

运行分析 输入Name和Serial&#xff0c;点击Check无反应 PE分析 ASM程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 ida找到关键字符串&#xff0c;进入关键函数 通过静态分析和动态调试&#xff0c;得到以下结论 总结&#xff1a;1、String Serial2、String2 是…