antd-vue 累加表单编辑和删除(完善版)

news2024/12/28 18:40:39

一、业务场景:
最近在使用Antd-Vue组件库的时候,发现在累加表单 时没有直接可以用的,必须自己在官网上手动合并几个才能实现,为了大家后面遇到和我一样的问题,给大家分享一下

二、具体实现步骤:

<template>
  <div>
    <a-table :columns="columns" :data-source="data" bordered :pagination="false">
      <template
        v-for="col in ['name', 'age', 'address']"
        :slot="col"
        slot-scope="text, record, index"
      >
        <div :key="col">
          <a-input
            v-if="record.editable"
            style="margin: -5px 0"
            :value="text"
            @change="e => handleChange(e.target.value, record.key, col)"
          />
          <template v-else>
            {{ text }}
          </template>
        </div>
      </template>
      <template slot="name" slot-scope="text, record, index">
        <a-select default-value="lucy" style="width: 100%" v-model="record.name" :disabled="ifdisabled">
          <a-select-option value="jack">
            Jack
          </a-select-option>
          <a-select-option value="lucy">
            Lucy
          </a-select-option>
          <a-select-option value="disabled" >
            Disabled
          </a-select-option>
          <a-select-option value="Yiminghe">
            yiminghe
          </a-select-option>
        </a-select>

      </template>
      <template slot="age" slot-scope="text, record, index">
        <a-input v-model="record.age" :disabled="ifdisabled"/>
      </template>

      <template slot="operation" slot-scope="text, record, index">
        <div class="editable-row-operations">
{{record}}
        <span  v-if="!record.editable" >
          <a @click="() => save(record,record.key,record.editable)">保存</a>
          <a-popconfirm   title="您确定要取消吗?"
                        okText="确定"
                        cancelText="取消" @confirm="() => cancel(record.key,index)">
            <a>取消</a>
          </a-popconfirm>
        </span>
          <span v-else>
          <a :disabled="editingKey !== ''" @click="() => edit(record.key)">编辑</a>
        </span>

          <a-popconfirm
            v-if="data.length>1&&record.key"
            title="您确定要删除吗?"
            okText="确定"
            cancelText="取消"
            @confirm="() => onDelete(record.key)"
          >
            <a href="javascript:;">删除</a>
          </a-popconfirm>
        </div>
      </template>
    </a-table>
    <a-button class="editable-add-btn" @click="handleAdd">
      添加
    </a-button>
  </div>
</template>
<script>
  const columns = [
    {
      title: '账号类型',
      dataIndex: 'name',
      width: '25%',
      scopedSlots: {customRender: 'name'},
    },
    {
      title: '账号信息',
      dataIndex: 'age',
      width: '15%',
      scopedSlots: {customRender: 'age'},
    },
    {
      title: '操作',
      dataIndex: 'operation',
      scopedSlots: {customRender: 'operation'},
    },
  ];

  const data = [];
  for (let i = 0; i < 0; i++) {
    data.push({
      key: i.toString(),
      name: `Edrward ${i}`,
      age: ``,
    });
  }
  export default {
    data() {
      return {
        data,
        columns,
        editingKey: '',
        ifdisabled: false,
      };
    },
    mounted() {
      this.cacheData = this.data.map(item => ({...item}));
      console.log(this.cacheData)
    },
    methods: {
      handleChange(value, key, column) {
        const newData = [...this.data];
        const target = newData.find(item => key === item.key);
        if (target) {
          target[column] = value;
          this.data = newData;
        }
      },

      handleAdd() {

        this.ifdisabled = false
        // 如果文本框是禁用的状态,就可以继续添加
        // if (this.ifdisabled == true) {
          const {count, data} = this;
          const newData = {
            key: JSON.stringify(new Date()),
            name: ``,
            age: ``,
            address: ``
          };
          this.data = [...data, newData];
          this.count = count + 1;
          // this.ifdisabled = true
          this.cacheData = this.data.map(item => ({...item}));
          // 表格的数据
          console.log(this.cacheData)
        // } else {
        //   this.$message.warning('请先进行保存再添加下一条信息')
        //   return false
        // }


      },
      onDelete(key) {
        const dataSource = [...this.data];
        this.data = dataSource.filter(item => item.key !== key);
      },

      edit(key) {
        console.log(key)
        const newData = [...this.data];
        const target = newData.find(item => key === item.key);
        this.editingKey = key;
        if (target) {
          this.ifdisabled = false
          target.editable = false;
          this.data = newData;
        }
      },
      save(record,key,editable) {
        // 如果表格里的文本框有值在执行
        if(record.name&&record.age){
        console.log(key)
        const newData = [...this.data];
        const newCacheData = [...this.cacheData];
        const target = newData.find(item => key === item.key);
        const targetCache = newCacheData.find(item => key === item.key);
        if (target && targetCache) {
          this.ifdisabled = true
          target.editable = true;
          console.log(target)
          console.log(targetCache)
          // delete target.editable;
          this.data = newData;
          Object.assign(targetCache, target);
          this.cacheData = newCacheData;
        }
        this.editingKey = '';
        }else {
          this.$message.warning('请将信息填写完整后在进行保存')
        }
      },
      cancel(key,index) {
        this.data.splice(index,1)
        const newData = [...this.data];
        const target = newData.find(item => key === item.key);
        this.editingKey = '';
        if (target) {
          Object.assign(target, this.cacheData.find(item => key === item.key));
          delete target.editable;
          this.data = newData;
        }
      },
    },
  };
