news 2026/5/27 17:10:19

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

作者头像

张小明

前端开发工程师

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/5/1 8:08:35

西部黄金勘探技术:HeyGem生成地质找矿方法科普

西部黄金勘探技术&#xff1a;HeyGem生成地质找矿方法科普 在新疆某金矿项目现场&#xff0c;技术人员正围坐在移动终端前观看一段讲解视频——画面中一位熟悉的专家形象正在清晰地解析“蚀变分带与金矿化关系”。但事实上&#xff0c;这位“专家”已经退休三年&#xff0c;而这…

作者头像 李华
网站建设 2026/5/11 15:04:34

钛媒体产业分析引用:将HeyGem作为典型案例写入行业文章

HeyGem 数字人视频生成系统的工程化实践与产业价值 在内容生产迈向智能化的今天&#xff0c;企业对高效、低成本制作数字人视频的需求正以前所未有的速度增长。无论是电商直播中的虚拟主播&#xff0c;还是企业培训里的AI讲师&#xff0c;亦或是政务宣传中多语种播报员&#x…

作者头像 李华
网站建设 2026/5/23 2:01:46

文献综述写成“观点堆砌”?百考通AI平台3分钟生成有逻辑、有批判、有脉络的高质量综述

撰写文献综述是学术写作中最关键也最容易被低估的环节。许多学生误以为只要“把别人的研究摘要拼在一起”就算完成&#xff0c;结果交出的综述缺乏主线、没有批判、看不出研究演进&#xff0c;更无法定位自己的研究缺口。导师常批&#xff1a;“这不是综述&#xff0c;是读书笔…

作者头像 李华
网站建设 2026/5/20 17:25:06

爱国者移动电源新品发布:HeyGem制作户外探险情景剧

爱国者移动电源新品发布&#xff1a;HeyGem制作户外探险情景剧 在短视频主导用户注意力的今天&#xff0c;品牌如何以更低的成本、更快的速度生产出高质量宣传内容&#xff1f;爱国者&#xff08;aigo&#xff09;给出了一个极具前瞻性的答案——用AI数字人技术批量生成“户外探…

作者头像 李华
网站建设 2026/5/21 5:00:26

为什么你的API无法被前端调用?深度剖析PHP跨域请求根源

第一章&#xff1a;为什么你的API无法被前端调用&#xff1f;深度剖析PHP跨域请求根源 当你在开发前后端分离项目时&#xff0c;前端应用部署在 http://localhost:3000&#xff0c;而后端 API 运行在 http://localhost:8000&#xff0c;浏览器却阻止了请求&#xff0c;这通常…

作者头像 李华
网站建设 2026/5/15 21:57:14

ASG光口故障

本文档提供了ASG系列产品的维护指导。 文章目录光口故障现象描述可能原因处理步骤光口故障 现象描述 用户反馈上网不稳定&#xff0c;登录设备在系统日志中查看每隔5分钟左右接口会Up/Down一次。 可能原因 接口双工模式被修改。接口速率被修改。配置了接口状态探测或者接口…

作者头像 李华