下拉框可筛选可树状多选组件

实际效果图片
在这里插入图片描述在这里插入图片描述

父页面

<el-form-item label="转发:" :label-width="formLabelWidth" class="formflex_item">
              <el-select ref="select" :clearable="true" @clear="clearSelect" @remove-tag="removeTagChange"  v-model="addForm.departmentList" placeholder="请选择" multiple collapse-tags style="width:220px">
                <el-popover
                  placement="right"
                  width="400"
                  trigger="click"
                  v-model="popover"
                >
                <div class="outer-container" @click="SelectVisible">
                  <div class="inner-container">
                      <div class="sel-input">
                        <el-input
                          placeholder="输入关键字进行过滤"
                          v-model="filterTextAll"
                          size="mini"
                          @click="intClick"
                          ref="inputRef"
                        >
                          <i slot="suffix" class="el-input__icon el-icon-search"></i>
                        </el-input>
                      </div>
                      <div class="repeatUserStyle">
                        <span>公司成员</span>
                      </div>
                      <!-- <el-option hidden v-for="item in branchList" :key="item.id" :value="item.id" :label="item.name+'——'+item.deptName" style="height: auto" /> -->
                      <el-tree
                        class="filter-tree"
                        :data="branchList2"
                        :props="defaultProps"
                        node-key="id"
                        show-checkbox
                        default-expand-all
                        :expand-on-click-node="true"
                        :filter-node-method="filterNodeAll"
                        @check-change="handleCheckChange"
                        @node-click="handleNodeClick"
                        @check="handleCheckClick"
                        ref="tree1"
                      >
                        <span slot-scope="{ data }">
                          <span>{{ data.deptName !== "全选" ? data.name+'——'+data.deptName : data.name}}</span>
                        </span>
                      </el-tree>
                    </div>
                  </div>
                  <div slot="reference" class="btnStyle">
                    <el-button size="mini">点击选择公司成员</el-button>
                  </div>
                </el-popover>

                <div class="sel-input">
                  <el-input
                    placeholder="输入关键字进行过滤"
                    v-model="filterText"
                    size="mini"
                  >
                    <i slot="suffix" class="el-input__icon el-icon-search"></i>
                  </el-input>
                </div>
                <div class="repeatUserStyle">
                  <span>常用转发人</span>
                  <el-tooltip class="item" effect="dark" content="点击添加常用转发人" placement="right">
                    <i class="el-icon-plus  cursor_pointer" @click="handleSetForwarderList"></i>
                  </el-tooltip>
                </div>
                <el-option hidden v-for="item in branchList" :key="item.id" :value="item.id" :label="item.name+'——'+item.deptName" style="height: auto" />
                  <el-tree
                    class="filter-tree"
                    :data="roleBoolean === true ? receiverList : forwardList2"
                    :props="defaultProps"
                    node-key="id"
                    show-checkbox
                    :default-expand-all="roleBoolean === true ? false : true"
                    :expand-on-click-node="true"
                    :filter-node-method="filterNode"
                    @check-change="handleCheckChange"
                    ref="tree"
                  >
                    <!-- :check-strictly="systemNodeFlag" -->
                  </el-tree>
              </el-select>
            </el-form-item>

代码部分

