news 2026/4/17 13:52: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/18 6:30:39

歌尔股份VR设备:HeyGem生成元宇宙交互体验视频

歌尔股份VR设备&#xff1a;HeyGem生成元宇宙交互体验视频 在虚拟现实内容生产仍被高昂成本和复杂流程束缚的今天&#xff0c;歌尔股份正悄然推动一场“平民化数字人革命”。其合作开发的HeyGem系统&#xff0c;让一个普通人上传一段音频、一段视频&#xff0c;几分钟内就能生成…

作者头像 李华
网站建设 2026/4/17 8:07:32

【企业级PHP监控实践】:资深架构师揭秘告警配置的8大陷阱与规避策略

第一章&#xff1a;企业级PHP监控体系的核心价值在现代高并发、分布式架构广泛应用的背景下&#xff0c;PHP作为支撑大量Web应用的核心语言之一&#xff0c;其运行时稳定性与性能表现直接影响用户体验与业务连续性。构建一套完整的企业级PHP监控体系&#xff0c;不仅是技术运维…

作者头像 李华
网站建设 2026/4/18 6:27:57

SEO新手指南,轻松从零建立网站流量优化之路

在进行SEO优化时&#xff0c;理解内容的核心地位至关重要。内容不仅是吸引用户的关键&#xff0c;也直接影响搜索引擎的排名。首先&#xff0c;确保内容围绕目标关键词进行扩展&#xff0c;这样能提高在搜索结果中的曝光率。其次&#xff0c;文章应具有逻辑性和结构性&#xff…

作者头像 李华
网站建设 2026/4/18 6:27:22

蓝思科技玻璃盖板:HeyGem制作防摔测试对比演示

蓝思科技玻璃盖板&#xff1a;HeyGem制作防摔测试对比演示 在智能终端设备越来越深入人们日常生活的今天&#xff0c;一个看似不起眼的细节——屏幕能不能扛得住一次意外跌落——往往决定了用户对整个系统的信任程度。尤其是在部署AI数字人这类高价值、高交互性的系统时&#x…

作者头像 李华
网站建设 2026/4/18 6:26:06

工业物联网中PHP数据上传延迟问题,如何在10分钟内定位并解决?

第一章&#xff1a;PHP 工业数据实时上传的现状与挑战在工业自动化与物联网融合发展的背景下&#xff0c;PHP 作为广泛应用的服务器端脚本语言&#xff0c;正被越来越多地用于构建工业数据采集与监控系统。尽管 PHP 并非传统意义上的实时处理语言&#xff0c;但其快速开发、丰富…

作者头像 李华
网站建设 2026/4/18 8:09:20

【大型系统架构必修课】:PHP项目中分库分表路由的5大经典模式

第一章&#xff1a;PHP分库分表路由的核心挑战与设计原则在高并发、大数据量的业务场景下&#xff0c;单一数据库已无法承载海量读写请求&#xff0c;分库分表成为提升系统扩展性的重要手段。然而&#xff0c;如何高效实现数据路由&#xff0c;是分库分表架构中的核心难点。PHP…

作者头像 李华