element中Table表格控件单选、多选功能进一步优化

news2025/4/21 20:22:33

目录

  • 一、代码实现
    • 1、 父组件
    • 2、子组件(弹框)
  • 二、效果图

一、代码实现

1、 父组件

<template>
   <div>
       <!-- 用户选择嵌套弹框 -->
		<el-dialog :close-on-click-modal="false" :close-on-press-escape="false" title="选择人员" :visible.sync="open"
			width="80%" append-to-body :show-close="false">
			<TableList :open="open" :dataList="dataList" @submitForm="submitForm" @cancel="cancel"></TableList>
		</el-dialog>
   </div>
</template>

<script>
import TableList from '@/components/table-list'
export default {
    name: 'TablePage5',
    components:{
        TableList,
    },
    props: {
      
    },
    data() {
        return {
            open:true,
            dataList:[ {
                        userId: 3,
                        userName: '王五'
                    },],
        }
    },
    watch: {
       
    },
    methods: {
        // 取消
		cancel() {
			// this.open = false
            // .............
		},
		// 确认
		submitForm(checkIds) {
			console.log(checkIds, 'checkId获取到')
            // .........
		},

    }
}
</script>

<style>

</style>

2、子组件(弹框)

<template>
    <div class="app-container">
        <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
            <el-form-item label="搜索" prop="search">
                <el-input v-model="queryParams.search" placeholder="请输入" clearable size="small" style="width: 200px"
                    @keyup.enter.native="handleQuery" />
            </el-form-item>
            <el-form-item>
                <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery('queryForm')">搜索
                </el-button>
                <el-button icon="el-icon-refresh" size="mini" @click="resetQuery('queryForm')">重置</el-button>
            </el-form-item>

        </el-form>
        <el-table v-loading="loading" :data="userList" max-height="400" ref="multipleTable" @select="selectRow"
            @select-all="selectAll" :header-cell-class-name="cellClass" :row-key="row => {
                return row.userId
            }
                ">
            <!-- reserve-selection="true" 仅对 type=selection 的列有效,类型为 Boolean,为 true 则会在数据更新之后保留之前选中的数据(需指定 row-key) -->
            <el-table-column type="selection" width="50" align="center" :reserve-selection="true" :selectable="selected" />
            <el-table-column type="index" width="100" :index="indexMethod" label="序号">
            </el-table-column>
            <el-table-column label="姓名" align="center" prop="userName" :show-overflow-tooltip="true" />
        </el-table>
        <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
            :current-page="queryParams.pageNum" :page-sizes="[2, 5, 10, 15]" :page-size="queryParams.pageSize"
            layout="total, sizes, prev, pager, next, jumper" :total="total">
        </el-pagination>
        <!-- <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
            :limit.sync="queryParams.pageSize" @pagination="getList" :autoScroll="false" /> -->
        <div class="dialog-footer">
            <el-button @click="cancel">取 消</el-button>
            <el-button type="primary" @click="submitForm">确 定</el-button>
        </div>
    </div>
</template>

