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

 更新时间:2024年09月11日 11:22:45   作者:前端学步  
在Web应用开发中实现表格数据编辑功能至关重要,本文将详细介绍如何使用Vue3和ElementPlus库来构建一个支持单列编辑的表格组件,本教程详细阐述了组件创建过程和数据绑定机制,帮助你快速掌握Vue3中表格编辑功能的实现,感兴趣的朋友一起看看吧

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

目标

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

创建表格组件

我们将创建一个主组件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';
  // 优化后的tableData
  const 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

<template>
  <div>
    <span v-if="!isEditing">{{ displayData }}</span>
    <el-input
      v-else
      v-model="displayData"
      style="width: 120px;"
      @blur="onBlur"
    />
    <el-icon color="#409EFF" class="edit-icon" @click="onToggleEdit">
      <Edit />
    </el-icon>
  </div>
</template>
<script>
export default {
  name: 'EditableCell',
 props: ['cellData', 'isEditing', 'column', 'row'], // 添加row属性
  emits: ['toggleEdit', 'applyChanges'],
  data() {
    return {
      displayData: this.cellData
    };
  },
  watch: {
    cellData(newVal) {
      this.displayData = newVal;
    }
  },
  methods: {
    onToggleEdit() {
      this.$emit('toggleEdit', this.column, this.row); // 传递column和row
    },
    onBlur() {
      this.$emit('applyChanges', this.displayData, this.column, this.row); // 传递column和row
    }
  }
}
</script>
<style scoped>
.edit-icon {
  margin: 10px 0 0 10px;
}
</style>

说明

子组件 (EditableCell.vue):

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

父组件 (App.vue):

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

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

总结

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

到此这篇关于Vue 3 + Element Plus 封装单列控制编辑的可编辑表格组件的文章就介绍到这了,更多相关Vue 3 Element Plus 编辑表格组件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用element-ui table expand展开行实现手风琴效果

    使用element-ui table expand展开行实现手风琴效果

    这篇文章主要介绍了使用element-ui table expand展开行实现手风琴效果,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • vue实现防抖的实例代码

    vue实现防抖的实例代码

    这篇文章主要给大家介绍了关于vue实现防抖的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • vue点击导航页面实现自动滚动到特定位置

    vue点击导航页面实现自动滚动到特定位置

    这篇文章主要介绍了vue点击导航页面实现自动滚动到特定位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • vue2过滤器模糊查询方法

    vue2过滤器模糊查询方法

    今天小编就为大家分享一篇vue2过滤器模糊查询方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • vue 卸载eslint方式

    vue 卸载eslint方式

    这篇文章主要介绍了vue 卸载eslint方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • Vue实现前后端完全分离的项目实战

    Vue实现前后端完全分离的项目实战

    本文主要介绍了Vue实现前后端完全分离的项目实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Vue通过axios调用json地址数据的方法

    Vue通过axios调用json地址数据的方法

    在现代Web开发中,前后端分离已成为标准做法,Vue.js作为前端框架中的佼佼者,提供了丰富的API来处理数据和服务端的交互,其中一个常用的库是axios,本文将详细介绍如何在Vue项目中使用axios来调用JSON数据,需要的朋友可以参考下
    2024-09-09
  • Vue实现拖放排序功能的实例代码

    Vue实现拖放排序功能的实例代码

    本文通过实例代码给大家介绍了Vue中实现拖放排序功能,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • vue2导入使用vue-codemirror组件的教程详解

    vue2导入使用vue-codemirror组件的教程详解

    vue-codemirror是一个基于Vue的代码在线编辑器组件,它封装了CodeMirror编辑器,使得在Vue项目中可以方便地使用CodeMirror,下面我们就来看看vue-codemirror的具体使用吧
    2024-02-02
  • Vue实现简易跑马灯效果

    Vue实现简易跑马灯效果

    这篇文章主要为大家详细介绍了Vue实现简易跑马灯效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05

最新评论