news 2026/10/5 8:56:50

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

作者头像

张小明

前端开发工程师

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/10/5 4:56:22

要实现“新建需求”功能

要实现“新建需求”功能&#xff0c;我们可以基于 Vue&#xff08;Element UI&#xff09; Spring Boot&#xff08;若依框架&#xff09; 做前后端分离开发&#xff0c;以下是完整实现方案&#xff1a; 一、后端&#xff08;Spring Boot 若依&#xff09; 1. 数据库表设计 需…

作者头像 李华
网站建设 2026/10/5 4:56:20

通俗理解卷积核与特征图

引言 在当今的科技世界中&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到我们生活的方方面面&#xff0c;尤其是图像识别、自动驾驶和医疗诊断等领域。其中&#xff0c;卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;简称CNN&#xff09;是深度…

作者头像 李华
网站建设 2026/10/5 4:56:35

中兴通讯基站维护培训:HeyGem生成工程师教学视频

中兴通讯基站维护培训&#xff1a;HeyGem生成工程师教学视频 在通信网络日益复杂的今天&#xff0c;5G基站的部署密度持续攀升&#xff0c;设备迭代周期不断缩短。一线维护人员面临一个现实难题&#xff1a;如何在最短时间内掌握最新的故障处理流程&#xff1f;传统的培训方式—…

作者头像 李华
网站建设 2026/10/4 10:49:59

社会实践报告还在“记流水账”?百考通AI平台3分钟生成有深度、有反思、有社会价值的高质量总结

暑期结束&#xff0c;面对学校要求的社会实践报告&#xff0c;你是否还在苦恼于内容空洞、结构松散、写来写去只有“第一天走访社区&#xff0c;第二天发放问卷&#xff0c;第三天整理材料”这类流水账式记录&#xff1f;看似条理清晰&#xff0c;实则缺乏问题意识、没有理论联…

作者头像 李华
网站建设 2026/10/4 10:50:01

课程设计报告写成“操作手册”?百考通AI平台3分钟生成有原理、有分析、有工程思维的高质量总结

课程设计是工科、经管、教育等专业教学中的关键实践环节&#xff0c;但很多同学交出的报告却像一份“操作步骤清单”——“第一步打开软件&#xff0c;第二步输入参数&#xff0c;第三步点击运行……”缺乏理论支撑、过程反思与结果分析&#xff0c;被导师批为“只有流程&#…

作者头像 李华
网站建设 2026/10/4 10:49:58

为什么你的分库分表总失败?90%开发者忽略的路由设计3个致命误区

第一章&#xff1a;为什么你的分库分表总失败&#xff1f;在高并发、大数据量的系统架构中&#xff0c;分库分表被视为解决数据库性能瓶颈的关键手段。然而&#xff0c;许多团队在实施过程中频繁遭遇失败&#xff0c;导致数据不一致、查询效率下降甚至系统崩溃。根本原因往往并…

作者头像 李华