<script>
// import { listPeople } from '@/api/manager/peopleList'
export default {
    name: 'TablePage5',
    props: {
        open: {
            type: Boolean,
            default: true
        },
        // 默认选中的数据
        dataList: {
            type: Array,
            default: () => {
                return []
            }
        },
        // 默认为0多选, 传递1单选
        type: {
            type: Number,
            default: 0
        }
    },
    data() {
        return {
            // 用户查询参数
            queryParams: {
                pageNum: 1,
                pageSize: 10,
                search: ''
            },
            loading: false,
            // 用户列表(所有的用户数据)
            userList: [
                {
                    userId: 1,
                    userName: '张三'
                },
                {
                    userId: 2,
                    userName: '李四'
                },
                {
                    userId: 3,
                    userName: '王五'
                },
                {
                    userId: 4,
                    userName: '测试1'
                },
                {
                    userId: 5,
                    userName: '测试2'
                },
                {
                    userId: 6,
                    userName: '测试3'
                },
            ],
            // 用户总数
            total: 0,
            // 全选按钮隐藏
            DisableSelection: false,
            // 选中的人员列表
            checkList: [],
            // 选中的人员Id列表
            checkIds: []
        }
    },
    watch: {
        // 判断弹框是否显示
        open: {
            handler(val) {
                if (val) {
                    this.getList()
                }
            },
            immediate: true
        },
        // 父组件传递过来的之前已经选中的数据
        dataList: {
            handler(list) {
                this.checkList = list
                if(list){
                    this.checkIds = list.map(item=>item.userId)
                }
            },
            immediate: true,
            deep: true
        }
    },
    methods: {
        // 分页相关
        indexMethod(index) {
            // this.pageNum当前页码 // this.pageSize 每页条数
            return (this.queryParams.pageNum - 1) * this.queryParams.pageSize + index + 1
        },
        // 人员列表
        getList() {
            // 根据实际需求,调用对应接口...........
            // this.loading = true
            // listPeople(this.queryParams)
            //     .then(res => {
            //         console.log(res, '人员列表')
            //         this.userList = res.rows
            //         this.total = res.total
            //         this.loading = false
            //         数据回显
            //         this.selectedRecords()
            //     }).catch(err => {
            //         console.log(err)
            //         this.loading = false
            //     })

            // 数据回显
            this.selectedRecords()
        },
        // 数据回显 (之前选中的数据,和全部人员数据之间判断,如果userId相同,就表示选中,默认复选框选中)
        // toggleRowSelection 用于多选表格,切换某一行的选中状态,如果使用了第二个参数,则是设置这一行选中与否(selected 为 true 则选中)
        selectedRecords() {
            console.log(this.checkList, '数据回显')
            let that = this
            this.$nextTick(() => {
                this.userList.forEach((row) => {
                    this.checkList.forEach((child) => {
                        if (row.userId == child.userId) {
                            that.$refs.multipleTable.toggleRowSelection(row)
                        }
                    })
                })
            })
        },
        // 分页相关
        handleSizeChange(val) {
            console.log(`每页 ${val} 条`);
            this.queryParams.pageSize = val;
            this.getList()
        },
        handleCurrentChange(val) {
            console.log(`当前页: ${val}`);
            this.queryParams.pageNum = val;
            this.getList()
        },
        // 选择人员弹框
        handleQuery() {
            this.queryParams.pageNum = 1
            this.getList()
        },
        // 选择人员重置
        resetQuery(queryForm) {
            this.$refs[queryForm].resetFields()
            this.queryParams.pageNum = 1
            this.getList()
        },

        // 全选:list所有选中的数据组成的列表
        selectAll(list) {
            console.log('全选', list)
            // list为空,表示全不选
            if (!list.length) { // 全不选
                // 将当前页表格的数据循环判断是否存在在checkList中,存在就删除
                this.userList.forEach((item) => {
                    this.checkList.forEach((child, key) => {
                        if (item.userId == child.userId) {
                            this.checkList.splice(key, 1)
                            this.checkIds.splice(key, 1)
                        }
                    })
                })
            } else { // 全选
                // 循环list,将不存在的值加上,已经存在的就不加了
                list.map((item) => {
                    if (this.checkIds.indexOf(item.userId) == -1) {
                        this.checkList.push(item)
                        this.checkIds.push(item.userId)
                    }
                })
            }
        },
        // 单选 list所有选中的数据组成的列表,  row当前选中或者取消选中的数据对象
        selectRow(list, row) {
            console.log('表格单选', list, row)
            let rowId = row.userId
            // 判断当前选项是否已经选择过了, -1表示不存在,没有选择过,  其余则是选择过了
            let isExist = -1
            this.checkList.forEach((item, index) => {
                if (row.userId == item.userId) {
                    isExist = index
                }
            })
            // row.id不存在在list中的时候,说明是取消勾选,undefined表示去除勾选
            let isDel = list.find(item => {
                return item.userId == rowId
            }) == undefined
            if (isDel) { //取消勾选
                // 去除,存在就删除
                if (isExist != -1) {
                    this.checkList.splice(isExist, 1)
                    this.checkIds.splice(isExist, 1)
                }
            } else { // 勾选
                // 添加
                if (isExist == -1) {
                    this.checkList.push(row)
                    this.checkIds.push(row.userId)
                }
            }
        },
        // 选择人员确认
        // clearSelection 用于多选表格,清空用户的选择
        submitForm() {
            let list = []
            this.checkList.map(item => {
                list.push(item.userId)
            })
            this.checkIds = list
            // 去重
            this.checkIds = [... new Set(this.checkIds)]
            // console.log(this.checkList,'this.checkList')
            // console.log(this.checkIds,'this.checkIds')
            this.$emit('submitForm', this.checkIds)
            // 清除复选框
            this.$refs.multipleTable.clearSelection()
           
        },
        // 取消按钮
        cancel() {
            this.$emit('cancel')
            // 清除复选框
            this.$refs.multipleTable.clearSelection()
        },
        // 超过1个人禁止选择 (当type为1时候,也就是单选时候)
        selected(row) {
            // 限制逻辑,返回 true 则为可勾选,反之则禁止勾选
            let judge = true
            if (this.checkList.length == 1 && this.type == 1) { // 单选
                judge = this.checkList.some(item => {
                    return item.userId == row.userId
                })
            }
            return judge
        },
        // 全选禁用 (当type为1时候,是单选,故全选按钮禁用)
        // 配合样式使用
        cellClass() {
            if (this.type == 1) {
                return 'DisableSelection'
            }
        }

    }
}
</script>

