news 2026/4/27 3:20:00

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

作者头像

张小明

前端开发工程师

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/25 7:22:18

Vue2+ElementUI2 + 角色下拉添加+列表展示

✅ 完整整合版代码&#xff08;Vue2ElementUI2 角色下拉添加列表展示&#xff09; 已将角色下拉添加人员选择新增标签功能&#xff0c;完整嵌入到你现有的需求管理页面中&#xff0c;✅ 兼容原有所有CRUD逻辑、✅ 贴合若依框架规范、✅ 支持新增/编辑回显、✅ 数据联动提交后端…

作者头像 李华
网站建设 2026/4/25 1:50:21

欣旺达电池技术:HeyGem生成新能源储能解决方案说明

HeyGem 数字人视频生成系统&#xff1a;赋能新能源企业内容生产的智能引擎 在新能源产业加速数字化转型的今天&#xff0c;高效、精准、可规模化的内容输出已成为企业传播的核心竞争力。以欣旺达为代表的储能领军企业&#xff0c;面对全球市场对产品技术解读、客户演示和培训材…

作者头像 李华
网站建设 2026/4/22 10:44:26

PHP 8.7重磅更新:6大新函数用法揭秘,你还不知道?

第一章&#xff1a;PHP 8.7重磅更新概览PHP 8.7 作为近年来最具突破性的版本之一&#xff0c;带来了多项性能优化、语法增强以及底层架构改进。该版本聚焦于提升执行效率、强化类型系统&#xff0c;并进一步改善开发者体验。尽管仍处于开发预览阶段&#xff0c;但已披露的特性足…

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

头条号内容分发:利用算法推荐覆盖更广受众

头条号内容分发&#xff1a;利用算法推荐覆盖更广受众 在短视频与信息流内容主导用户注意力的今天&#xff0c;一个优质视频能否“出圈”&#xff0c;往往不再取决于创作者粉丝数量的多寡&#xff0c;而是由平台算法是否将其推送给足够多的潜在观众决定。这种从“人找内容”到“…

作者头像 李华
网站建设 2026/4/23 10:32:28

美团无人配送宣传联动?脑洞:用HeyGem生成机器人播报视频

美团无人配送如何“开口说话”&#xff1f;用HeyGem实现低成本数字人播报 在城市街头&#xff0c;美团的无人配送车正安静地穿行于楼宇之间。它们高效、精准&#xff0c;却少了一点“温度”——如果这辆车能主动告诉你“您的餐到了”&#xff0c;甚至在节日里说一句“五一快乐&…

作者头像 李华
网站建设 2026/4/26 19:16:52

华友钴业新能源布局:HeyGem制作非洲矿产开发纪实

华友钴业新能源布局&#xff1a;HeyGem制作非洲矿产开发纪实 —— HeyGem数字人视频生成系统技术解析 在跨国资源型企业加速全球传播的今天&#xff0c;如何高效、安全地输出多语言企业宣传片&#xff0c;成为一大现实挑战。以华友钴业为例&#xff0c;其在非洲的矿产开发项目需…

作者头像 李华