news 2026/4/23 16:28:31

搜索角色+下拉选择+添加到列表(带‘新增’标签)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
搜索角色+下拉选择+添加到列表(带‘新增’标签)

要实现“搜索角色+下拉选择+添加到列表(带‘新增’标签)”的功能,可基于Vue+Element UI封装组件,以下是贴合截图效果的完整实现:

一、Vue组件代码(RoleAddWithNewTag.vue)

<template> <div class="role-container"> <!-- 已选角色列表(含“新增”标签) --> <div class="selected-role-item" v-for="(item, index) in selectedRoles" :key="index"> <!-- 角色名 + 新增标签 --> <span class="role-name"> {{ item.roleName }} <el-tag size="mini" type="info" v-if="item.isNew">新增</el-tag> </span> <!-- 人员选择框 --> <el-select v-model="item.userId" placeholder="待填" style="width: 120px; margin-left: 10px;" @change="updateUserName(item, $event)" > <el-option v-for="user in userList" :key="user.userId" :label="user.nickName" :value="user.userId" /> </el-select> </div> <!-- 添角色按钮 + 搜索下拉框 --> <div class="add-role-area" style="margin-top: 10px;"> <el-button type="primary" icon="el-icon-plus" @click="showRolePopover = true" size="mini" > 添加角色 </el-button> <!-- 搜索+下拉角色列表(Popover) --> <el-popover v-model="showRolePopover" trigger="manual" placement="bottom-start" width="200" style="margin-left: 10px;" > <el-input v-model="searchKey" placeholder="搜索角色名称" prefix-icon="el-icon-search" @input="filterRoles" size="mini" /> <div class="role-option-list" style="max-height: 200px; overflow-y: auto; margin-top: 5px;"> <div class="role-option-item" v-for="role in filteredRoles" :key="role.roleCode" @click="selectRole(role)" > {{ role.roleName }} </div> <div class="no-data" v-if="filteredRoles.length === 0">无匹配角色</div> </div> </el-popover> </div> </div> </template> <script> import { getRoleDict, listUser } from "@/api/project/role"; // 后端接口 export default { name: "RoleAddWithNewTag", data() { return { allRoles: [], // 所有角色字典(后端获取:{roleCode: 'RD', roleName: '研发'}) filteredRoles: [], // 搜索过滤后的角色列表 searchKey: "", // 角色搜索关键词 showRolePopover: false, // 角色下拉框显隐 selectedRoles: [], // 已选角色列表(含isNew标记) userList: [] // 系统用户列表(人员选择) }; }, created() { this.loadBaseData(); }, methods: { // 加载角色字典+系统用户 async loadBaseData() { // 1. 加载所有角色(后端字典接口) const roleRes = await getRoleDict(); this.allRoles = roleRes.data; this.filteredRoles = [...this.allRoles]; // 2. 加载系统用户(人员选择项) const userRes = await listUser({ pageSize: 200 }); this.userList = userRes.data.rows; }, // 搜索过滤角色 filterRoles() { if (!this.searchKey) { this.filteredRoles = [...this.allRoles]; return; } this.filteredRoles = this.allRoles.filter(role => role.roleName.includes(this.searchKey.trim()) ); }, // 选择下拉中的角色 selectRole(role) { // 1. 去重校验:已选角色不能重复 const isDuplicate = this.selectedRoles.some( item => item.roleCode === role.roleCode ); if (isDuplicate) { this.$message.warning("该角色已添加"); this.showRolePopover = false; return; } // 2. 添加到已选列表,并标记“新增” this.selectedRoles.push({ ...role, userId: null, // 人员ID(待填) userName: "", // 人员名称(待填) isNew: true // 标记为新增角色 }); // 3. 重置搜索+关闭下拉框 this.searchKey = ""; this.showRolePopover = false; }, // 选择人员后更新名称 updateUserName(item, userId) { const selectedUser = this.userList.find(u => u.userId === userId); item.userName = selectedUser ? selectedUser.nickName : ""; } } }; </script> <style scoped> .selected-role-item { display: flex; align-items: center; margin-bottom: 8px; } .role-name { display: inline-flex; align-items: center; width: 100px; } .role-option-item { padding: 6px 10px; cursor: pointer; font-size: 14px; } .role-option-item:hover { background-color: #f5f7fa; } .no-data { padding: 6px 10px; color: #999; font-size: 14px; } </style>

