当前位置: 首页 > news >正文

Table列表复现框实现【勾选-搜索-再勾选】

Table列表复现框实现【勾选-搜索-再勾选】

    • 概要
    • 整体架构流程
    • 代码实现
    • 技术细节
    • 注意
    • 参考文献

概要

最近在开发时遇到一个问题,在进行表单渲染时,正常选中没有问题,单如果需要搜索选中时,一个是已选中的不会回填,二是在搜索的结果中进行选中,没有实现,经过排查,查找资料后实现。

例如:

整体架构流程

具体的实现效果
如下:
在这里插入图片描述
在这里插入图片描述

代码实现

<template><el-dialog:title="departmentUsersDialogTitle":visible.sync="departmentUsersDialogVisible"width="55%"@close="handleDepartmentUserDialog"><div class="dialog-content"><el-container><el-main class="user-group-content"><div class="user-group-panel"><div class="user-group-search"><el-inputv-model="searchUserValue"size="small"placeholder="请选择用户名称"@input="handleSearch"/></div><div class="user-group-table"><el-table  ref="userTableDataRef" size="small" :data="filteredData" style="width: 100%;height: 100%"@selection-change="handleSelectionChange":row-key="getRowKey"><el-table-column type="selection" width="55" :reserve-selection="true"/><el-table-column property="userName" label="姓名" width="120"><template #default="scope">{{scope.row.userName}}</template></el-table-column><el-table-column property="userCode" label="人员编码" width="120" /><el-table-column property="departmentName" label="所属部门" /></el-table></div></div></el-main><el-aside class="user-select-content"><div class="user-select-panel"><div class="user-select-title"><label>已选区</label></div><div><el-tag size="small" v-for="(userItem,userIndex) in departmentUsers" :key="userIndex" @close="handleCloseUserTag(userItem)" closable type="primary" style="margin: 5px">{{ userItem.userName}}</el-tag></div></div></el-aside></el-container></div><span slot="footer" class="dialog-footer"><el-button @click="handleDepartmentUserDialog"  size="small">取 消</el-button><el-button type="primary" @click="confirmDepartmentUserDialog" size="small">确 定</el-button></span></el-dialog>
</template>
<script>
import {getDepartmentUserApi} from "@/api";export default {name: "departmentUserDialog",props:{departmentUsersTitle:{type:String,required:true},departmentUserVisible:{type:Boolean,required:true},selectedDepartmentData:{type:Object,required:true},allDepartmentModel:{type:Array,required:true},},mounted() {const _that = this;_that.departmentUsersDialogTitle=_that.departmentUsersTitle;_that.departmentUsersDialogVisible=_that.departmentUserVisible;//选择的部门_that.selectedDepartment = _that.selectedDepartmentData;_that.departmentUsers=_that.selectedDepartmentData.users || [];_that.departmentThee = _that.allDepartmentModel;//初始化树节点_that.initializeUserData();},data(){return{departmentUsersDialogTitle:'',departmentUsersDialogVisible:false,searchDepartment:'',departmentThee:[],defaultProps: {children: 'children',label: 'label'},searchUserValue:'',userTableData:[],departmentUsers:[],selectedDepartment:{},// 初始时默认选中的节点defaultCheckedKeys: [],filteredData: [], // 过滤后的数据,用于显示//防止回显成功前对表格进行操作的标识,防止在调用toggleRowSelection方法改变选中状态,会调用@selection-change="handleSelectionChange"stopReBack: false,}},methods:{getRowKey(row) {return row.userId;},/*** 输入搜索**/handleSearch() {const _that = this;//过滤数据_that.filterUserData().then(() => {//初始化所选表单_that.setDefaultSelections();});},/*** 过滤用户数据*/filterUserData() {const _that = this;const searchUserValue = (_that.searchUserValue || '').toLowerCase();//过滤后的数据const searchTableData = _that.userTableData.filter(tableDta => {return (tableDta['userName'].toLowerCase()).includes(searchUserValue);}) || [];_that.filteredData = searchTableData;},/*** 初始化表单选中项*/setDefaultSelections() {// 遍历defaultSelectedIds,并找到对应的行来选中const _that=this;_that.stopReBack = true;_that.departmentUsers.forEach(user => {const row = _that.filteredData.find(row => row.userId === user.userId);if (row) {_that.$refs['userTableDataRef'].toggleRowSelection(row,true);}});_that.stopReBack = false;},/*** 初始化用户数据**/initializeUserData(){const _that = this;//初始化所选部门的用户_that.findDeptUser().then(() =>{_that.filteredData = _that.userTableData;//初始化所选表单_that.setDefaultSelections();})},/*** 部门树节点过滤** @param value* @param data* @returns {boolean}*/departmentFilterNode(value, data) {if (!value) return true;return data.label.indexOf(value) !== -1;},/*** 删除用户的Tag* @param userItem*/handleCloseUserTag(userItem){const _that = this;_that.departmentUsers.splice(_that.departmentUsers.indexOf(userItem), 1);_that.$refs['userTableDataRef'].toggleRowSelection(userItem,false);},/*** 确定弹框,*/confirmDepartmentUserDialog(){const _that = this;const selectData = _that.selectedDepartment;_that.$emit('actionDepartmentUsers', {distributeId:selectData.distributeId,distributeName:selectData.distributeName,users: _that.departmentUsers});},/*** 取消弹框,*/handleDepartmentUserDialog(){const _that = this;_that.$emit('closeDepartmentUsersDialog');},/*** 根据部门ID获取用户数据** @returns {Promise<void>}*/async findDeptUser() {const _that = this;const departmentJSON = _that.selectedDepartment || {};await getDepartmentUserApi({departmentId: departmentJSON['distributeId'] || '',}).then(res => {_that.userTableData = res.data || [];}).catch(err => {console.error('获取部门用户数据异常', err);})},handleSelectionChange(val){const _that = this;if (_that.stopReBack) {return false;}_that.departmentUsers = val;},}
}
</script>
<style scoped lang="scss">
div.dialog-content{.el-container{width: 100%;height: 500px;.el-aside{width: 25% !important;border: 1px #dcdfe6 solid;padding: 10px;div.user-department-panel{width: 100%;height: 100%;display: flex;flex-direction: column;background-color: #ffffff;}div.user-department-tree{flex: 1;padding: 5px 0;}div.user-select-panel{width: 100%;height: 100%;display: flex;flex-direction: column;background-color: #ffffff;div.user-select-title{height: 32px;line-height: 32px;text-align: center;border-bottom: 1px #dcdfe6 solid;}}}.el-main{border: 1px #dcdfe6 solid;margin:0 10px;padding: 10px;div.user-group-panel{width: 100%;height: 100%;display: flex;flex-direction: column;background-color: #ffffff;div.user-group-table{flex: 1;padding: 5px 0;}}}}
}
</style>

技术细节

其中主要需要查看的参数、组件、方法如下:

  • 组件(主要用法去element-ui官网查看)
    :row-key=“getRowKey”:行数据的 Key,用来优化 Table 的渲染;在使用 reserve-selection 功能与显示树形数据时,该属性是必填的。类型为 String 时,支持多层访问:user.info.id,但不支持 user.info[0].id,此种情况请使用 Function。
    :reserve-selection=“true”:仅对 type=selection 的列有效,类型为 Boolean,为 true 则会在数据更新之后保留之前选中的数据(需指定 row-key)
    @selection-change=“handleSelectionChange”:当选择项发生变化时会触发该事件
  • 参数
    //防止回显成功前对表格进行操作的标识,防止在调用toggleRowSelection方法改变选中状态,会调用@selection-change=“handleSelectionChange”
    stopReBack: false,
  • 方法:
    //初始化树节点
    _that.initializeUserData();

注意

在使用toggleRowSelection()方法时要确保数据已经渲染出来,所以我使用了.then函数。

参考文献

table列表复现框【勾选-搜索-再勾选】功能

el-table中实现数据回显自动勾选

el-table复选框全部勾选以及勾选回显

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Python | Leetcode Python题解之第406题根据身高重建队列
  • C语言补习课番外篇——采样sin(x)
  • CustomerbasicController
  • 如何 吧一个 一维数组 切分成相同等分,一维数组作为lstm的输入(三维数据)的数据预处理 collate_fn的应用
  • c语言快递小项目
  • 深度学习速通系列:F1和F2分数
  • 边缘计算网关:连接中心计算与边缘设备的重要桥梁-天拓四方
  • C到C++入门基础知识
  • 数据结构基础讲解(八)——树和二叉树专项练习(上)
  • 【LLM:Gemini】文本摘要、信息提取、验证和纠错、重新排列图表、视频理解、图像理解、模态组合
  • windows检查端口占用并关闭应用
  • springboot 整合 nacos 配置实现多个环境不同配置
  • Mysql 视图存储过程触发器
  • TCP客户端编码和解码处理:发送和接收指定编码消息
  • 速通GPT:《Improving Language Understanding by Generative Pre-Training》全文解读
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 2019年如何成为全栈工程师?
  • PermissionScope Swift4 兼容问题
  • Python语法速览与机器学习开发环境搭建
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • select2 取值 遍历 设置默认值
  • session共享问题解决方案
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • Vultr 教程目录
  • Xmanager 远程桌面 CentOS 7
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 回顾2016
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 排序算法之--选择排序
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 入口文件开始,分析Vue源码实现
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 优化 Vue 项目编译文件大小
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • # Redis 入门到精通(八)-- 服务器配置-redis.conf配置与高级数据类型
  • # 飞书APP集成平台-数字化落地
  • #DBA杂记1
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #Lua:Lua调用C++生成的DLL库
  • #进阶:轻量级ORM框架Dapper的使用教程与原理详解
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (附源码)springboot教学评价 毕业设计 641310
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (顺序)容器的好伴侣 --- 容器适配器
  • (算法设计与分析)第一章算法概述-习题
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)jdk与jre的区别
  • .htaccess配置常用技巧
  • .NET Framework 3.5安装教程