export default {
  data() {
    return {
	   	  filterText: "",
	      filterTextAll: "",
	      defaultProps: {
	        value: "id",
	        label: "name"
	      },
	      // 常用转发人数据
	      forwardList2: [{
	        id: "全选",
	        name: "全选",
	        string: "常用转发人",
	        deptName: "全选",
	        children: []
	      }],
	      branchList2: [{
	        id: "全选",
	        name: "全选",
	        string: "公司成员",
	        deptName: "全选",
	        children: []
	      }],
	      selectedData: [], // 选中的节点
			receiverList: [{
	        id: "全选",
	        name: "市局领导",
	        string: "常用转发人",
	        deptName: "全选",
	        children: []
	      },{
	        id: "全选",
	        name: "部门领导",
	        string: "常用转发人",
	        deptName: "全选",
	        children: []
	      },{
	        id: "全选",
	        name: "县局领导",
	        string: "常用转发人",
	        deptName: "全选",
	        children: []
	      },{
	        id: "全选",
	        name: "其他",
	        string: "常用转发人",
	        deptName: "全选",
	        children: []
	      }]
	    };
	},
	computed: {
   	 	...mapGetters(["permission", "userInfo"]),
  	},
  	watch: {
	    objId(newVal) {
	      console.log(this.objId);
	      this.fileParams.objectId = newVal;
	    },
	    //常用转发人,通过监听方式来代替focus(),
	    //this.$refs.tree.filter(val);触发el-tree的filterNode过滤属性
	    filterText(val) {
	      this.$refs.tree.filter(val);
	    },
	    //
	    filterTextAll(val) {
	      this.$refs.tree1.filter(val);
	    },
	    // 过滤
	    filterNode(value, data) {
	      console.log("filterNode",value)
	      if (!value) return true;
	      return data.name.indexOf(value) !== -1;
	    },
	    filterNodeAll(value, data) {
	      if (!value) return true;
	      let filterRes = data.name.indexOf(value) !== -1 || data.deptName.indexOf(value) !== -1;
	      return filterRes
	    },
	     // 点击tree组件的复选框节点触发
    handleCheckChange(data,checked) {
      if(checked === true) {
        if(data.id !== "全选") {
          this.addForm.departmentList.push(data.id)
          if(this.addForm.departmentList)
          this.SetArray(this.addForm.departmentList)
          this.$refs.tree.setChecked(data.id, true)
          this.$refs.tree1.setChecked(data.id, true)
        } else {
          // 解决过滤全选后的bug
          if(data.string === "常用转发人") {
            let checkKeys = this.$refs.tree.getCheckedKeys()
            checkKeys.forEach((i, n) => {
              let node = this.$refs.tree.getNode(i)
              if(!node.visible && node.checked) {
                this.$refs.tree.setChecked(i, false)
              }
            })
          } else {
            let checkKeys = this.$refs.tree1.getCheckedKeys()
            checkKeys.forEach((i, n) => {
              let node = this.$refs.tree1.getNode(i)
              if(!node.visible && node.checked) {
                this.$refs.tree1.setChecked(i, false)
              }
            })
          }
        }
        // this.$refs.tree.
      } else {
        if(this.addForm.departmentList.includes(data.id)) {
          this.addForm.departmentList.forEach((item, index, arr) => {
            if(item === data.id) {
              arr.splice(index, 1)
            }
          })
          this.$refs.tree.setChecked(data.id, false)
          this.$refs.tree1.setChecked(data.id, false)
        }
      }

      // if(data.id !== "全选") {
      //   this.$refs.select.toggleMenu()
      // } else {
      //   this.popover = false
      // }
    },
    // 下拉框清除项触发
    removeTagChange(val) {
      this.$refs.tree.setChecked(val, false)
      this.$refs.tree1.setChecked(val, false)
      this.$refs.select.blur()
      this.popover = false
    },
    // 点击删除全部
    clearSelect() {
      this.$refs.tree.setCheckedKeys([])
      this.$refs.tree1.setCheckedKeys([])
      this.addForm.departmentList = []
      this.popover = false
    },
    intClick() {
      this.$refs.inputRef.focus()
    },
    // 去重
    SetArray(arr) {
      this.addForm.departmentList = Array.from(new Set(arr))
    },
    // 添加常用转发人
    handleSetForwarderList() {
      this.dialogTableVisible = false
      this.popover = false
      this.$refs.select.blur()
      let id = this.$store.getters.userInfo.user_id
      this.formInline={
          companyId:"",
            deptId:"",
            realName:"",
            roleId:""
        };
        getForwarderList(id, this.formInline1).then(res => {
          this.forwarder.forwarderList = res.data.data;
          this.forwarder.forwarderModel = true;
          this.forwarder.userName = "";
          this.forwarder.id = id;
          this.forwarder.selectionList = [];
        })
      this.getCompanyDept()
    },
    getCompanyDept(){
      let vm = this
      companyOrDept(vm.formInline1.companyId).then(res =>{
        if(vm.formInline1.companyId === "" || vm.formInline1.companyId === null){
          vm.companyList = res.data.data;
          let col = {
            id: "",
            deptName: ""
          };
          vm.companyList.unshift(col);
          vm.deptList = [];
          vm.formInline1 = {
            companyId:"",
            deptId:"",
            realName: vm.formInline1.realName,
            roleId:vm.ids,
          }
        }else {
          vm.deptList = res.data.data;
          let col = {
            key: "",
            name: ""
          };
          vm.deptList.unshift(col);
        }
      });
    },
    //条件查询未添加到转发人员的列表
    searchForwarderList(){
      let that = this;
      getForwarderList(that.forwarder.id, that.formInline1).then(res => {
        that.forwarder.forwarderList = res.data.data;
      }).then(() => {
        //将已选择的数据选中
        for(var i=0;i<that.forwarder.forwarderList.length;i++){
          that.forwarder.selectionList.forEach(function(item){
            if(item.id === that.forwarder.forwarderList[i].id){
              that.$refs.table.toggleRowSelection(that.forwarder.forwarderList[i],true);
            }
          })
        }
      });
    },
    //添加转发人员
    addForwarder(){
      let that = this;
      //将已选人员id拼接
      var idList = "";
      that.forwarder.selectionList.forEach(function(item){
        idList = idList + item.id + ",";
      })
      addForwarder(that.forwarder.id, idList).then(res => {
        that.forwarder.forwarderModel = false;
        this.getForwardList()
        this.getCode()
        that.$message({
          type: "success",
          message: "操作成功!"
        });
      });
    },
    //selection状态修改(取消、选中)
    forwarderChange(selection, row){
      let that = this;
      //判断该数据是选中还是取消
      if(that.forwarder.selectionList == [] || that.forwarder.selectionList == undefined || that.forwarder.selectionList == null){
        that.forwarder.selectionList = [];
        that.forwarder.selectionList.push(row);
        return;
      }
      var i = 0;
      for(; i < that.forwarder.selectionList.length; i++){
        if(row.id == that.forwarder.selectionList[i].id){
          break;
        }
      }
      if(i == that.forwarder.selectionList.length){
        that.forwarder.selectionList.push(row);
      }else{
        if(that.forwarder.selectionList.length == 1){
          that.forwarder.selectionList = [];
        }else{
          that.forwarder.selectionList.splice(i, 1);
        }
      }
    },
    //全选未添加转发人员
    selectAll(selection){
      let that = this;
      if(selection != undefined){
        that.forwarder.selectionList = [];
        if(selection != []){
          that.forwarder.forwarderList.forEach(function(item){
            that.forwarder.selectionList.push(item);
          })
        }
      }
    },
    SelectVisible() {
      this.$refs.select.toggleMenu()
      this.$refs.inputRef.focus()
    },
    handleNodeClick() {
      this.$refs.select.toggleMenu()
    },
    handleCheckClick() {
      this.$refs.select.toggleMenu()
    },
    // 获取转发人权限
    getRole() {
      // 获取转发人的权限
      let userRoles = JSON.parse(localStorage.getItem("saber-userDetails")).content.roleAlias
      userRoles = userRoles.split(',')
      let roleArr = ['ROLE_COMPANY_BOSS','admin','ROLE_COMPANY_CS','ROLE_DEPART_BOSS']
      this.roleBoolean = userRoles.some(item => {
        return roleArr.includes(item) === true
      })
      if(this.roleBoolean === true) {
        this.getRolesList()
      }
    },
    getRolesList() {
      getReceiverList().then(res => {
        let obj = res.data.data
        this.receiverList[0].children = obj.市局领导
        this.receiverList[1].children = obj.部门负责人
        this.receiverList[2].children = obj.县局领导
        this.receiverList[3].children = obj.其他
      }).catch(() => {
        this.$message.error('获取常用转发人数据失败!')
      })
    }
  },
  },
	