</script>
<style scoped>
  .editable-row-operations a {
    margin-right: 8px;
  }
</style>


三、效果展示:
在这里插入图片描述

你已经成功了,撒花。
今天的分享到此结束,欢迎小伙伴们一起交流

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

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

相关文章

新一代最强开源UI自动化测试神器Playwright(Java版)环境搭建

Playwright 是专门为满足端到端测试的需要而创建的。Playwright 支持所有现代渲染引擎&#xff0c;包括 Chromium、WebKit 和 Firefox。在 Windows、Linux 和 macOS 上进行本地测试或在 CI 上进行测试&#xff0c;无外设或带本机移动仿真。 一.安装 在JAVA中&#xff0c;使用…

嵌入式技术之IAP,自从有了它老板再也不担心我的代码了!(上)

1.惨痛的教训 那是一个严寒的冬日&#xff0c;客户在现场使用我们公司新研发的设备&#xff0c;设备最初设计可以允许最多连接20个温湿度传感器&#xff0c;但是由于现场空间非常大&#xff0c;客户要求连接30个温湿度传感器。这个需求修改非常简单&#xff0c;只用修改程序中…

帮公司面试了个要25K的测试,我问了他这些问题...

深耕IT行业多年&#xff0c;我们发现&#xff0c;对于一个程序员而言&#xff0c;能去到一线互联网公司&#xff0c;会给我们以后的发展带来多大的影响。 很多人想说&#xff0c;这个我也知道&#xff0c;但是进大厂实在是太难了&#xff0c;简历投出去基本石沉大海&#xff0…

spring security安全认证登录全流程分析

文章目录前言一、登录时序图二、配置与代码1.引入库2.代码文件参考文档前言 本文章主要从spring security安全认证登录内部调用流程来流程分析登录过程。 一、登录时序图 时序原图 二、配置与代码 1.引入库 pom.xml&#xff1a; <!-- Spring框架基本的核心工具 -->&…

截至到2022年12月12日,知网最新改进 YOLO 核心论文合集 | 22篇创新点速览

截至到2022年12月12日&#xff0c;知网最新改进YOLO核心论文合集 本篇博文仅供学习交流&#xff0c;不对文章质量进行评价&#xff0c;请尊重每一位同学的科研成果&#x1f91d;。 文章目录截至到2022年12月12日&#xff0c;知网最新改进YOLO核心论文合集引言&#x1f4a1;0. 什…

Vue.use()的用法详解

目录 &#x1f53d; 前言 &#x1f53d; 官方解释 &#x1f53d; Demo演示 &#x1f388; Object对象 &#x1f449; 创建项目 &#x1f449; 创建组件 &#x1f449; 使用组件 &#x1f388; function函数 &#x1f449; 创建函数 &#x1f449; 引入 &#x1f449…

机器人与视觉,基于坐标系的运动偏移

基于可移动坐标系的机器人坐标偏移 在生产过程中&#xff0c;当需要建造多个坐标系的时候&#xff0c;我们可以采用基于坐标系偏移&#xff0c;可以实现使用机器人坐标系直接完成多个坐标系的联动。 由于实现多个坐标系的联动情况&#xff0c;那么通常都会伴随着坐标系的移动和…

