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

news2024/9/23 13:26:51

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-input
                  v-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复选框全部勾选以及勾选回显

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2138904.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【运营攻略】怎样进行游戏产品的定位

关于游戏商业化设计的一些思考 - 游戏干饭之家 游戏运营进阶&#xff1a;数据分析驱动游戏版本调优 - 游戏干饭之家 在深入挖掘某款游戏数据时&#xff0c;发现了一个有趣的现象&#xff1a;70%的玩家好友数量在1-5个之间&#xff0c;11%的玩家好友数在6-10个&#xff0c;而平…

Fiddler下载安装及汉化

直接上干货 1.下载地址&#xff1a; 通过百度网盘分享的文件&#xff1a;fiddler汉化&#xff0c;FiddlerSetup抓包.exe等2个文件 链接&#xff1a;https://pan.baidu.com/s/12JBZO8z0mDHlHM1DCL365g 提取码&#xff1a;1111 2.fiddler安装&#xff1a; 注意安装位置 3.汉化&…

基于协同过滤+python+django+vue+的音乐推荐系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于协同过滤pythondjangovue…

计算机毕业设计 在线新闻聚合平台的设计与实现 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

象过河手机进销存,外出办公更方便,随时了解经营情况

你还在为外出时无法即时查看库存、处理订单而烦恼吗&#xff1f;电脑端进销存虽强&#xff0c;但一离开办公桌就仿佛与店铺“失联”&#xff0c;那些紧急的调货请求、客户咨询&#xff0c;都让人手忙脚乱&#xff01; 这里强烈推荐你试试【象过河手机进销存】&#xff0c;它就像…

计算机网络入门基础

1. 基础概念 我们在聊网络的时候&#xff0c;就像是我们在日常生活中寄信一样。我们可以把网络想象成一个巨大的邮局系统&#xff0c;负责把信息从一个地方传送到另一个地方。 a. 什么是协议栈&#xff1f; 协议栈就像是寄信过程中的多个步骤。我们可以把它想象成寄信的时候…

Python3 SMTP发送邮件

SMTP&#xff08;Simple Mail Transfer Protocol&#xff09;即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则&#xff0c;由它来控制信件的中转方式。 python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。 Python创建 SM…

Kotlin:1.9.0 的新特性

一、概述 Kotlin 1.9.0版本英语官方文档 Kotlin 1.9.0 中文官方文档 The Kotlin 1.9.0 release is out and the K2 compiler for the JVM is now in Beta. Additionally, here are some of the main highlights: Kotlin 1.9.0版本已经发布&#xff0c;用于JVM的K2编译器现在…

运用Java实现倒计时功能

这个功能其实是比较好实现的&#xff0c;一般来说java中实现倒计时有两种方法&#xff1a; 1、使用 scheduledexecutorservice创建一个可重复执行的任务&#xff0c;直到时间到&#xff1a; ScheduledExecutorService 是 Java 中一种用于安排延迟或定期任务的工具。我们可以使…

PMP--一模--解题--61-70

文章目录 14.敏捷61、 [单选] 作为估算活动持续时间过程的一部分&#xff0c;项目经理促成了与产品负责人和Scrum团队的冲刺计划会议。项目经理将用户故事分解为较小的任务项&#xff0c;以小时为单位估算所需时间&#xff0c;并根据团队的能力确定冲刺待办事项列表。尽管计划周…

6. Transforms的使用(一)--ToTensor()

Transforms的使用&#xff08;一&#xff09; 1.使用ToTensor类将数据转化为Tensor形式 导入需要使用的transforms类 from torchvision import transforms创建ToTensor类的实例 totensor transforms.ToTensor()将读取的图片ndarray数据转化为Tensor数据 img cv.imread(img_p…

SAP学习笔记 - 开发06 - CDSView + Fiori Element 之 List Report

上一章讲了Fiori UI5开发环境搭建和实践&#xff1a; - VSCode 安装Fiori Tools插件 - SEGW 创建后台程序&#xff0c;注册服务&#xff0c;Gateway Client确认服务 - 使用SEGW公开的服务来查询数据显示到页面 SAP学习笔记 - 开发05 - Fiori UI5 开发环境搭建2 Fiori Tools…

react js 使用 useEffect 钩子

起因&#xff0c; 目的: useEffect() &#xff0c; 已经遇见好几次了。 我的理解是&#xff0c; 页面加载完成之后&#xff0c;会执行这个函数。&#xff1f;&#xff1f;&#xff1f; 写个例子&#xff0c; 请求 api import React, { useState, useEffect } from "re…

在线查看 Android 系统源代码 AOSPXRef and AndroidXRef

在线查看 Android 系统源代码 AOSPXRef and AndroidXRef 1. AOSPXRef1.1. http://aospxref.com/android-14.0.0_r2/1.2. build/envsetup.sh 2. AndroidXRef2.1. http://androidxref.com/9.0.0_r3/2.2. build/envsetup.sh 3. HELLO AndroidReferences 1. AOSPXRef http://aospx…

Java | Leetcode Java题解之第406题根据身高重建队列

题目&#xff1a; 题解&#xff1a; class Solution {public int[][] reconstructQueue(int[][] people) {Arrays.sort(people, new Comparator<int[]>() {public int compare(int[] person1, int[] person2) {if (person1[0] ! person2[0]) {return person2[0] - perso…

5.TensorBoard的使用(二)--add_image()

TensorBoard的使用&#xff08;二&#xff09; 1.使用add_image()给添加图片 首先导入Tensorboard包 from torch.utils.tensorboard import SummaryWriter创建一个SummaryWriter类的实例&#xff0c;并将所有的事件文件保存在logs文件夹中 writer SummaryWriter(logs)使用add…

【光照增强论文略读】Zero-Reference Deep Curve Estimation for Low-Light Image Enhancement

这篇题为《用于低光照图像增强的零参考深度曲线估计》的论文介绍了一种名为Zero-DCE的创新方法&#xff0c;用于增强低光照图像。其主要创新点在于&#xff0c;它在训练过程中不需要成对或非成对的参考图像&#xff0c;因此是一种“零参考”方法。通过轻量级深度学习模型DCE-Ne…

五星级可视化页面(25):非蓝色系,金色系可视化界面。

深蓝色系的可视化界面是最常见的&#xff0c;本文专门分享一些金色系的可视化界面。

java项目之编程训练系统源码(springboot)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的编程训练系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 编程训练系统的主要使用者管…

TCP套接字【网络】

文章目录 TCP常见接口服务端服务端创建套接字服务端绑定服务端监听服务端获取连接服务端处理请求 客户端客户端创建套接字客户端连接服务器并发起请求 代码 TCP常见接口 创建套接字&#xff1a;&#xff08;TCP/UDP) int socket(int domain, int type, int protocol);inet_at…