element-ui实现树形下拉选择及搜索功能(单个选择及多个选择)

4 篇文章 2 订阅

一、单个可选择(可以通过搜索框进行筛选)

例如:单个子级选择(任意层级可选)

<template>
 <div id="popup_tree_input">
    <el-popover ref="popover" :placement="placement" trigger="click">
      <el-input placeholder="请输入网点名称" v-model="filterText"> </el-input>
      <el-tree
        style="width: 300px; height: 400px; overflow: scroll"
        class="selectMultipleClass"
        :data="testData"
        :props="props"
        node-key="id"
        ref="popupTree"
        @current-change="currentChangeHandle"
        :default-expand-all="defaultExpandAll"
        :accordion="accordion"
        :highlight-current="highlightCurrent"
        :expand-on-click-node="true"
        check-strictly
        :filter-node-method="filterNode"
      >
      </el-tree>
    </el-popover>
    <el-input
      v-model="prop"
      v-popover:popover
      :readonly="true"
      :placeholder="placeholder"
      style="cursor: pointer; width: 280px"
    ></el-input>
  </div>
</template>
<script>
export default {
  name: "PopupTreeInput",
  props: {
    data: {
      type: Array,
      default: [],
    },
    props: {
      type: Object,
      default: {},
    },
    prop: {
      type: String,
      default: "",
    },
    nodeKey: {
      type: String,
      default: "",
    },
    placeholder: {
      type: String,
      default: "点击选择内容",
    },
    placement: {
      type: String,
      default: "bottom",
    },
    defaultExpandAll: {
      type: Boolean,
      default: false,
    },
    accordion: {
      type: Boolean,
      default: true,
    },
    highlightCurrent: {
      type: Boolean,
      default: true,
    },
    currentChangeHandle: {
      type: Function,
      default: null,
    },
  },
  data() {
    return {
      filterText: "",
      testData: [
        {
          name: "一级 1",
          children: [
            {
              name: "二级 1-1",
              children: [
                {
                  name: "三级 1-1-1",
                },
              ],
            },
          ],
        },
        {
          name: "一级 2",
          children: [
            {
              name: "二级 2-1",
              children: [
                {
                  name: "三级 2-1-1",
                },
              ],
            },
            {
              name: "二级 2-2",
              children: [
                {
                  name: "三级 2-2-1",
                },
              ],
            },
          ],
        },
        {
          name: "一级 3",
          children: [
            {
              name: "二级 3-1",
              children: [
                {
                  name: "三级 3-1-1",
                },
              ],
            },
            {
              name: "二级 3-2",
              children: [
                {
                  name: "三级 3-2-1",
                },
              ],
            },
          ],
        },
      ],
      defaultProps: {
        children: "children", //代表children为子级
        name: "name", //根据name渲染tree列表
      },
    };
  },
  watch: {
  	//监听输入框的内容(进行搜索)
    filterText(val) {
      this.$refs.popupTree.filter(val);
    },
  },
  methods: {
  	//对树节点进行筛选时执行的方法
    filterNode(value, data) {
      console.log(value);
      console.log(data);
      if (!value) return true;
      return data.name.indexOf(value) !== -1;
    },
  },
};
</script>

二、多个可选择(可以进行树形筛选及多个数量限制)

例如这样:可搜索可展开可多选

<el-input placeholder="请输入网点名称" v-model="filterText"></el-input>
<el-tree
    class="selectMultipleClass"
    :data="optionsOrgId"
    show-checkbox
    check-strictly
    :default-checked-keys="nodeOrgIdKey"
    node-key="id"
    :default-expand-all="defaultExpandAll"
    :accordion="accordion"
    :filter-node-method="filterNode"
    ref="orgTree"
    highlight-current
    @node-click="getCheckedKeys"
   @check-change="handleMultipleNodeClick"
  >
</el-tree>

<script>
export default {
  data() {
    return {
       filterText: "",
    };
  },
  watch: {
    filterText(val) {
      this.$refs.orgTree.filter(val);
    },
  },
  mounted() {
  },
  methods: {
  //根据输入框筛选
  filterNode(value, data) {
      if (!value) return true;
      return data.label.indexOf(value) !== -1;
    },
  //树形列表可选择的最大数量
     handleMultipleNodeClick(data, checked, node) {
      if (this.$refs.orgTree.getCheckedNodes().length > 5) {
        this.$message.error("最多选择5个");
      }   
    }  
  },
};
</script>
  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Element UI 是一套构建于 Vue.js 之上的组件库,提供了丰富的原生级视觉效果和响应式的组件供开发者创建用户界面。对于需要展示员工列表并允许用户进行选择的应用场景,Element UI 提供了“el-select”组件,这可以方便地集成到应用中用于选择功能。 下面是一个简单的使用 Element UI 的 el-select 组件来展示人员列表并实现单选或多选功能的 Demo: ### HTML 结构 首先,你需要在页面上放置一个包含人员数据的表格或者一个数组来存储员工信息,并利用 `el-select` 组件来展示和选择人员。 ```html <template> <div> <!-- 显示选择的人员 --> <p>已选择的人员:</p> <ul> <li v-for="selected in selectedPersons" :key="selected.id">{{ selected.name }}</li> </ul> <!-- 选择人员 --> <el-select v-model="selectedPerson" multiple placeholder="请选择人员"> <el-option v-for="person in persons" :key="person.id" :label="person.name" :value="person" ></el-option> </el-select> </div> </template> ``` ### JavaScript 逻辑 (Vue) 在这个例子中,我们假设已经有一个名为 `persons` 的变量,它包含了员工的数据结构如下: ```javascript const persons = [ { id: 1, name: '张三', department: '研发部' }, { id: 2, name: '李四', department: '市场部' }, // 更多员工... ]; ``` 接下来是在 Vue 实例中对这个组件的操作逻辑: ```javascript export default { data() { return { selectedPersons: [], selectedPerson: '', persons: persons, }; }, watch: { selectedPerson(newVal) { if (Array.isArray(newVal)) { this.selectedPersons = newVal; } }, }, }; ``` ### CSS 样式 为了使界面更美观,可以添加一些基本的样式规则: ```css /* 示例样式的添加 */ ul { list-style-type: none; padding: 0; } li { margin-bottom: 5px; } .el-select .el-input__inner { width: 200px; /* 可根据需要调整宽度 */ } ``` ### 功能说明 1. **显示已选择的人员**:当用户从下拉菜单中选择一个人员时,该人员的信息会被添加到已选择人员列表中,并实时更新。 2. **选择人员**:用户可以选择单个多个人员,通过点击 `el-select` 组件下的选项实现选择。 3. **多选设置**:使用 `multiple` 属性开启多选功能。 通过以上示例,你可以快速搭建起一个基础的选择人员的功能模块。当然,在实际应用中,还需要进一步考虑性能优化、错误处理、用户体验等方面的问题。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值