拆分的组件:

<template>
  <div>
    <!-- 树形下拉框 -->
    <el-select style="width: 100%" ref="select" :multiple="multiple" :clearable="true" @remove-tag="handleRemoveTag" @clear="handleClear" v-model="companyId">
        <div class="sel-input">
            <el-input
            placeholder="输入关键字进行过滤"
            v-model="filterText"
            size="mini"
            >
                <i slot="suffix" class="el-input__icon el-icon-search"></i>
            </el-input>
        </div>
        <el-option v-if="mineStatusValue.length == 0" hidden key="id" :value="selectVal" :label="selectName"></el-option>
        <el-option v-else hidden v-for="(item, index) in mineStatusValue" :key="index" :label="parentLableVisble ? (item.parentLable + '——' + item[defaultProps.label]) : item[defaultProps.label]" :value="item[defaultProps.id]"></el-option>
        <el-tree
            :data="receiverList"
            :props="defaultProps"
            :node-key="defaultProps.id"
            :show-checkbox="multiple"
            :expand-on-click-node="true"
            :filter-node-method="filterNode"
            @check="handleCheckChange"
            @node-click="clickUnitTreeNode"
            ref="tree"
        >
        </el-tree>
    </el-select>
  </div>
</template>

<script>
export default {
    props: {
        // 树形结构数据
        receiverList: {
            type: Array,
            require: true,
            default: () => []
        },
        // 树形结构默认配置
        defaultProps: {
            type: Object,
            default: () => {
                return {
                    children: 'children',
                    label: 'label',
                    id: 'id'
                }
            }
        },
        // 是否多选
        multiple: {
            type: Boolean,
            default: () => {
                return false;
            }
        },
        // selectInput绑定的值
        companyId: {
            type: [Array, String, Number],
            default: ''
        },
        // 是否变成特殊结构:"XX"——"XX"
        parentLableVisble: {
            type: Boolean,
            default: false
        }
    },
    watch: {
        filterText(val) {
            this.$refs.tree.filter(val);
        }
    },
    data () {
        return {
            filterText: '',
            mineStatusValue: []
        }
    },
    methods: {
        // 树形结构数据过滤
        filterNode(value, data) {
            if (!value) return true;
            return data[this.defaultProps.label].indexOf(value) !== -1;
        },
        // 多选方法
        handleCheckChange(data) {
            if(!this.multiple) {
                return
            }
            let res = this.$refs.tree.getCheckedNodes(true)
            let key = this.$refs.tree.getCheckedKeys(true)
            this.mineStatusValue = res;
            // 全选 全选这里有个bug 记得在外面写方法是时候写一个去重方法
            if(data.children && data.children.length > 0) {
                data.children.forEach(items => {
                    let a = this.mineStatusValue.some(item => item.value === items.value)
                    if(a) {
                        this.$emit('handleCheckChange', key, items)
                        return
                    }
                    this.handleRemoveTag(items.value)
                })
                return
            }
            let a = this.mineStatusValue.some(item => item.value === data.value)
            if(a) {
                this.$emit('handleCheckChange', key, data)
                return
            }
            this.handleRemoveTag(data.value)
        },
        handleRemoveTag(value) {
            this.$refs.tree.setChecked(value, false);
            let res = this.$refs.tree.getCheckedNodes(true)
            this.mineStatusValue = res;
            this.$emit('handleRemoveTag', value)
        },
        handleClear() {
            if(this.multiple) {
                this.$refs.tree.setCheckedKeys([]);
            }
            this.mineStatusValue = []
            this.$emit('handleClear')
        },
        handleSelect(value) {
            this.$refs.tree.setCheckedKeys(value)
            let res = this.$refs.tree.getCheckedNodes(true)
            this.mineStatusValue = res;
        },
        // 单选方法
        clickUnitTreeNode(data) {
            if(this.multiple) {
                return
            }
            if(data && !data.children) {
                if(this.mineStatusValue.length === 0 || !(this.mineStatusValue.some(item => item.value === data.value))) {
                    this.mineStatusValue.push(data)
                }
                this.$emit('clickUnitTreeNode', data)
            }
        }
    }
}
</script>