<style>
.dialog-footer {
    width: 100%;
    display: flex;
    justify-content: center;
    margin-top: 50px;
}

.el-table .DisableSelection .cell .el-checkbox__inner {
    display: none;
    position: relative;
}

.el-table .DisableSelection .cell:before {
    content: '';
    position: absolute;
}
</style>

二、效果图

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

史上最全的数据科学与艺术

1.背景介绍 数据分析是一种将数据转化为价值的艺术和科学。它涉及到大量的数学、统计、编程、数据库、机器学习等多个领域的知识。数据分析的目的是从数据中提取有用的信息&#xff0c;以便做出明智的决策。 数据分析的艺术体现在数据分析师需要具备丰富的经验和洞察力&#…

C语言第一弹---C语言基本概念(上)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 C语言基本概念 1、C语言是什么&#xff1f;2、C语言的历史和辉煌3、编译器的选择VS20223.1、编译和链接3.2、编译器对比3.3、VS2022优缺点 4、VS项目和源文件、头…

从零开始搭建个人代理IP池的全程实录

创建个人代理IP池是一项相对复杂的技术任务&#xff0c;涉及到网络爬虫、服务器运维、数据库管理等多个领域。下面我将提供一个简化的步骤指南&#xff0c;但请注意这需要一定的编程基础和网络知识&#xff1a; 1. 获取IP资源&#xff1a; - 从免费或付费的代理IP提供商处获取I…

【视觉SLAM十四讲学习笔记】第五讲——相机模型

专栏系列文章如下&#xff1a; 【视觉SLAM十四讲学习笔记】第一讲——SLAM介绍 【视觉SLAM十四讲学习笔记】第二讲——初识SLAM 【视觉SLAM十四讲学习笔记】第三讲——旋转矩阵 【视觉SLAM十四讲学习笔记】第三讲——旋转向量和欧拉角 【视觉SLAM十四讲学习笔记】第三讲——四元…

Angular系列教程之zone.js和NgZone

文章目录 什么是zone.jsZone的工作原理Zone的常见用途NgZone&#xff1a;Angular中的zone.js使用NgZone使用NgZone执行代码使用NgZone外部检测 结论 什么是zone.js 在Angular中&#xff0c;zone.js是一个非常重要的库&#xff0c;它为我们提供了一种跟踪和管理异步操作的机制。…

将某个GitLab上的项目自动同步到另一个GitLab账户下的仓库

引言 我们在进行项目迁移&#xff0c;或者是给甲乙外包写项目&#xff0c;需要迁移代码或者同步更新时&#xff0c;所处于的GitLab地址是不一样的&#xff0c;那么我们如何进行同步呢&#xff1f;我们可能第一时间会想到&#xff0c;先拉A地址的代码到本地&#xff0c;然后覆盖…

【SpringCloud】这一次终于使用MQ解决了Eureka服务下线延迟感知问题

前言 其实&#xff0c;“通过Redis手动更新Ribbon缓存来解决Eureka微服务架构中服务下线感知的问题”是一种解&#xff0c;但不是最优解 1.痛点 上一篇文章的标题是&#xff1a; 通过Redis手动更新Ribbon缓存来解决Eureka微服务架构中服务下线感知的问题 当时在文章的末尾就…

【Flutter 开发实战】Dart 基础篇:List 详解

嗨&#xff0c;各位朋友们&#xff0c;欢迎来到这篇博客&#xff01;今天我们将一起踏入 Dart 语言的神奇世界&#xff0c;深入了解 Dart 中的 List 类型。不用担心&#xff0c;我会尽可能用最通俗易懂的语言&#xff0c;让你对 List 有一个更深刻的理解。 Dart 中的 List Li…

