news 2026/6/10 12:21:44

输入框+下拉面板+列表渲染

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
输入框+下拉面板+列表渲染

在Vue(结合Element UI)中实现“搜索角色+下拉选择+添加到列表”的功能,可以通过输入框+下拉面板+列表渲染的组合实现,以下是贴合你截图效果的具体实现方案:

一、核心思路

  1. 维护3组数据:
    • allRoles:所有可选的角色字典(从后端接口获取);
    • searchRole:搜索框输入的关键词;
    • roleList:已添加的角色列表(包含角色信息+人员选择项);
  2. 交互逻辑:
    • 输入关键词时,过滤allRoles得到匹配的角色列表;
    • 选择角色后,点击“添加角色”将其插入roleList(需去重);
    • 已添加的角色右侧显示“待填”(实际是人员选择下拉框)。

二、Vue组件实现代码

<template> <div class="role-config"> <!-- 已添加的角色列表 --> <div class="role-item" v-for="(item, index) in roleList" :key="index"> <el-select v-model="item.roleCode" disabled style="width: 120px; margin-right: 10px;" > <el-option :label="item.roleName" :value="item.roleCode" /> </el-select> <el-select v-model="item.userId" placeholder="待填" style="width: 180px;" @change="handleUserChange(item, $event)" > <el-option v-for="user in userOptions" :key="user.userId" :label="user.nickName" :value="user.userId" /> </el-select> </div> <!-- 角色搜索+添加区域 --> <div class="role-add-area" style="margin-top: 10px;"> <el-input v-model="searchRole" placeholder="搜索角色名称" prefix-icon="el-icon-search" style="width: 200px; margin-right: 10px;" @input="filterRoles" /> <!-- 下拉角色列表(搜索结果) --> <el-popover v-model="rolePopoverVisible" trigger="manual" placement="bottom-start" style="width: 200px;" > <div class="role-option" v-for="role in filteredRoles" :key="role.code" @click="selectRole(role)" > {{ role.name }} </div> </el-popover> <el-button type="primary" @click="addRoleToList" icon="el-icon-plus" > 添加角色 </el-button> </div> </div> </template> <script> // 假设从后端接口获取角色和用户列表 import { getRoleDict, listUser } from "@/api/project/role"; export default { name: "RoleAddList", data() { return { allRoles: [], // 所有角色字典(格式:{code: 'PM', name: '项目经理'}) searchRole: "", // 搜索关键词 filteredRoles: [], // 搜索过滤后的角色列表 selectedRole: null, // 选中的待添加角色 rolePopoverVisible: false, // 角色下拉面板显隐 roleList: [], // 已添加的角色列表(含人员) userOptions: [] // 系统用户列表(人员选择项) }; }, created() { this.loadBaseData(); }, methods: { // 加载角色字典和用户列表 async loadBaseData() { // 1. 加载所有角色(从后端字典接口) const roleRes = await getRoleDict(); this.allRoles = roleRes.data; this.filteredRoles = [...this.allRoles]; // 2. 加载系统用户(人员选择项) const userRes = await listUser({ pageNum: 1, pageSize: 200 }); this.userOptions = userRes.data.rows; }, // 搜索过滤角色 filterRoles() { if (!this.searchRole) { this.filteredRoles = [...this.allRoles]; } else { this.filteredRoles = this.allRoles.filter(role => role.name.includes(this.searchRole.trim()) ); } this.rolePopoverVisible = true; // 显示下拉面板 }, // 选择某个角色(点击下拉项) selectRole(role) { this.selectedRole = role; this.searchRole = role.name; // 输入框显示选中的角色名 this.rolePopoverVisible = false; // 关闭下拉面板 }, // 添加选中的角色到列表 addRoleToList() { if (!this.selectedRole) { this.$message.warning("请先选择要添加的角色"); return; } // 检查角色是否已存在(去重) const isDuplicate = this.roleList.some( item => item.roleCode === this.selectedRole.code ); if (isDuplicate) { this.$message.warning("该角色已添加,请勿重复"); return; } // 添加到角色列表 this.roleList.push({ roleCode: this.selectedRole.code, roleName: this.selectedRole.name, userId: null, // 人员ID(待选) userName: "" // 人员名称(待选) }); // 重置搜索状态 this.searchRole = ""; this.selectedRole = null; }, // 选择人员后更新人员名称 handleUserChange(item, userId) { const selectedUser = this.userOptions.find(u => u.userId === userId); item.userName = selectedUser ? selectedUser.nickName : ""; } } }; </script> <style scoped> .role-item { margin-bottom: 8px; display: flex; align-items: center; } .role-option { padding: 6px 12px; cursor: pointer; } .role-option:hover { background-color: #f5f7fa; } .role-add-area { display: flex; align-items: center; } </style>

三、关键功能说明

  1. 搜索过滤

    • 输入关键词时,通过filter方法从allRoles中筛选匹配的角色;
    • el-popover实现下拉面板,展示过滤后的角色选项。
  2. 角色选择

    • 点击下拉角色项时,将角色信息赋值给selectedRole,并填充到搜索框;
    • 关闭下拉面板,准备添加。
  3. 去重添加

    • 添加前检查roleList中是否已有相同roleCode的角色,避免重复;
    • roleList中推送角色信息,同时初始化人员选择项(“待填”状态)。
  4. 人员选择

    • 每个角色右侧的el-select绑定userId,选择后自动更新userName
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 9:32:42

戴尔工作站客户案例:设计师用HeyGem加速内容创作流程

戴尔工作站客户案例&#xff1a;设计师用HeyGem加速内容创作流程 在内容为王的时代&#xff0c;设计师和创意团队正面临前所未有的压力——不仅要产出高质量视频&#xff0c;还要在极短时间内完成多语言、多版本的发布。传统制作流程中&#xff0c;一条3分钟的教学视频可能需要…

作者头像 李华
网站建设 2026/6/8 19:05:23

实验报告还在“抄步骤+贴数据”?百考通AI平台3分钟生成有原理、有分析、有科学思维的高质量总结

做了一整天实验&#xff0c;记录了满满几页数据&#xff0c;可一写实验报告就卡在“讨论与分析”部分&#xff1f;只会写“实验步骤如下”“数据见下表”&#xff0c;却说不出误差来源、原理联系或结果意义&#xff1f;交上去的报告被批“像操作日志&#xff0c;缺乏科学思维”…

作者头像 李华
网站建设 2026/5/22 18:39:21

曙光计算机高性能计算科普:HeyGem生成院士讲解视频

曙光计算机高性能计算科普&#xff1a;HeyGem生成院士讲解视频 在人工智能与高性能计算交汇的今天&#xff0c;我们正见证一场内容生产方式的革命。想象这样一个场景&#xff1a;一位年逾七旬的院士只需提供一段旧日演讲视频和一份新录制的音频&#xff0c;系统便能在数分钟内自…

作者头像 李华