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

这篇具有很好参考价值的文章主要介绍了下拉框可筛选可树状多选组件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实际效果图片
下拉框可筛选可树状多选组件,vue.js,前端,javascript下拉框可筛选可树状多选组件,vue.js,前端,javascript

父页面

<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>

代码部分文章来源地址https://www.toymoban.com/news/detail-609437.html

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>

到了这里,关于下拉框可筛选可树状多选组件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端Vue自定义商品评价页面单选多选标签tags组件单选多选按钮选择器picker组件

    随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身。 通过组件化开发,可以有效实现单独开发,单独维护,而且他们之间可以随

    2024年02月16日
    浏览(50)
  • Selenium教程06:单选框+多选框+下拉框组件的示例练习

    1.Radio单选框的示例用法,通过网页元素class和type属性多条件共同定位元素,模拟依次选中Android,Apple,Windows。 网页元素结构 实现代码:单选比较好操作,先定位需要单选的某个元素,然后点击一下即可。 写法2:也可以根据网页元素中的span标签定位,Android 2.Checkbox多选框的

    2024年02月02日
    浏览(48)
  • el-select 下拉框全选、多选的几种方式组件

    组件一、 基础多选 适用性较广的基础多选,用 Tag 展示已选项 为 el-select 设置 multiple 属性即可启用多选,此时 v-model 的值为当前选中值所组成的数组。默认情况下选中值会以 Tag 的形式展现,你也可以设置 collapse-tags 属性将它们合并为一段文字。  组件二、el-select 下拉框多

    2024年02月07日
    浏览(30)
  • 前端vue简单好用的上拉加载下拉刷新组件,支持列表分页 本地分页

    前端vue简单好用的上拉加载下拉刷新组件,支持列表分页 本地分页, 阅读全文下载完整代码请关注微信公众号: 前端组件开发 效果图如下:         #### 使用方法 ```使用方法 !-- pullDown:下拉刷新 back-top: 回到顶部  -- ccPullScroll class=\\\"pullScrollView\\\" ref=\\\"pullScroll\\\" :back-top=\\\"true\\\" :pullDo

    2024年02月08日
    浏览(46)
  • vue element select下拉框树形多选

    components 文件下新建 SelectTree文件 index.vue SelectTree index.vue 使用:

    2024年02月13日
    浏览(35)
  • vue2+elementUI 下拉树形多选框

    效果如图所示:  1.新建el-select-tree.vue组件 2.页面引入组件使用

    2024年02月12日
    浏览(33)
  • Vue3 实现下拉选择框多选的功能实现

    项目采用vue3+elmentui-plus +ts 搭建成的。用户界面设计上需要一个带全选的下拉选择框。而element plus 官网 提供的下拉多选框是 这种形式是没有全选按钮的,并且样式也不符合想像中的全选的操作。故开始想法子去结合一个新的条件去封装一个新的组件。 由于用户更加热衷于带

    2024年02月12日
    浏览(28)
  • element ui多选下拉组件(el-select)tag数量过多处理解决办法(二次封装)

    如下图所示,当标签选择过多时,会占用过多空间 期待效果:超过n行就自动省略,并可以进行展开收起,下图是实现后的效果图 实现分析: 通过extends继承el-select组件 将select源码的template部分粘贴到封装的组件中,以此来操作展开、收起等需要操作dom的部分 监听selected(已选择

    2024年02月13日
    浏览(31)
  • Bootstrap select2之下拉框可自定义输入和选择

    1. 引入css文件 2. 引入js文件 3. select标签引入class 我是在项目搜索框部分要加一个下拉框,本来甚至不需要上面那么多引入,都可以有一个下拉框,但是要求点击可以出现输入框自定义输入来筛选,然后想到了这个。但是想要利用表单来实现,因为不是一种表单,所以样式混乱

    2024年02月05日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包