vue element select下拉框树形多选

2023-11-20

在这里插入图片描述
components 文件下新建 SelectTree文件 index.vue
SelectTree index.vue

<!--* 下拉树形选择 组件-->
<template>
  <el-select ref="select" style="min-width: 260px" :value="value" v-model="valueName" collapse-tags :multiple="multiple" :clearable="clearable" @change="changeValue">
    <!-- @clear="clearHandle" -->
    <el-option :value="valueName" class="options">
      <el-tree
        show-checkbox
        :default-expanded-keys="openTree"
        id="tree-option"
        ref="selectTree"
        :accordion="accordion"
        :data="options"
        :props="props"
        :node-key="props.value"
        @check-change="handleCheckChange"
      >
        <span slot-scope="{ data }"> <i :class="[data.color != null ? 'ification_col' : '']" :style="{ 'background-color': data.color }"></i>&nbsp;&nbsp;{{ data.name }} </span>
      </el-tree>
    </el-option>
  </el-select>
</template>
<script>
export default {
  name: 'el-tree-select',
  props: {
    // 配置项
    props: {
      type: Object,
      default: () => {
        return {
          value: 'id',
          children: 'children',
          label: 'name'
        }
      }
    },
    // 初始值(单选)
    value: {
      type: Object,
      default: () => {
        return {}
      }
    },
    // 初始值(多选)
    valueMultiple: {
      type: Array,
      default: () => {
        return []
      }
    },
    // 可清空选项
    clearable: {
      type: Boolean,
      default: false
    },
    // 自动收起
    accordion: {
      type: Boolean,
      default: false
    },
    // 是否支持多选
    multiple: {
      type: Boolean,
      default: true
    }
  },
  data () {
    return {
      options: [],
      resultValue: [], // 传给父组件的数组对象值
      valueName: [], // 输入框显示值
      openTree: [] // 需要展开的id
    }
  },
  watch: {
    value () {
      this.resultValue = this.valueMultiple // 初始值
      this.initHandle()
    }
  },
  mounted () {
    this.getSelectTreeList()
    this.resultValue = this.valueMultiple // 初始值
    this.initHandle()
  },
  methods: {
    // 获取 部门 tree
    getSelectTreeList: function () {
      this.$api.dept.findDeptTree().then((res) => {
        if (res.data.length) {
          const { children } = res.data[0] || {}
          this.options = children
          // 默认展开的 id
          this.options.forEach((item) => {
            this.openTree.push(item.id)
            if (item.children && item.children.length > 0) {
              this.openTreeList(item.children)
            }
          })
        }
      })
    },
    // 初始化显示
    initHandle () {
      if (this.resultValue) {
        this.resultValue.forEach((item) => this.valueName.push(item.name))
      }
      this.initScroll()
    },
    // 初始化滚动条
    initScroll () {
      this.$nextTick(() => {
        let scrollWrap = document.querySelectorAll('.el-scrollbar .el-select-dropdown__wrap')[0]
        let scrollBar = document.querySelectorAll('.el-scrollbar .el-scrollbar__bar')
        scrollWrap.style.cssText = 'margin: 0px; max-height: none; overflow: hidden;'
        scrollBar.forEach((ele) => (ele.style.width = 0))
      })
    },
    // 从输入框中直接删除某个值时
    changeValue (val) {
      // 多选(同时删掉传给父组件中多余的值,再传给父组件)
      this.resultValue.map((item, index) => {
        let i = val.indexOf(item.name)
        if (i === -1) {
          this.resultValue.splice(index, 1)
        }
      })
      this.$emit('getValue', this.resultValue)
    },
    // 勾选 /反选
    handleCheckChange (data, checked, indeterminate) {
      this.valueName = []
      if (checked) {
        // 选中
        if (!data.children.length) {
          this.resultValue.push(data)
        }
      } else {
        // 取消勾选
        const { name } = data
        this.resultValue.map((item, index) => {
          if (name === item.name) {
            this.resultValue.splice(index, 1)
          }
        })
      }
      this.resultValue.forEach((item) => {
        this.valueName.push(item.name) // 输入框显示值
      })
      this.$emit('getValue', this.resultValue)
    },
    // 默认展开全部
    openTreeList (list) {
      list.forEach((item) => {
        this.openTree.push(item.id)
        if (item.children && item.children.length) {
          this.openTreeList(item.children)
        }
      })
    }

    // 清除选中
    // clearHandle () {
    //   this.valueName = []
    //   this.resultValue = []
    //   this.clearSelected()
    //   this.$emit('getValue', this.resultValue)
    // },
    // // 清空选中样式
    // clearSelected () {
    //   let allNode = document.querySelectorAll('#tree-option .el-tree-node')
    //   allNode.forEach((element) => element.classList.remove('is-current'))
    // }
  }
}
</script>
<style lang="scss" scoped>
.el-scrollbar .el-scrollbar__view .el-select-dropdown__item {
  height: auto;
  max-height: 300px;
  padding: 0;
  overflow: hidden;
  overflow-y: auto;
}

