vue:el-table初始化表格选中项踩坑记录/element-ui表格

news2025/1/12 21:10:21

问题描述

首先,element-ui表格多选功能可以参考官网示例:表格数据多选;手动在表格中选取数据、通过监听selection-change获取选中项,实现起来非常顺利~
但在保存了选项、重新加载表格时,希望将已选项“打勾”却完全没有显示勾选状态:
完全没有勾选效果

debug过程

$nextTick

首先,遇事不决$nextTick!很多时候进行数据操作后页面显示不符合预期的问题,通过把数据操作放在$nextTick回调中就能得到解决!!具体原理可以参考:$nextTick原理深度解析
搭嘎内……并没有解决。。

在表格数据加载完成后再初始化选中项

本杂鱼反复捋顺自己封装的dataTable组件逻辑后,发现父级组件传来的选中项列表发生改变时,很可能表格数据还没有加载完成!因此实际上初始化选中项的时机应该在表格数据加载完成且父级选中项列表改变时!
也就是需要同时监听表格数据和父级选中项列表(同时监听多个属性可参考Vue watch如何同时监听多个属性?),且表格数据数量不少于选中项数量(表格数据加载完成了)再初始化选中项!

打没打内打没哟……Emm…但至少现在不是完全没有选中的效果了:
成功了“一半”
可以看到,具体的数据项还是没有勾选效果,但表头的全选框出现了半选效果!

表格选中项必须是表格数据的浅拷贝

本杂鱼有一个猜想,也许是父级传来的选中项列表有问题?于是直接用slice截取表格数据的前三项进行选中,发现no problem哒!但父级传来的选中项列表数据值明明和slice截取的一模一样,只是为了避免对象浅拷贝可能出现的问题(js深拷贝和浅拷贝的知识点可以参考JavaScript深浅拷贝区别),那是表格数据深拷贝得到的新数组……
哈哈哈!这次终于是解决啦!哦,我真的好dio★▽★

参考代码

此处贴出本杂鱼自己封装的el-table组件dataTable,仅供参考:
(还有一个有趣的知识点,强烈建议还不了解的小伙伴去看看嗷:vue透传)

<!-- 封装el-table -->
<template>
  <div id="DataTable">
    <div class="DataTable-table">
      <el-table :ref="tableKey" :data="tableData" v-bind="tableConfig" v-on="$listeners" height="100%"
        style="width: 100%;">
        <el-table-column v-if="showSelection" type="selection" width="48" align="center"></el-table-column>
        <el-table-column v-if="showNum" type="index" label="序号" width="80" align="center"></el-table-column>
        <slot>
          <el-table-column></el-table-column>
        </slot>
      </el-table>
    </div>
    <div v-if="showPagination" class="DataTable-pagination">
      <el-pagination v-bind="tableConfig" v-on="$listeners" :page-sizes="pageSizes" :layout="pagiLayout"
        :page-size.sync="query.pageSize" :total="total"></el-pagination>
    </div>
  </div>
</template>

<script>
	export default {
	  name: 'DataTable',
	  inheritAttrs: false, // 透传属性、事件
	  props: {
		tableKey: {
		  type: String,
		  default: () => 'dataTable'
		},
		// 表格配置
		showSelection: { // 是否显示多选框
		  type: Boolean,
		  default: false
		},
		showNum: { // 是否显示序号
		  type: Boolean,
		  default: true
		},
		selectItems: { // 选中项列表(必须是表格数据的浅拷贝)
		  type: Array,
		  default: () => []
		},
		// 分页栏配置
		showPagination: { // 是否显示分页栏
		  type: Boolean,
		  default: true
		},
		pageSizes: { // 分页大小
		  type: Array,
		  default: () => [10, 20, 50, 100]
		},
		pagiLayout: { // 分页栏布局配置
		  type: String,
		  default: () => 'total, prev, pager, next, sizes, jumper'
		}
	  },
	  data () {
			return {
				tableData: [],
				query: {
					pageSize: 10
				},
				total: 100
			}
	  },
	  computed: {
			tableConfig () { // 属性透传
				return {
					stripe: true, // 默认显示表格条纹
					...this.$attrs // 支持传过来的属性覆盖默认属性值
				}
			},
			initSelection () { // 当表格数据或选中项发生改变时,重新初始化表格选中项
				const { tableData, selectItems } = this
				return { tableData, selectItems }
			}
	  },
	  watch: {
			initSelection: {
				deep: true,
				immediate: true,
				handler (newVal) {
					const { tableData, selectItems } = newVal
					// 表格不支持选中数据、表格数据量少于选中的数据量(表格数据还没加载完)的情况下,不进行选中项初始化
					if(!this.showSelection || tableData.length < selectItems.length) return
					this.$nextTick(() => {
						this.toggleSelection(selectItems)
					})
				}
			}
	  },
	  mounted () {
	  },
	  methods: {
			dataChange () { // 数据发生改变时触发
				this.$emit('dataChange', this.tableData)
			},
			toggleSelection (selection) { // 切换给定列表项的选中状态
				if (selection) {
					this.$nextTick(() => {
						selection.forEach(row => {
							this.$refs[this.tableKey].toggleRowSelection(row)
						})
					})
				} else {
					this.clearSelection();
				}
			},
			clearSelection () { // 清除全部选中项
				this.$nextTick(() => {
					this.$refs[this.tableKey].clearSelection()
				})
			}
	  }
	}