力扣1781. 子字符串的美丽值之和(cpp实现+解析)

文章目录1781.子字符串的美丽值之和完整代码1781.子字符串的美丽值之和 力扣传送门&#xff1a; https://leetcode.cn/problems/sum-of-beauty-of-all-substrings/description/ 题目描述&#xff1a; 一个字符串的 美丽值 定义为&#xff1a;出现频率最高字符与出现频率最低字…

CMake中add_compile_options/target_compile_options的使用

CMake中的add_compile_options命令用于向源文件的编译添加选项&#xff0c;其格式如下&#xff1a; add_compile_options(<option> ...) 将选项添加到COMPILE_OPTIONS目录属性。从当前目录及以下目录编译target时&#xff0c;将使用这些选项。 add_compile_option…

48-90-Scala-函数式编程基础特性等

48-Scala-函数式编程&#xff1a; 函数式编程 1、完全面向对象编程 2、函数式编程&#xff0c;万物皆函数&#xff0c;程序语句的集合&#xff0c;称为函数。类中的函数称之方法。函数无重载重写概念&#xff0c;方法可以。函数可以嵌套 3、函数的定义def test3(s:String):…

电子书资源:分享10个非常好用的免费书籍资源网站

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

Qt扫盲-QCheckBox 理论总结

QCheckBox 理论总结1. 简述2. 分组3. 状态&信号4. 外观&快捷键1. 简述 QCheckBox是一个选项按钮&#xff0c;可以 选中 或 未选中。复选框通常用于表示应用程序中可以启用或禁用的功能&#xff0c;而不会影响其他功能。可以实现不同类型的行为。一般是很多个联用的。 …

Cookie、Session、Token比较

1 Cookie cookie 指的就是浏览器里面能永久存储的一种数据&#xff0c;仅仅是浏览器实现的一种数据存储功能。 cookie由服务器生成&#xff0c;发送给浏览器&#xff0c;浏览器把cookie以 key-value 形式保存到某个目录下的文本文件内&#xff0c;下一次请求同一网站时会把该…

基于适应度-距离平衡的人工生态系统优化算法解决瞬态稳定性约束最优潮流问题(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

Awaitility同步异步工具介绍与RocketMQ中实战

在编写测试用例的时候遇到有异步或者队列处理的时候经常会用到 Thread.sleep() 等待来进行测试。例如&#xff1a;DLedger 测试选举的过程。当DLedger Leader下线。此时DLedger会重新发起选举&#xff0c;这个选举的过程是需要一定时间。很多时候在测试代码中就会使用 Thread.s…

b站黑马的Vue4小时快速入门案例代码——计数器

目录 目标效果&#xff1a; 重点原理&#xff1a; 1.创建Vue实例的时候&#xff1a; 2.v-on——为元素绑定事件 3.v-text——【解析文本用】设置标签的文本值 v-text【简写】为{{}} 实现步骤&#xff1a; 代码部分&#xff1a; 1.计数器模板.html(全是重点&#xf…

m基于粒子群算法的分布式电源DG的优化配置

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 随着科技的发展&#xff0c;人民生活水平的不断提高&#xff0c;使得当今社会的发展对能源环保性和供电的可靠性的要求也不断提高。集中式供电系统由于污染大、可靠性差及操作难度大等缺陷越来越…

MySQL数据库基础知识7,查询的执行过程

目录一、拆分查询二、分解关联查询三、查询的执行过程四、优化器的一些优化手段1、重新定义关联表的顺序2、将外连接转化为内连接3、使用增加变换规则4、优化count()、max()、min()5、预估并转化为常量表达式6、覆盖索引扫描7、提前终止查询五、MySQL如何执行关联查询六、查询执…

【HTML期末学生大作业】 制作一个简单HTML宠物网页(HTML+CSS)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Linux 学习笔记 04 —— 文件管理和磁盘管理相关命(2) 详解 grep 命令

用法 less 参数 文件 常用用法 很实用的搜索功能。 向前搜索 / &#xff1a; 使用一个模式进行搜索&#xff0c;并定位到下一个匹配的文本 n &#xff1a; 向前查找下一个匹配的文本 N &#xff1a; 向后查找前一个匹配的文本 向后搜索 ? &#xff1a; 使用模式进行搜…