二、核心功能说明

  1. 下拉搜索&选择

    • 点击「添加角色」弹出el-popover,内含搜索框+角色列表;
    • 输入关键词实时过滤角色,点击角色项完成选择。
  2. 去重校验

    • 选择角色前,检查selectedRoles中是否已有相同roleCode的角色,避免重复添加。
  3. “新增”标签显示

    • 给新添加的角色项增加isNew: true标记,通过el-tag渲染“新增”标签。
  4. 人员选择

    • 每个已选角色右侧显示「待填」选择框,关联系统用户列表,选择后自动填充人员名称。

三、后端接口适配(角色字典示例)

若后端getRoleDict接口返回的角色数据格式为:

[{"roleCode":"RD","roleName":"研发"},{"roleCode":"UI&UX","roleName":"UI&UX设计"},{"roleCode":"PM","roleName":"项目经理"},{"roleCode":"FE","roleName":"前端开发"},{"roleCode":"Server","roleName":"服务端开发"}]

则组件可直接兼容,无需额外修改。

四、组件使用方式

在“新建需求”等页面中直接引入该组件即可:

<template> <div> <label>角色与人员</label> <role-add-with-new-tag /> </div> </template> <script> import RoleAddWithNewTag from "@/components/RoleAddWithNewTag"; export default { components: { RoleAddWithNewTag } }; </script>

要不要我帮你补充该组件的“角色编辑/删除”扩展功能代码

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 3:16:11

通俗理解池化操作(Pooling)

引言&#xff1a;从图像识别到人工智能的“浓缩精华” 想象一下&#xff0c;你正在看一张照片&#xff0c;比如一张猫的图片。这张图片由成千上万的像素组成&#xff0c;每个像素都有颜色和亮度信息。如果你要让计算机“理解”这张图片是猫&#xff0c;而不是狗或树&#xff0c…

作者头像 李华
网站建设 2026/4/22 21:00:19

磁盘空间告急?HeyGem数字人系统存储清理最佳实践

磁盘空间告急&#xff1f;HeyGem数字人系统存储清理最佳实践 在企业级AI应用快速落地的今天&#xff0c;一个看似不起眼的问题正悄然成为系统稳定运行的“隐形杀手”——磁盘空间不足。尤其是在部署像 HeyGem 数字人视频生成系统 这类高吞吐、持续输出的本地化AI服务时&#xf…

作者头像 李华
网站建设 2026/4/23 11:15:25

Agent 通信与上下文共享

day40:了解agent通信与上下文共享 Agent 通信与上下文共享 一、什么是 Agent 通信与上下文共享&#xff1f; 定义&#xff1a; Agent 通信 多个 Agent 之间交换信息 上下文共享 多个 Agent 基于同一份“状态 / 记忆”协作完成任务用于解决多个agent之间分工协作汇总的问题二、…

作者头像 李华
网站建设 2026/4/23 8:39:22

腾讯Techo Day技术沙龙分享:介绍HeyGem架构设计理念

HeyGem 数字人视频生成系统架构设计深度解析 在企业内容生产需求日益增长的今天&#xff0c;如何以更低的成本、更快的速度制作高质量视频内容&#xff0c;成为许多组织面临的现实挑战。特别是在培训、客服、品牌传播等场景中&#xff0c;传统依赖真人出镜与专业剪辑的方式不仅…

作者头像 李华
网站建设 2026/4/23 8:39:23

PHP 8.7新函数深度指南(仅限高级开发者掌握的技巧)

第一章&#xff1a;PHP 8.7新函数深度指南概述PHP 8.7 作为 PHP 语言演进中的重要版本&#xff0c;引入了一系列实用且高效的新内置函数&#xff0c;显著增强了开发者在处理字符串、数组、类型检查和异步操作时的表达能力与执行效率。这些函数不仅优化了常见任务的实现方式&…

作者头像 李华
网站建设 2026/4/23 8:38:51

容百科技高镍三元:HeyGem生成能量密度提升过程可视化

HeyGem数字人视频生成系统&#xff1a;从语音到唇形同步的自动化实践 在企业数字化转型浪潮中&#xff0c;内容生产的效率瓶颈日益凸显。一家新能源公司市场部每周需发布3条高管致辞视频&#xff0c;传统拍摄流程从预约档期、布光录音到后期剪辑&#xff0c;平均耗时超过4小时…

作者头像 李华