</script>

<style lang="less" scoped>
	#DataTable {
		width: 100%;
		height: 100%;
		display: flex;
		flex-direction: column;
		overflow: hidden;

		.DataTable-table {
			flex: 1;
			overflow: auto;

			.el-table::before {
				background-color: transparent;
			}
		}
		
		.DataTable-pagination {
			position: relative;
			left: 0;
			bottom: 0;
			height: 42px;
			padding-top: 12px;
			display: flex;
			flex-direction: row-reverse;
		}
	}
</style>

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

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

相关文章

这篇文章告诉你excel批量翻译有什么方法

在商业或个人领域中&#xff0c;我们有时需要将大量文本翻译成不同语言&#xff0c;例如跨国企业需要在不同的国家和地区之间进行文件传输和协作&#xff0c;在旅行时我们需要阅读当地语言的信息或地图。如果我们手动操作的话&#xff0c;是非常耗时且容易出错的&#xff0c;所…

知识管理、文档管理两手抓,全靠它!

知识管理和文档管理是两个相互关联的概念&#xff0c;两者之间的关系非常密切。知识管理是指对组织内外的知识资源进行收集、整理、存储、共享和应用的过程&#xff0c;旨在提高组织的绩效和创新能力。而文档管理是指对组织内外的文档资源进行收集、整理、存储、共享和应用的过…

chatgpt赋能Python-python_heading__

Python heading()方法&#xff1a;提高网页的SEO效果 介绍 在网页开发过程中&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;是一个重要的考虑因素。网页的排名和可见性对于用户的访问和广告收益非常重要。好的SEO可以大大提高网页的可见性和流量。因此&#xff0c;网页…

SolVES模型生态系统服务功能社会价值评估

查看原文>>>SolVES 模型生态系统服务功能社会价值评估&#xff08;基于多源环境QGIS、PostgreSQL、ArcGIS、Maxent、R语言&#xff09; 目录 第一章、理论基础与研究热点 第二章、SolVES 4.0 模型运行环境配置 第三章、SolVES 4.0 模型运行 第四章、数据获取与入…

【追梦之旅】— 堆的实际应用--TopK问题

【追梦之旅】— 堆的实际应用--TopK问题&#x1f60e; 前言&#x1f64c;堆的TopK问题的现实栗子堆的TopK思路的应用场景堆的TopK思路的具体实现fscanf函数fprintf函数堆的TopK具体实现代码&#xff1a;前K个数据的巧妙设置运行结果截图&#xff1a; 总结撒花&#x1f49e; &am…

chatgpt赋能Python-python_ip地址判断

Python IP地址判断 - 从入门到精通 如果您是一个开发人员并且经常需要处理网络相关的任务&#xff0c;那么您一定知道 IP 地址是什么。 IP 地址&#xff08;Internet Protocol Address&#xff09;&#xff0c;是网络中用于标识设备的唯一标识符。 在本篇文章中&#xff0c;您…

chatgpt赋能Python-python_iloc

Python iLoc的使用方法及其在数据处理中的应用 Python是一种灵活的编程语言&#xff0c;可以在数据科学领域中广泛应用。在数据处理中&#xff0c;许多人都熟悉Pandas数据框架。本篇文章将介绍Pandas中的iloc方法&#xff0c;以及如何在数据处理中使用它。 iloc方法是什么? …

基于html+css的图展示87

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

CryoEM - 冷冻电镜 CryoSPARC 单颗粒图像数据集构建

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/130822537 CryoSPARC 的 downsample 操作是一种用于减少数据集大小的技术,可以提高计算效率和内存使用率。downsample 操作的原理是将原始图像的分辨率降低…

SpringBoot是如何简化配置的

