Vue 3 + Element Plus 封装单列控制编辑的可编辑表格组件

ops/2024/9/19 14:53:36/ 标签: vue.js, 前端, javascript, elementui

在Web应用开发中,经常需要提供表格数据的编辑功能。本文将介绍如何使用Vue 3结合Element Plus库来实现一个支持单列控制编辑功能的表格,并通过封装组件的形式提高代码的复用性。通过本教程,你将学会如何构建一个具备单列控制编辑功能的表格组件,并在表单提交时保存更改。

b536e14756a64abeba1a16e60adfcd0f.png

目标

  • 实现一个基本的表格,其中包含日期、名称和描述等列。
  • 表格中的每一项都可以在点击编辑图标后进入编辑模式。
  • 编辑模式下可以修改表格单元格的内容。
  • 编辑完成后,可以通过失去焦点的方式提交更改。
  • 支持单列控制编辑,即可以单独控制每一列表格单元格的编辑状态。
  • 封装成可复用的组件,便于在其他项目中使用。

创建表格组件

我们将创建一个主组件App.vue和一个子组件EditableCell.vue来实现表格的编辑功能。

主组件 App.vue

<template><div class="table-layout"><el-table :data="tableData"><el-table-column type="index" label="序号" width="60" /><el-table-column prop="id" label="ID" width="80" /><el-table-column prop="date" label="日期"><template #default="scope"><EditableCell:cell-data="scope.row.date":is-editing="scope.row.isEditDate":column="scope.column.property":row="scope.row"@toggleEdit="toggleEdit"@applyChanges="applyChanges"/></template></el-table-column><el-table-column prop="name" label="名称"><template #default="scope"><EditableCell:cell-data="scope.row.name":is-editing="scope.row.isEditName":column="scope.column.property":row="scope.row"@toggleEdit="toggleEdit"@applyChanges="applyChanges"/></template></el-table-column><el-table-column prop="description" label="描述"><template #default="scope"><EditableCell:cell-data="scope.row.description":is-editing="scope.row.isEditDescription":column="scope.column.property":row="scope.row"@toggleEdit="toggleEdit"@applyChanges="applyChanges"/></template></el-table-column></el-table></div></template><script setup>import { ref } from 'vue';import EditableCell from './EditableCell.vue'; // 确保路径正确import { ElTable, ElTableColumn, ElInput, ElIcon } from 'element-plus';import { Edit } from '@element-plus/icons-vue';// 优化后的tableDataconst tableData = ref([{id: 1,date: '2024-08-01',name: '项目A',description: '这是一个关于项目A的描述',isEditDate: false,isEditName: false,isEditDescription: false},{id: 2,date: '2024-08-15',name: '项目B',description: '这是一个关于项目B的描述',isEditDate: false,isEditName: false,isEditDescription: false},{id: 3,date: '2024-09-01',name: '项目C',description: '这是一个关于项目C的描述',isEditDate: false,isEditName: false,isEditDescription: false}]);function toggleEdit(column, row) {if (column && row) {const editKey = `isEdit${column.charAt(0).toUpperCase() + column.slice(1)}`;row[editKey] = !row[editKey];}}function applyChanges(newValue, column, row) {if (column && row) {row[column] = newValue;const editKey = `isEdit${column.charAt(0).toUpperCase() + column.slice(1)}`;row[editKey] = false;}}</script><style scoped>.table-layout {width: 60%;margin: 60px auto;}.edit-icon {margin: 10px 0 0 10px;}</style>

子组件 EditableCell.vue

1<template>
2  <div>
3    <span v-if="!isEditing">{{ displayData }}</span>
4    <el-input
5      v-else
6      v-model="displayData"
7      style="width: 120px;"
8      @blur="onBlur"
9    />
10    <el-icon color="#409EFF" class="edit-icon" @click="onToggleEdit">
11      <Edit />
12    </el-icon>
13  </div>
14</template>
15
16<script>
17export default {
18  name: 'EditableCell',
19  props: ['cellData', 'isEditing', 'column', 'row'], // 添加row属性
20  emits: ['toggleEdit', 'applyChanges'],
21  data() {
22    return {
23      displayData: this.cellData
24    };
25  },
26  watch: {
27    cellData(newVal) {
28      this.displayData = newVal;
29    }
30  },
31  methods: {
32    onToggleEdit() {
33      this.$emit('toggleEdit', this.column, this.row); // 传递column和row
34    },
35    onBlur() {
36      this.$emit('applyChanges', this.displayData, this.column, this.row); // 传递column和row
37    }
38  }
39}
40</script>
41
42<style scoped>
43.edit-icon {
44  margin: 10px 0 0 10px;
45}
46</style>