<style lang="scss" scoped>
.sel-input {
    margin: 5px;
}
::v-deep.el-select .el-tag__close.el-icon-close {
    background-color: #C0C4CC;
    right: -7px;
    top: -6px;
}
</style>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UI设计工具都有哪些好用的推荐?

对于UI设计的初学者来说&#xff0c;掌握一个实用且易于使用的界面UI软件是非常重要的。今天&#xff0c;我整理了四个易于使用的界面UI软件。让我们看看。 即时设计 即时设计是一款免费的在线 UI 设计工具&#xff0c;无系统限制&#xff0c;浏览器打开即可使用&#xff0c;…

Kubernetes 的核心概念:Pod、Service 和 Namespace 解析

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

HTML及其标签详解

文章目录 一、HTML简介1、网页1>什么是网页2>什么是HTML 2、Web标准1>为什么需要Web标准2>Web标准的构成 3、HTML语法规范1>基本语法2>标签关系 二、HTML标签1、基本标签2、标题标签3、段落和换行标签4、文本格式化标签5、< div>和< span>标签6、…

linux下的questasim安装和与vivado的关联

一、questasim安装 参考链接 IC验证工具&#xff1a;Ubuntu下Questasim10.7安装&#xff08;64bit&#xff09;全攻略 参考2 易特创芯 linux环境下questasim 10.7的安装总结_limanjihe的博客-CSDN博客 前面操作参照的第一个链接&#xff0c;后面激活文件参考的第二个 另外…