重学Java 7 数组Arr.1

我欲与君相知&#xff0c;长命无绝衰 ——24.1.16 一、数组的定义 1.概述&#xff1a;数组是一个容器&#xff0c;数组本身属于引用数据类型 2.作用&#xff1a;一次存储多个数据 3.特点&#xff1a; ①既可以存储基本类型的数据&#xff0c;也可以存储引用类型的数据 ②定长&a…

Redis 消息队列和发布订阅

文章目录 基本模式生产者消费者原理&模型redis实现java实现 发布者订阅者原理&模型redis实现java实现 stream模式原理&模型工作原理redis实现Java实现 选型外传 基本模式 采用redis 三种方案&#xff1a; ● 生产者消费者&#xff1a;一个消息只能有一个消费者 ●…

计算机毕业设计 基于SSM的历史/博物馆藏系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

一天吃透计算机网络面试八股文

目录&#xff1a; 网络分层结构三次握手两次握手可以吗&#xff1f;四次挥手第四次挥手为什么要等待2MSL&#xff1f;为什么是四次挥手&#xff1f;TCP有哪些特点&#xff1f;说说TCP报文首部有哪些字段&#xff0c;其作用又分别是什么&#xff1f;TCP和UDP的区别&#xff1f;…

DWM1000 MAC层

DWM1000 MAC层 MAC层 概述 MAC层&#xff0c;即媒体访问控制层&#xff0c;是数据通信协议栈中的一个重要部分&#xff0c;位于链路层的下半部分&#xff0c;紧邻物理层。在OSI模型中&#xff0c;它属于第二层&#xff0c;即数据链路层的一部分。MAC层的主要职责是控制如何在…

去中心化社交:Web3如何重新定义社交媒体

随着区块链技术的快速发展&#xff0c;Web3正在崭露头角&#xff0c;成为社交媒体领域的一股新潮流。去中心化社交的理念与技术创新正在重新定义用户的社交体验&#xff0c;颠覆传统社交媒体的中心化模式。本文将深入探讨Web3对社交媒体的影响&#xff0c;以及去中心化社交是如…

Ubuntu使用QtCreator + CMake 开发C/C++程序

平台 OS: Ubuntu 20.04 cmake: 3.16.3 IDE: Qt Creator 4.11.1 Based on Qt 5.14.1 (GCC 5.3.1 20160406 (Red Hat 5.3.1-6), 64 bit) Built on Feb 5 2020 12:48:30 From revision b2ddeacfb5 Copyright 2008-2019 The Qt Company Ltd. All rights reserved. The program …

DC电源模块在新能源领域的应用前景

BOSHIDA DC电源模块在新能源领域的应用前景 DC电源模块在新能源领域有着广阔的应用前景。随着可再生能源技术的发展和普及&#xff0c;如太阳能和风能等的应用逐渐增多&#xff0c;DC电源模块在这些领域的应用越来越重要。 首先&#xff0c;DC电源模块可以用于太阳能发电系统…

transfomer中正余弦位置编码的源码实现

简介 Transformer模型抛弃了RNN、CNN作为序列学习的基本模型。循环神经网络本身就是一种顺序结构&#xff0c;天生就包含了词在序列中的位置信息。当抛弃循环神经网络结构&#xff0c;完全采用Attention取而代之&#xff0c;这些词序信息就会丢失&#xff0c;模型就没有办法知…

子域名的介绍及收集

1、子域名作用编辑 收集子域名可以扩大测试范围&#xff0c;同一域名下的二级域名都属于目标范围。 2、 常用方式编辑 子域名中的常见资产类型一般包括办公系统&#xff0c;邮箱系统&#xff0c;论坛&#xff0c;商城&#xff0c;其他管理系统&#xff0c;网站管理后台也有可…

获得店铺的所有商品 API、店铺列表api

taobao.item_search_shop 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_search_shop等]cacheStrin…

transfomer的位置编码

什么是位置编码 在transformer的encoder和decoder的输入层中&#xff0c;使用了Positional Encoding&#xff0c;使得最终的输入满足&#xff1a; input_embeddingpositional_encoding 这里&#xff0c;input_embedding的shape为[n,b,embed_dim],positional_encoding和input_…