.el-select-dropdown__item.selected {
  font-weight: normal;
}

ul li >>> .el-tree .el-tree-node__content {
  height: auto;
  padding: 0 20px;
}

.el-tree-node__label {
  font-weight: normal;
}

.el-tree >>> .is-current .el-tree-node__label {
  color: #409eff;
  font-weight: 700;
}

.el-tree >>> .is-current .el-tree-node__children .el-tree-node__label {
  color: #606266;
  font-weight: normal;
}

.el-popper {
  z-index: 9999;
}

.ification_col {
  width: 20px;
  height: 10px;
  display: inline-block;
}

.el-select-dropdown__item::-webkit-scrollbar {
  display: none !important;
}

.el-select {
  ::v-deep.el-tag__close {
    display: none !important; //隐藏在下拉框多选时单个删除的按钮
  }
}
</style>

使用:

<template>
 <!--  省略其他部分-->
 <el-form-item label="单位/部门:">
    <el-select-tree :valueMultiple="valueMultiple" @getValue="getSelectedValue"></el-select-tree>
 </el-form-item>
</template>



import elSelectTree from '../../components/SelectTree'
export default {
  components: {
    elSelectTree
  },
 data () {
    return {
    	valueMultiple: []
       }
  },
 methods: {
   getSelectedValue (value) {
      console.log('选中的结果值', value)
    }
 }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue element select下拉框树形多选 的相关文章

随机推荐

  • 网络爬虫 - 1 网络爬虫基本概念和相关工具

    网络爬虫基本概念和相关工具 1 基本概念 1 什么是网络爬虫 web crawler 以前经常称之为网络蜘蛛 spider 是按照一定的规则自动浏览万维网并获取信息的机器人程序 或脚本 曾经被广泛的应用于互联网搜索引擎 使用过互联网和浏览器
  • Linux环境下的VScode使用教程

    前言 1 对于学习本文需要先有自行安装好VMware 对VMware有简单的了解 2 对于绝大多数使用Linux的人而言 经常在Windows环境下使用source insight进行编译程序 然后利用FileZilla将Windows的文
  • Vue出现弹出层时,禁止底部页面跟随滑动

    背景 最近在写一个vue项目 当出现弹出层时 发现底部页面跟随滚动 但是产品不想要这种效果 于是找各种资料 发现很多说法 但是试了试 发现有的根本就不行 比如说有人提出用vue中提供的 touchmove prevent方法来解决 但是我试
  • 算法设计与分析——算法设计工具Standard Template Library即STL(C++模板库)概述

    算法设计工具 STL 前言 STL是一个功能强大的基于模板的容器库 通过直接使用这些现成的标准化组件可以大大提高算法设计的效率和可靠性 一 STL构成 Container 容器 Algorithm 算法 Iterator 迭代器 二 什么是
  • encoder decoder模型_Transformer 模型的 PyTorch 实现

    Google 2017年的论文 Attention is all you need 阐释了什么叫做大道至简 该论文提出了Transformer模型 完全基于Attention mechanism 抛弃了传统的RNN和CNN 我们根据论文的结
  • 【从零开始学c++】——类和对象(一)

    类和对象 面向过程和面向对象的初步认识 1 类的引入 1 1类的定义 1 2 类的两种定义方式 2 类的访问限定符及封装 2 1 访问限定符 2 2 class定义的类与struct定义的类的区别 2 3 封装 3 类的作用域 4 类的实例
  • 商业模式简单介绍

    商业模式 商业模式 1 B2C 企业对消费者 2 C2B 消费者 对企业 3 B2B 企业对企业 4 C2C 消费者 对消费者 5 o2o 线上线下 6 O2P营销模式 即Online To Place 是本地化的O2O营销模式 一 关联对
  • 1.编译时常量:const

    编译时常量只能在函数之外定义 就可以在编译期间初始了 不能定义在函数方法内 修饰符const不适用于 局部变量 const val PI 3 1415 定义编译时常量 TODO 10 Kotlin语言的编译时常量 编译时常量只能是常用的基本
  • SpringBoot项目多环境配置(亲测有效)

    SpringBoot项目多环境配置 SpringBoot项目在多环境配置上表现的非常优秀 只需要非常简单的操作就可以完成配置 一 认识配置文件 在创建项目后 会看到一个resources目录下有一个application propertie
  • React(6.5)路由系统

    路由系统 单页应用 SPA 的多页面切换 需要使用到路由功能 多个组件的路由和切换 使用路由 React中默认没有安装路由 需要手动安装 安装不指定版本默认是最新版本6 目前大多数项目可能还处于版本5 安装5版本npm install re
  • PCI 原理

    http baike baidu com link url sTevLlZN HI7Ls3 xbui2IvQBjNlTYst1MELXXmChISxZ55VMocg NdNwnCctbLa8RMIDWBw5PxY uvAxhUQ4E8vg8
  • 成功解决FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\DELL\\Anaconda3\\pkgs\\conda

    pycharm导入包总是报错如下 然后查了一下资料发现好像是源的问题 换个源试了一下好了 指令如下 pip install i https pypi tuna tsinghua edu cn simple trusted host pypi
  • Redis高级

    目录 redis介绍安装 介绍 安装 通用命令 五大数据类型 字符串 哈希 列表 集合 有序集合 高级用法 慢查询 pipline与事务 发布订阅 Bitmap HyperLogLog GEO地理位置信息 持久化 RDB方法 AOF方案 r
  • 地址映射与共享

    跟踪地址映射过程 1 通过命令 dbg asm启动调试器 在linux 0 11运行test c文件 使其进入死循环 我们的任务就是找到i的地址并将其修改为0使test c程序退出循环 2 在命令行输入crit c使Boch暂停 一般会显示
  • Selenium Python 自动化搭建及简单用例编写

    1 首先确定自己的浏览器的当前版本号 2 下载对应版本驱动 http chromedriver storage googleapis com index html 下载完成后直接复制到py的目录下 3 调用 简单三行代码就可以简单实现我们的
  • LeetCode 98. 验证二叉搜索树(C++)

    1 题目如下 给你一个二叉树的根节点 root 判断其是否是一个有效的二叉搜索树 有效 二叉搜索树定义如下 节点的左子树只包含 小于 当前节点的数 节点的右子树只包含 大于 当前节点的数 所有左子树和右子树自身必须也是二叉搜索树 示例 1
  • uni-app项目中使用scss语法

    最近正在学习uni app开发 我先把文档浅略翻了遍 发现组件和接口几乎都是按照微信小程序走 但是视图层上的语法又是按照vue的语法走的 所以开发过程一定要注意这点 然后我想在uni app项目中使用scss语法 但是具体怎么安装呢 历经曲
  • 优秀的内存规划方法——环形缓冲区(ring buffer)

    目录 什么是环形缓冲区 使用环形buffer的好处 环形buffer的使用场景 进程间通信 网络IO 区分缓冲区是满或者是空 计数 保持一个存储单元为空 镜像指示位 buffer满了之后的操作 实时流 存储流 什么是环形缓冲区 线性缓冲区
  • 数据库初级入门sqlite3版本

    0 数据库大纲 数据库是什么 如何在在命令行使用SQL语句操作数据库 如何在C C 程序中操作数据库 1 数据库和数据库管理系统及数据库系统 数据库是一个存储数据 电子化表格 的仓库 数据库 简单来说可以看做是一个电子化的文件柜 gt 存储
  • vue element select下拉框树形多选

    components 文件下新建 SelectTree文件 index vue SelectTree index vue