说明

  1. 子组件 (EditableCell.vue):

    • 使用内部状态displayData来存储编辑时的值,并通过watch确保它与cellData同步。
    • 在模板中,根据编辑状态显示不同的内容。
    • onBlur方法中提交更改,并正确调用applyChanges方法。
  2. 父组件 (App.vue):

    • 在模板中,通过scope.column.property获取列的属性名称,并将其传递给子组件。
    • 在模板中,通过scope.row将行数据传递给子组件。
    • toggleEdit方法中,通过构造的editKey来切换编辑状态。
    • applyChanges方法中,通过构造的editKey来更新编辑状态,并保存新值。

通过这种方式,我们实现了表格的编辑功能,并确保了编辑状态下数据的正确提交。

总结

本文介绍了如何使用Vue 3和Element Plus实现一个带有编辑功能的表格。通过本文的步骤,你可以轻松地在自己的项目中实现类似的表格编辑功能。希望这篇教程对你有所帮助!

 


http://www.ppmy.cn/ops/109853.html

相关文章

MySQL 日期函数语法介绍和案例示范以及常见问题解决

本文将以电商交易系统为例&#xff0c;详细讲解 MySQL 日期类型及其转化&#xff0c;常用的日期函数&#xff0c;以及一些解决常见问题的方案。 一、MySQL 日期数据类型 MySQL 提供了多种日期数据类型&#xff0c;适用于不同的使用场景。常见的日期类型包括 DATE、DATETIME、…

深兰科技董事长陈海波出席《中马建交五十周年高级别经贸合作》

2024年9月3日&#xff0c;中马建交50周年高级别经贸合作交流会暨马来西亚第九任首相VIP欢迎晚宴在北京隆重举行&#xff0c;深兰科技创始人、董事长陈海波先生应邀出席。 会议期间&#xff0c;双方举行了品牌出海合作签约仪式。在马来西亚首相雅各布先生的见证下&#xff0c;深…

C语言知识体系思维导图

为了更清晰地描述C语言知识体系&#xff0c;笔者用一个结构化的思维导图来概括其主要组成部分。见下&#xff1a; 这个思维导图旨在提供一个全面而系统的视角&#xff0c;帮助学习者逐步构建扎实的C语言知识体系。随着学习的深入&#xff0c;可以根据个人兴趣和职业需求&#x…

软件架构风格

五大架构风格 1、数据流风格 子风格包括&#xff1a;批处理风格、管道-过滤器风格 2、调用/返回风格 子风格包括&#xff1a;主程序/子程序风格、面向对象风格、分层架构风格 3、独立构件风格 子风格包括&#xff1a;进程通信风格、事件驱动系统&#xff08;隐式调用&…

【Shiro】Shiro 的学习教程(一)之快速入门

目录 1、Shiro 简介2、Shiro 认证、授权2.1、认证2.2、授权 3、快速入门4、自定义 Realm5、加密6、实现授权 1、Shiro 简介 Shiro 官网&#xff1a;https://shiro.apache.org/ Shiro 是一个功能强大且易于使用的 Java 安全框架&#xff0c;它执行身份验证、授权、加密和会话管…

Leetcode面试经典150题-55.跳跃游戏

解法都在代码里&#xff0c;不懂就留言或者私信 class Solution {public boolean canJump(int[] nums) {/**如果就一个位置&#xff0c;你本来就在这&#xff0c;肯定可以跳到*/if(nums.length 1) {return true;}/**这个题的解题思路是遍历数组&#xff0c;如果当前位置不在之…

【自用】计算机网络湖科大教书匠笔记 第一章 概述

文章目录 因特网概述三种交换方式&#xff1a;电路交换、分组交换和报文交换计网的定义及分类计网的性能指标计算机网络体系结构 因特网概述 网络、互联网和因特网 网络由若干结点和连接这些结点的链路组成 多个网络还可以通过路由器互连起来&#xff0c;这样就构成了一个覆盖范…

SpringBoot 读取配置文件的4种方式

文章目录 1. Value 注解读取单个属性2. 使用 ConfigurationProperties 注解3. 通过 Environment 对象读取属性4. 使用 PropertySource 注解加载额外的配置文件 在 Spring Boot 中&#xff0c;application.yml 文件用于配置应用程序的属性&#xff0c;Spring Boot 默认会从 src/…

MyBatis 源码解析:BatchExecutor 与 SimpleExecutor 详解