生成式人工智能新政策发布:AI进入规范时代!

最近&#xff0c;国家发布了《生成式人工智能服务管理暂行办法》。该条例于8月15日开始施行&#xff0c;使得AI应用进入规范化管理。该法明确了适用于提供生成文本、图片、音频、视频等内容的服务&#xff0c;鼓励人工智能技术在各行业、各领域的创新应用&#xff0c;生成积极健…

flask中redirect、url_for、endpoint介绍

flask中redirect、url_for、endpoint介绍 redirect 在 Flask 中&#xff0c;redirect() 是一个非常有用的函数&#xff0c;可以使服务器发送一个HTTP响应&#xff0c;指示客户端&#xff08;通常是浏览器&#xff09;自动导航到新的 URL。基本上&#xff0c;它是用来重定向用…

Java 设计模式——原型模式

目录 1.概述2.结构3.实现3.1.浅拷贝3.2.深拷贝3.2.1.通过对象序列化实现深拷贝&#xff08;推荐&#xff09;3.2.2.重写 clone() 方法来实现深拷贝 4.优缺点5.使用场景 1.概述 &#xff08;1&#xff09;原型模式 (Prototype Pattern) 是一种创建型设计模式&#xff0c;是通过…

网页开发基础——HTML

一、flask框架 Flask是一种轻量级的Python web应用程序框架&#xff0c;可以帮助使用者快速构建Web应用程序和API。由于其简洁、灵活和易于上手的特点&#xff0c;Flask被广泛用于开发小型到中型的Web应用程序和后端API。本次我们主要是使用flask框架&#xff0c;进行一个小型w…

知网的caj格式怎么转化成pdf格式?两个方法简单快捷!

在使用知网等学术资源时&#xff0c;我们常常会遇到CAJ格式的文件&#xff0c;然而CAJ格式并不是常见的文件格式&#xff0c;给我们的查阅和分享带来一些不便。为了更方便地处理这些文件&#xff0c;我们可以将其转换为常见的PDF格式。在本文中&#xff0c;我将为您介绍两种简单…

超标量处理器寄存器rename

1.相关性介绍 在CPU中&#xff0c;一段程序会被编译成一连串的汇编指令&#xff0c;指令与指令之间可能会具有相关性&#xff08;dependency&#xff09;。所谓相关性&#xff0c;即一条指令的执行会依赖于另一条指令的结果&#xff0c;相关性可以分为&#xff1a;① 数据相关性…

