Vue3 el-select+el-tree组合+模糊搜索

<template>

  <el-select

    v-model="value"

    multiple

    placeholder="请选择"

    :popper-append-to-body="false"

    @remove-tag="removetag"

    collapse-tags

    @clear="clearall"

    clearable

    size="default"

  >

//模糊查询搜索框

  <el-input class="input" placeholder="输入单位名称"

  :prefix-icon="Search" v-model="treeFilter" size="mini" clearable style="width:100%" >

  </el-input>

    <el-option :value="selectTree" class="setstyle" disabled >

      <el-tree

         :data="list"

         ref="tree"

         show-checkbox

         node-key="id"

         :props="defaultProps"

         @check-change="handleNodeClick"

         :filter-node-method="filterNode"

       />

    </el-option>

  </el-select>

</template>

<script setup>

import { reactive, ref, nextTick,watch, onMounted } from 'vue';

import { Search} from '@element-plus/icons-vue'

import { axios } from "@src/assets/core";

/**选择器显示

const value = ref([]);

/**实际选择的值

const selectTree = ref([]);

const defaultProps = ref({ children: "children", label: "label" });

 const list = ref([

       {

         id: 3,

         label: "二级 2-1",

         children: [

           {

             id: 4,

             label: "三级 3-1-1"

           },

          {

            id: 5,

             label: "三级 3-1-2"

           },

         

         ]

      },

       {

        id: 2,

         label: "二级 2-2",

         children: [

           {

             id: 6,

             label: "四级 3-2-1"

           },

           {

             id: 7,

             label: "四级 3-2-2"

           },

           {

             id: 8,

             label: "五级 3-2-3"

           }

         ]

       },

       {

         id: 40,

         label: "二级 2-4",

       

       },

       {

         id: 50,

         label: "二级 2-5",

       

       },

       {

         id: 60,

         label: "二级 2-6",

              },

      {

         id: 70,

         label: "二级 2-7",

       

       },

     

 ]);

const tree = ref();

/**

 * 选中全部节点

 *

 */

function clickAll(){

  if(props.clickDepart.length<=0){

    value.value = departList.value.map(item=>{

     return item.label

    })

    selectTree.value = departList.value.map(item=>{

      return item.id

    })

     tree.value.setCheckedKeys(selectTree.value, false)

  }

  else{

    for(let i of props.clickDepart){

      for(let j of departList.value){

        if(j.id == i){

          value.value.push(j.label)

          selectTree.value.push(j.id)

        }

      }

    }

     tree.value.setCheckedKeys(selectTree.value, false)

  }

  putClickDepart()

}

/**

 * 点击选择框选择

 *

 */

function handleNodeClick(data, self, child) {

 let dataList=[]

 dataList[0]=data

 if(self == true){

   dataList.forEach(item => {

   if(item.children){

    for(let i of item.children){

      if(selectTree.value.indexOf(i.id)<0){

        selectTree.value.push(i.id);

        value.value.push(i.label);

      }

    }

   }

   if(!item.children){

      if(selectTree.value.indexOf(item.id)<0){

        selectTree.value.push(item.id);

        value.value.push(item.label);

      }

   }

  });

 }

 if(self == false && child == false){

     if(!dataList[0].children){

      if(selectTree.value.indexOf(dataList[0].id)>=0){

          value.value.splice(value.value.indexOf(dataList[0].label),1)

          selectTree.value.splice(selectTree.value.indexOf(dataList[0].id),1)

        }

      }

      else{

        for(let i of dataList[0].children){

            if(selectTree.value.indexOf(i.id)>=0){

              value.value.splice(value.value.indexOf(i.label),1)

              selectTree.value.splice(selectTree.value.indexOf(i.id),1)

            }

        }

      }

  }

}

/**

 *

 * 清除所有选择

 *

 */

function clearall() {

  selectTree.value = [];

  value.value = [];

  nextTick(() => {

    tree.value.setCheckedNodes([]);

  });

}

/**

 *

 * 监听模糊搜索

 */

watch(treeFilter, (val) => {

  tree.value.filter(val)

})

function filterNode(value,data) {

  if (!value) return true

  return data.label.includes(value)

}

</script>

<style scoped>

.setstyle {

  min-height: 200px;

  padding: 0 !important;

  margin: 0;

  overflow: auto;

  cursor: default !important;

}

</style>

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白d

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值