摘要 在 MyBatis 中&#xff0c;Executor 是执行 SQL 语句的核心组件。SimpleExecutor 和 BatchExecutor 是 Executor 的两种重要实现方式&#xff1a;前者负责简单的 SQL 执行&#xff0c;后者支持批量 SQL 执行。本文将通过自定义实现 BatchExecutor 和 SimpleExecutor&…

如何将Windows风格的剪切和粘贴添加到Mac访达中

你可以在Mac上剪切和粘贴,但此功能在访达中的行为不同。这可能会让新手感到不适,甚至可能会让铁杆Mac用户感到困扰。幸运的是,有一个小的免费应用程序可以“修复”这种不一致。 使用Command X剪切文件和文件夹 Command X是一款免费应用程序,它为Mac上的文件和文件夹添加了…

启动spring boot项目时,第三方jar包扫描不到的问题

讲述一下遇到的问题&#xff1a; 在启动类Application上使用ComponentScan 这个注解来扫描第三方的包&#xff0c;然后就会出现报错。异常就是无法加载本地的bean&#xff0c;但是可以加载到第三方的bean&#xff1b; 了解过spring boot启动流程的都知道&#xff0c;Springboo…

实操搭建battery-historian平台

1 在D盘新建一个文件夹&#xff1a;gosrc 2git clone https://github.com/google/battery-historian.git 3 cd 到D:\gosrc\battery-historian>go mod init gosrc初始化模块名为gosrc&#xff0c;你可以自定义自己的名字 4// 执行该命令&#xff0c;更换为国内代理地址 go en…

外观模式facade

学习笔记&#xff0c;原文链接 https://refactoringguru.cn/design-patterns/facade 为程序库、 框架或其他复杂类提供一个简单的接口 把要做的事全放在一个类里给他做了&#xff0c;然后要用的时候直接创建这个类的实例

享元模式flyweight

学习笔记&#xff0c;原文链接 https://refactoringguru.cn/design-patterns/flyweight 通过共享多个对象所共有的相同状态&#xff0c; 让你能在有限的内存容量中载入更多对象。享元会将不同对象的相同数据进行缓存以节省内存。 factory里面treeType共用了

前端算法(持续更新)

1、最大的钻石 1楼到n楼的每层电梯口都放着一个钻石&#xff0c;钻石大小不一。你从电梯1楼到n楼&#xff0c;每层楼电梯门都会打开一次&#xff0c;只能拿一次钻石&#xff0c;问怎样才能最大的钻石&#xff1f; 解题思路&#xff1a; 这是一个经典的动态规划问题&#xff…

策略模式的小记

策略模式 策略模式支付系统【场景再现】硬编码完成不同的支付策略使用策略模式&#xff0c;对比不同&#xff08;1&#xff09;支付策略接口&#xff08;2&#xff09;具体的支付策略类&#xff08;3&#xff09;上下文&#xff08;4&#xff09;客户端&#xff08;5&#xff0…

高效物流管理从固乔快递批量查询助手开始

固乔快递批量查询助手&#xff1a;物流管理的智能化升级 固乔快递查询助手&#xff1a;批量追踪&#xff0c;物流无忧 轻松应对海量单号&#xff0c;固乔快递批量查询助手来帮忙 跨境电商新利器&#xff1a;固乔快递批量查询助手 高效物流管理从固乔快递批量查询助手开始 …

安装FTP服务器教程

一。安装vsftpd yum install vsftpd 二。修改配置文件&#xff0c;匿名账户具有访问&#xff0c;上传和创建目录的权限 vim /etc/vsftpd/vsftpd.conf &#xff08;红色进行设置放开YES&#xff09; local_enable&#xff1a;本地登陆控制&#xff0c;no表示禁止&#xff0c;ye…

大模型的第一个杀手级应用场景出来了

大家终于都意识到大模型首先改变的是软件行业自己&#xff0c;而软件的根基是代码生成。代码生成第一波就是AI辅助开发&#xff0c;这个会是大模型第一个杀手级应用。大家苦苦逼问自己的大模型杀手级应用&#xff0c;为什么会是辅助编程&#xff0c;这里说下什么&#xff1a; 必…

i++与++i在for循环中效果一样?

首先说结果 是的&#xff0c;在Visual Studio 2022中&#xff0c;不同于直接printf&#xff0c;在for循环中的i与i是同样的效果&#xff08;都当作了i&#xff09; 这是编译器干的好事。 如图比对 i i 原因探寻 | i i的底层原理 找到一篇博客&#xff0c;我目前还看不太明…