Pycharm中如何设置在新窗口打开项目

settingAppearance&Behavior–System SettingsOpen project in - new window

年出货2亿台,只赚“辛苦钱”!又一家代工巨头押宝汽车电子

7月20日&#xff0c;作为国内ODM龙头之一的华勤技术正式启动招股&#xff0c;拟在上交所主板上市。此前&#xff0c;因技术先进性、科创属性不足等问题&#xff0c;该公司终止科创板IPO。 华勤技术成立于2005年&#xff0c;几年后赶上了全球智能手机的黄金时代&#xff0c;招股…

系统集成|第三章(笔记)

目录 第三章 系统集成专业技术3.1 信息系统建设3.1.1 信息系统3.1.2 信息系统集成 3.2 信息系统设计3.3 软件工程3.4 面向对象系统分析与设计3.5 软件架构3.5.1 软件的架构模式3.5.2 软件中间件 3.6 典型应用集成技术3.6.1 数据库与数据仓库技术3.6.2 Web Services 技术3.6.3 J…

3 Linux基础篇-VMware和Linux的安装

3 Linux基础篇-VMware和Linux的安装 文章目录 3 Linux基础篇-VMware和Linux的安装3.1 安装VMware和CentOS3.1.1 VM安装3.1.2 Centos7.6的安装步骤 3.3 虚拟机基本操作3.4 安装VMtools3.5 设置共享文件夹 学习视频来自于B站【小白入门 通俗易懂】2021韩顺平 一周学会Linux。可能…

无涯教程-jQuery - unbind()方法函数

unbind([type]&#xff0c;[fn])方法的作用与bind相反&#xff0c;它从每个匹配的元素中删除绑定事件。 unbind( [type], [fn] ) - 语法 selector.unbind( [type], [fn] ) 这是此方法使用的所有参数的描述- type - 一种或多种事件类型&#xff0c;以空格分隔。 fn …

rust学习-智能指针

适用场景 有一个在编译时未知大小的类型&#xff0c;想在需要确切大小的上下文使用该类型值 示例1 无意义的例子&#xff1a;将一个单独的值存放在堆上并不是很有意义&#xff0c;b更应该放到栈上 fn main() {let b Box::new(5);// box 在 main 的末尾离开作用域时&#x…

Visual Studio 2022 程序员必须知道高效调试手段与技巧(中)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 &#x1f4cb; 前言&#x1f4ac; 调试的时候查看程序当前信息&#x1f4ad; 查看临时变量的值&#x1f4ad; 查…

NISP二级考试安排(2023年7月-12月)

国家信息安全水平考试&#xff08;NISP&#xff09;认证分为一级和二级&#xff0c;证书由 中国信息安全测评中心 颁发&#xff0c;只有考取NISP一级证书才能考取NISP二级。NISP与CISP无缝对接。CISP需要工作经验所以在校生无法报考&#xff0c;NISP填补了在校大学生无法考取CI…

【TI毫米波雷达笔记】IWR6843AOP工程模板创建 cannot find file “libsleep_xwr68xx.aer4f“等解决方案

【TI毫米波雷达笔记】IWR6843AOP工程模板 cannot find file “libsleep_xwr68xx.aer4f” 解决方案 我在建立工程时 发现了一个问题 参考&#xff1a; blog.csdn.net/qq_16660871/article/details/126246572报错为 cannot find file "libsleep_xwr68xx.aer4f"最后检…

在命令行模式、eclipse console下执行Java程序输入中文的几种情况尝试

介绍 在命令行模式下执行Java程序&#xff0c;如果输入中文&#xff0c;经常会出现和代码中的解码字符集不匹配的情况&#xff0c;导致结果不正确。 在命令行模式下执行Java程序&#xff0c;输入中文&#xff0c;其实是用某种字符集编码成字节流&#xff0c;Java程序读取该字节…