Ant Design Vue Table组件全单元格编辑实现方案

在ant上的table常见用法是一行的元素可编辑,如下:

在这里插入图片描述
但是现在有一个需求是全部单元格均可编辑,如何实现呢?

  • 表格组件
<a-table
  v-if="query.personnel_type === '0'"
  size="middle"
  row-key="id"
  :scroll="{ x: 'max-content' }"
  :columns="columns"
  :data-source="data"
  :loading="loading"
  :pagination="false"
/>
  • 表头数据
{
  title: '月份',
  width: 170,
  dataIndex: 'created_at',
},
{
  title: '基础员工(个)',
  width: 120,
  dataIndex: 'basic',
},
{
  title: '高技能员工(个)',
  width: 120,
  dataIndex: 'senior',
},
{
  title: '专业专家(个)',
  width: 120,
  dataIndex: 'expert',
},
{
  title: '实习生(个)',
  width: 120,
  dataIndex: 'trainee',
},
  • 效果

在这里插入图片描述

  • 使用<Input>插槽可以Table组件内部渲染样式

在这里插入图片描述
在Table的Api第一行就显示的是具名插槽,使用这个插槽可以对表格内部数据个人化操作。

text, record, index, column分别表示单元格的文本数据,一行的数据,索引和列的表头元素。一般情况下通过v-if判断表头元素对该列做个性化。

  • 具名插槽编辑
    <a-table
      v-if="query.personnel_type === '0'"
      size="middle"
      row-key="id"
      :scroll="{ x: 'max-content' }"
      :columns="columns"
      :data-source="data"
      :loading="loading"
      :pagination="false"
    >
      <template
        #bodyCell="{ record, column }"
      >
        <template
          v-if="column.dataIndex === 'senior'"
        >
          <a-input
            :placeholder="record[column.dataIndex]"
            @change="(e) => handleChange(e.target.value, record, column)"
          />
        </template>
      </template>
    </a-table>

关键代码

 <template
   #bodyCell="{ record, column }"
 >
   <template
     v-if="column.dataIndex === 'senior'"
   >
     <a-input
       :placeholder="record[column.dataIndex]"
       @change="(e) => handleChange(e.target.value, record, column)"
     />
   </template>
 </template>

v-if="column.dataIndex === 'senior'"判断表头是senior元素将其变成一个input输入框,效果如下:

在这里插入图片描述

  • 实现全单元格编辑

对所需要全局编辑的表头做判断即可,如下:

<template
  #bodyCell="{ record, column }"
>
  <template
    v-if="['basic', 'senior', 'expert', 'trainee'].includes(column.dataIndex)"
  >
    <a-input
      :placeholder="record[column.dataIndex]"
      @change="(e) => handleChange(e.target.value, record, column)"
    />
  </template>
</template>

在这里插入图片描述

改造后就得到了除时间外全部单元格都可编辑的一个Table,但是在默认情况下并不比想要其展现可编辑状态,而是在点击某个按钮后显示可编辑状态。

  • 编辑状态改变

基于该方式我们可以在输入框添加一个v-if判断

 <a-input
   v-if="isShowGlobalEdit"
   :placeholder="record[column.dataIndex]"
   @change="(e) => handleChange(e.target.value, record, column)"
 />

在默认情况下就是忽略了input插槽。

在这里插入图片描述

设置按钮绑定响应事件

 // 全单元格编辑
 isShowAllEdit() {
   this.isShowGlobalEdit = true
 },

 cloneAllEdit() {
   this.isShowGlobalEdit = false
 },

这里情况下肯会不成功,应为表格已经渲染了,这时候再去改变if的状态已经无效了。这里有两种实现方法,第一种就是vue的钩子函数,把isShowGlobalEdit beforeUpdate()重新赋值一下使表格重新渲染就可以了。另一种如下:

import { cloneDeep } from 'lodash/lang'

 // 全单元格编辑
 isShowAllEdit() {
   this.isShowGlobalEdit = cloneDeep(this.isShowGlobalEdit === true)
 },
  cloneAllEdit() {
   this.isShowGlobalEdit = cloneDeep(this.isShowGlobalEdit === false)
 },

使用这种深度监听也可以实现,这个可以自行去查资料哈。

  • 数据监听

到这里全单元格的编辑已经做出来了,但是如何获取数据呢?

在这里插入图片描述
在输入数据时,当鼠标移开数据就消失了,这是由于在vue中数据使响应式的,这里的输入并未改变实际的状态。在Table中提供了changeAPI帮助获取变化,如下:

在这里插入图片描述

<template
  #bodyCell="{ record, column }"
>
  <template
    v-if="['basic', 'senior', 'expert', 'trainee'].includes(column.dataIndex)"
  >
    <a-input
      v-if="isShowGlobalEdit"
      :placeholder="record[column.dataIndex]"
      @change="(e) => handleTableChange(e)"
    />
  </template>
</template>
    handleTableChange(e) {
      console.log(e)
    },

在这里插入图片描述
可以看到每次输入都会触发事件,控制台打印一个对象,这个对象肯定式包含输入值的,找出它即可,如下:

