vxe-select 下拉框实现人员选择

在实际业务中,下拉选择人员是一个常见需求。本文介绍如何使用 vxe-select 组件实现一个带头像、状态标签、多选、搜索等功能的人员选择器。

效果

  • 多选、清空、筛选
  • 自定义选项模板(头像 + 姓名 + 状态标签)
  • 下拉框尺寸定制
  • 状态映射(离职/试用期)

代码

html 复制代码
<template>
  <div>
    <vxe-select v-model="val1" v-bind="selectOptions">
      <template #option="{ option }">
        <div class="user-select-item">
          <img :src="option.url" class="user-select-img" />
          <span class="user-select-name">
            <span>{{ option.label }}</span>
            <span v-if="option.status" :class="['user-select-status', option.status]">{{
              getUserStatus(option.status)
            }}</span>
          </span>
        </div>
      </template>
    </vxe-select>
  </div>
</template>

<script setup>
import { reactive, ref } from 'vue'

const val1 = ref()

const selectOptions = reactive({
  multiple: true,
  filterable: true,
  clearable: true,
  showCheckbox: true,
  showCloseButton: true,
  placeholder: '人员选择',
  optionConfig: {
    height: 40
  },
  popupConfig: {
    width: 300,
    height: 420
  },
  options: [
    {
      label: '张三',
      value: '1',
      status: 'dimission',
      url: 'https://vxeui.com/resource/avatarImg/avatar1.jpeg'
    },
    {
      label: '小明',
      value: '2',
      status: '',
      url: 'https://vxeui.com/resource/avatarImg/avatar2.jpeg'
    },
    {
      label: '老刘',
      value: '3',
      status: 'trial',
      url: 'https://vxeui.com/resource/avatarImg/avatar3.jpeg'
    },
    {
      label: '李四',
      value: '4',
      status: '',
      url: 'https://vxeui.com/resource/avatarImg/avatar4.jpeg'
    },
    {
      label: '老六',
      value: '5',
      status: 'trial',
      url: 'https://vxeui.com/resource/avatarImg/avatar5.jpeg'
    },
    {
      label: '王五',
      value: '6',
      status: '',
      url: 'https://vxeui.com/resource/avatarImg/avatar6.jpeg'
    },
    {
      label: '小陈',
      value: '7',
      status: '',
      url: 'https://vxeui.com/resource/avatarImg/avatar7.jpeg'
    },
    {
      label: '老徐',
      value: '8',
      status: 'dimission',
      url: 'https://vxeui.com/resource/avatarImg/avatar8.jpeg'
    },
    {
      label: '小瑞',
      value: '9',
      status: '',
      url: 'https://vxeui.com/resource/avatarImg/avatar9.jpeg'
    },
    {
      label: '小马',
      value: '10',
      status: '',
      url: 'https://vxeui.com/resource/avatarImg/avatar10.jpeg'
    },
    {
      label: '小徐',
      value: '11',
      status: 'trial',
      url: 'https://vxeui.com/resource/avatarImg/avatar11.jpeg'
    },
    {
      label: '小三',
      value: '12',
      status: 'dimission',
      url: 'https://vxeui.com/resource/avatarImg/avatar12.jpeg'
    },
    {
      label: '老李',
      value: '13',
      status: '',
      url: 'https://vxeui.com/resource/avatarImg/avatar13.jpeg'
    },
    {
      label: '小四',
      value: '14',
      status: '',
      url: 'https://vxeui.com/resource/avatarImg/avatar14.jpeg'
    },
    {
      label: '小李',
      value: '15',
      status: 'trial',
      url: 'https://vxeui.com/resource/avatarImg/avatar15.jpeg'
    }
  ]
})
const getUserStatus = (status) => {
  switch (status) {
    case 'dimission':
      return '离职'
    case 'trial':
      return '试用期'
  }
  return ''
}
</script>

<style lang="scss" scoped>
.user-select-item {
  position: relative;
  height: 40px;
  display: flex;
  flex-direction: row;
  align-items: center;
}
.user-select-img {
  width: 30px;
  height: 30px;
  border-radius: 50%;
}
.user-select-name {
  padding-left: 5px;
}
.user-select-status {
  font-size: 12px;
  position: absolute;
  top: 0;
  padding-left: 5px;
  &.dimission {
    color: red;
  }
  &.trial {
    color: orange;
  }
}
</style>

说明

  • 动态数据源:将 options 替换为 API 请求,结合 filterable 实现远程搜索。
  • 性能优化:如果人员数量较大(>1000),建议使用 virtual-scroll 虚拟滚动

vxeui.com

相关推荐
Bug收容所2 小时前
Vue+JS Day3
前端·javascript·vue.js·前端框架·1024程序员节
用户831348593069820 小时前
Vue3 v-for:常用用法与开发高频坑点
前端·javascript·vue.js
林恒smileZAZ1 天前
用 Vue 3 + Electron 做桌宠:从启动退出到拖拽、单击与鼠标穿透
vue.js·electron·计算机外设
软件技术NINI1 天前
基于JavaWeb 汽车租聘
java·vue.js·spring boot·后端·python·毕业设计·毕设
2301_32241428041 天前
基于SpringBoot+Vue的休闲零食超市管理系统的设计与实现59004-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·vue.js·spring boot·redis·mysql·决策树·推荐算法
酷炫码神2 天前
Day 8|Vue3 响应式:告别手动操作 DOM,让数据驱动界面
javascript·vue.js·ecmascript
星光不问赶路人2 天前
Vue 3 对象监听与快照:ref 和 reactive 的关键差异
前端·vue.js
稻草人4782 天前
Vue3.0项目创建步骤
vue.js
Bug收容所2 天前
Vue+js Day2
前端·javascript·vue.js
honkun62 天前
vue 下拉树组件 vxe-table-select 实现分页多选
前端·javascript·vue.js