Spring Boot 如何简化配置&#xff1f; Spring Boot 是一个基于 Spring 框架的快速开发框架&#xff0c;它可以大大简化应用程序的配置过程。本文将介绍 Spring Boot 是如何简化配置的&#xff0c;并提供相关的代码示例。 一、自动化配置 Spring Boot 的自动化配置功能可以根…

C++【实现AVL树】

文章目录 一、AVL树的概念及性能二、AVL树结点的创建三、AVL树的插入四、四种旋转&#xff08;1&#xff09;LL-左单旋&#xff08;2&#xff09;RR-右单旋&#xff08;3&#xff09;LR-左右旋&#xff08;4&#xff09;RL-右左旋 五、判断AVL树六、测试结果七、源代码(1) AVL_…

低代码开发平台魔笔 X 浙江广电集团:“10天”成为行业最小创新单位!

客户背景概述 浙江广播电视集团&#xff08;以下简称浙江台&#xff09;是一家以广播电视为主业,兼营相关产业的综合媒体集团&#xff0c;是国内最具影响力的省级媒体之一。因新业务拓展需要&#xff0c;浙江台也需随之上线一套全新的媒资平台系统进行运营支撑&#xff0c;而新…

2023年湖北助理工程师个人申报怎么申请?

这是许多出入职场的人&#xff0c;比较关心的话题&#xff0c;想要申请一个助理工程师怎么办呢&#xff1f;助理职称好不好办&#xff1f;助理工程师职称个人怎么申请呢&#xff1f;助理工程师申需要什么材料呢&#xff1f;助理工程师申报有什么流程呢&#xff1f;甘建二现在教…

五、数据仓库详细介绍(建模)实践篇

1 数仓建模在数仓建设过程中的位置 这张截图源自之前从 0 到 1 建设数据仓库的经验总结&#xff0c;采用的是瀑布模式的展现方式&#xff0c;但实际操作中经常会使用螺旋迭代模式&#xff0c;因为很难有人能够一步到位的考虑清楚所有细节。 通过业务调研我们熟悉了相关业务过程…

手把手教你用Python编写邮箱脚本引擎

版权声明&#xff1a;原创不易&#xff0c;本文禁止抄袭、转载需附上链接&#xff0c;侵权必究&#xff01; 目录 一、邮箱知识点简介二、常见邮箱开启SMTP服务2.1 QQ邮箱​2.2 163邮箱2.3 阿里云邮箱&#xff08;企业版&#xff09;2.4 Gmail邮箱 三、Python编写邮箱引擎3.1 编…

Deferred Components-实现Flutter运行时动态下发Dart代码 | 京东云技术团队

导读 Deferred Components&#xff0c;官方实现的Flutter代码动态下发的方案。本文主要介绍官方方案的实现细节&#xff0c;探索在国内环境下使用Deferred Components&#xff0c;并且实现了最小验证demo。读罢本文&#xff0c;你就可以实现Dart文件级别代码的动态下发。 一、…

蓝精灵协会启动第二阶段的 NFT 连续发售活动

四个月前&#xff0c;蓝精灵协会推出了一款完全上链的 NFT 游戏&#xff0c;参与的钱包数量超过 85,000 个&#xff0c;并进入了前 100 Dapps 排名&#xff0c;成为了 Web3 领域的一匹黑马。 两周前&#xff0c;我们开始了第二阶段的连续销售活动&#xff0c;旨在建立一个前沿 …

privateGPT centos7环境下部署和研究

gihtub代码 https://github.com/imartinez/privateGPT 安装 llama-cpp-python-0.1.48安装报错 Could not build wheels for llama-cpp-python, , which is required to install pyproject.toml-based projects搜索&#xff08;结果较少&#xff09;&#xff1a; 从文章&#…

python数据分析与可视化学习简记(更新中)

numpy简介 numpy(Numerical Python)是python语言的扩展程序库&#xff0c;支持大量的维度数组与矩阵运算&#xff0c;此外也针对数组运算提供了大量的数学函数库 作用 Numpy是一个运行速度非常快的数学库&#xff0c;主要用于数组计算 安装 可以使用如下命令在命令行安装即可 p…

CnOpenData舆情云数据

一、数据简介 网络舆情监测数据是决策者进行数据分析和决策处置的基础。舆情云数据覆盖81000 网站、5600 论坛、1000 平面媒体、2500万 微信账号、3亿 微博账号、300 网络视频、17000 境外媒体、1400万 自媒体账号、2500 新闻客户端、170 电视台 &#xff0c;数据来源全面精准&…