在这里插入图片描述

再次改造函数如下:

<template
  #bodyCell="{ record, column }"
>
  <template
    v-if="['basic', 'senior', 'expert', 'trainee'].includes(column.dataIndex)"
  >
    <a-input
      v-if="isShowGlobalEdit"
      :placeholder="record[column.dataIndex]"
      @change="(e) => handleTableChange(e.target.value, record, column)"
    />
  </template>
</template>

e.target.value, record, column这三个参数都是需要的。record, column用于判断是那行的数据修改了,不然全局修改不知道是修改了哪些数据。

在这里插入图片描述

到此修改的数据就可以被实时获取了,接下来是组装数据,全局修改需要知道修改是那行的数据。

  • 组装数据

在这里插入图片描述

一行的数据也传递到函数,如下:

在这里插入图片描述

由这些数据可以知道是那一行和那一列的数据,就可以组装了。

handleTableChange(e, record, column) {
  record[column.dataIndex] = e
  this.dataDuplication.push(record)
},

在这里插入图片描述
这样组装发信每次输入都会触发,导出数组重复数据,这里需要判断,由于id是唯一的,可以根据id判断。如下:

handleTableChange(e, record, column) {
  // 过滤重复id
  this.dataDuplication = this.dataDuplication.filter((item) => item.id !== record.id)
  record[column.dataIndex] = e
  this.dataDuplication.push(record)
},

在这里插入图片描述

最终获取的数据是更改后具有id的数据,这样的数据传递到后端可以直接更具id修改。到此全部单元格修改已经完成了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习】安全帽检测,目标检测,Faster RCNN训练

文章目录 资料环境尝试训练安全帽数据训练测试预测全部数据、代码、训练完的权重等资料见&#xff1a; 资料 依据这个进行训练&#xff1a; https://github.com/WZMIAOMIAO/deep-learning-for-image-processing/tree/master/pytorch_object_detection/faster_rcnn ├── bac…

人工智能机器学习系统技术要求

一 术语和定义 1.1机器学习系统 machinelearningsystem 能运行或用于开发机器学习模型、算法和相关应用的软件系统。 1.2机器学习框架 machinelearningframework 利用预先构建和优化好的组件集合定义模型,实现对机器学习算法封装、数据调用处理和计算资源使用的软件库。 1…

实时监控与报警:人员跌倒检测算法的实践

在全球范围内&#xff0c;跌倒事件对老年人和儿童的健康与安全构成了重大威胁。据统计&#xff0c;跌倒是老年人意外伤害和死亡的主要原因之一。开发人员跌倒检测算法的目的是通过技术手段及时发现和响应跌倒事件&#xff0c;减少因延迟救助而造成的严重后果。这不仅对老年人群…

特征交叉系列:FM和深度神经网络的结合,DeepFM原理简述和实践

从FM&#xff0c;FFM到DeepFM 在上两节中介绍了FM和FFM 这两种算法是推荐算法中经典的特征交叉结构&#xff0c;FM将特征交叉分解到底层属性&#xff0c;通过底层属性的点乘来刻画特征交叉的计算&#xff0c;而FFM引入特征域的概念&#xff0c;对不同的特征对所引用的底层属性…

Redis 单线程问题 BigKey问题

前言 简单的redis基础类型以及常用操作我们都也已经介绍过了 现在今天我们来谈谈redis对于单线程是需要怎么理解的 以及redis假设遇见大key我们需要怎么去查询和删除呢??? redis单线程 假设有个人现在问你一个问题:redis是单线程的还是多线程的 这个问题本身就不严谨 就像问…

植物大战僵尸杂交版2.0.88最新版+防闪退工具V2+修改工具+高清工具

植物大战僵尸杂交版&#xff0c;不仅继承原作的经典玩法&#xff0c;而且引入了全新的植物融合玩法&#xff0c;将各式各样的植物进行巧妙的杂交&#xff0c;孕育出前所未有、功能各异的全新植物。 创新的杂交合成系统 游戏引入了创新的杂交合成系统&#xff0c;让玩家可以将不…

每天CTF小练--ctfshow新手村

easy_base 密文&#xff1a;0XezFWZfNXafRjNlNXYit3dvh2cmR3Y 等号在前面&#xff0c;直接倒序后解码 ctfshow{base64_is_easy} 代码解&#xff1a; s 0XezFWZfNXafRjNlNXYit3dvh2cmR3Y print(s[::-1]) #翻转字符串 print(s[::-1]) #翻转字符串 print(s[::-1]) #翻转…

LLaSM:Large language and speech model

1.Introduction 级联方法使用ASR将语音输入转化为文本输入,语音到文本会导致信息损失,本文提出LLaSM,一个具有跨模态对话能力的大型语音与语言模型,能够理解和遵循语音与语言指令,借鉴LLaVA,利用预训练的语音模态编码器和大语言模型,使用Whisper作为语音编码器,将语音…

iOS18 新变化提前了解,除了AI还有这些变化

iOS 18即将在不久的将来与广大iPhone用户见面&#xff0c;这次更新被普遍认为是苹果历史上最重要的软件更新之一。据多方报道和泄露的消息&#xff0c;iOS 18将带来一系列全新的功能和改进&#xff0c;包括在人工智能领域的重大突破、全新的设计元素以及增强的性能和安全性。现…

Linux之文件操作

目录 第1关&#xff1a;文件的创建 任务描述 相关知识 文件的创建 编程要求 答案&#xff1a; 第2关&#xff1a;文件打开与关闭 任务描述 相关知识 文件的打开 文件的关闭 编程要求 答案&#xff1a; 第3关&#xff1a;文件读写操作 任务描述 相关知识 文件的写操作 文件的读…

Meta Llama 3 残差结构

Meta Llama 3 残差结构 flyfish 在Transformer架构中&#xff0c;残差结构&#xff08;Residual Connections&#xff09;是一个关键组件&#xff0c;它在模型的性能和训练稳定性上起到了重要作用。残差结构最早由He et al.在ResNet中提出&#xff0c;并被广泛应用于各种深度…

项目-双人五子棋对战:匹配模块的实现(3)

完整代码见: 邹锦辉个人所有代码: 测试仓库 - Gitee.com 模块详细讲解 功能需求 匹配就类似于大家平常玩的王者荣耀这样的匹配功能, 当玩家点击匹配之后, 就会进入到一个匹配队列, 当匹配到足够数量的玩家后, 就会进入确认页. 在这里, 我们主要实现的是1 - 1匹配功能, 首先先…

【Git】分支管理 -- 详解

一、理解分支 分支就是科幻电影里面的平行宇宙&#xff0c;当你正在电脑前努力学习 C 的时候&#xff0c;另一个你正在另一个平行宇宙里努力学习 JAVA。 如果两个平行宇宙互不干扰&#xff0c;那对现在的你也没啥影响。不过&#xff0c;在某个时间点&#xff0c;两个平行宇宙…

ApsaraMQ Copilot for RocketMQ:消息数据集成链路的健康管家

作者&#xff1a;文婷 引言 如何正确使用消息队列保证业务集成链路的稳定性&#xff0c;是消息队列用户首要关心的问题。ApsaraMQ Copilot for RocketMQ 从集成业务稳定性、成本、性能等方面帮助用户更高效地使用产品。 背景 消息队列产品通过异步消息的传递&#xff0c;来…

使用Qt对word文档进行读写

目录 开发环境原理使用的QT库搭建开发环境准备word模板测试用例结果Gitee地址 开发环境 vs2022 Qt 5.9.1 msvc2017_x64&#xff0c;在文章最后提供了源码。 原理 Qt对于word文档的操作都是在书签位置进行插入文本、图片或表格的操作。 使用的QT库 除了基本的gui、core、…

Bond网卡

一、Bond网卡 1.1 Bond网卡概述 Bond网卡是指使用 Linux 系统中的 Bonding 技术创建的虚拟网络接口。 Bonding 技术允许将多个物理网卡&#xff08;也称为接口或端口&#xff09;绑定在一起&#xff0c;形成一个虚拟的网络接口&#xff0c;以增加网络带宽、提高网络容错性和…

【ARM Cache 及 MMU 系列文章 6 -- Cache 寄存器 CTR | CLIDR | CCSIDR | CSSELR 使用详解 1】

文章目录 Cache 常用寄存器Cache CSSELR 寄存器Cache CSSELR 使用场景Cache CSSELR 操作示例 Cache CLIDR 寄存器LoUU 介绍LoUU 使用 LoUIS 介绍CLIDR 使用 Cache CCSIDR 寄存器 Cache 常用寄存器 ARM Cache 常用到寄存器有以下几个&#xff1a; CSSELR, Cache Size Selectio…

VS2022,lib调用dll工程的一个函数

lib工程本身是一个静态库工程&#xff0c;没有链接器设置。然而&#xff0c;我们依然可以在lib工程中调用DLL工程中的函数&#xff0c;只需要确保头文件正确导入&#xff0c;并在最终使用lib的可执行文件项目中正确链接DLL的.lib文件。下面是一个详细的步骤说明&#xff1a; 假…

Windows 宿主机访问 VirtualBox 虚拟机中创建的 docker 容器中的 mysql8.0 的数据

一、场景需求 在开发环境中&#xff0c;一般使用 windows 系统进行开发&#xff0c;但需要在 linux 系统中创建运行 mysql8.0 的 docker 容器中进行测试&#xff08;win10特定版本或win11才能安装 docker&#xff09;&#xff0c;为了方便还需要在 windows 系统中通过 SQLyog …

python ---requests

python包管理工具 pip 若发现报错&#xff0c;则可以通过 -i 命令指定软件源 requests库安装 通过 pip &#xff0c;如上 或通过 pycharm 搜索 requests &#xff0c;并安装即可 下载成功的证明 requests库使用 模拟 http 重要参数如下 如何模拟发包 支持模拟各种 http meth…