arcodesign vue中实现可编辑表格,并把数据传到后端


前言

在arcodesign vue 中实现可编辑表格,当单元格被点击时,会切换到编辑模式,再次点击就会取消编辑模式,通过保存按钮把数据传到后端,进行保存。


提示:以下是本篇文章正文内容,下面案例可供参考

一、创建一个表格

创建一个包含表格数据的data属性,并在template中渲染表格组件,将data中的数据绑定到表格中。这里使用a-table组件创建的表格。下面部分代码为index.vue

<a-table
  row-key="id"
  :loading="loading"
  :columns="(cloneColumns as TableColumnData[])"
  :data="Data"
  :bordered="{wrapper:true,cell:true}"
  :size="size"
  :default-expand-all-rows="true"
  ref="artable"
>
</a-table>

数据在data.ts文件中

import { computed } from 'vue';
import type { TableColumnData } from '@arco-design/web-vue/es/table/interface';
export const columns = computed<TableColumnData[]>(() => [
     {
       title:  'ID',
       dataIndex: 'SWUTID',
       align:'center',
     },
     {
      title:  '名称',
      dataIndex: 'NM',
      align:'center',
    },
     {
       title:  '班级',
       dataIndex: 'classnm',
       align:'center',
       slotName: 'classnm',
     },
     {
       title:  '学校',
       dataIndex: 'school',
       align:'center',
       slotName: 'school',
     },
  ]);

二、为表格添加点击功能

为每一行添加点击事件。当用户点击行时,进入编辑模式。再次点击时,取消编辑模式。你可以使用@row-click事件来实现这个功能。

<a-table
  row-key="id"
  :loading="loading"
  :columns="(cloneColumns as TableColumnData[])"
  :data="Data"
  :bordered="{wrapper:true,cell:true}"
  :size="size"
  :default-expand-all-rows="true"
  ref="artable"
  @row-click="handleRowClick" 
>
function handleRowClick(record: Record<string, any>): void {
  if (isInEditMode(record)) {
    toggleEditMode(record);
  } else {
    inEditMode.value = { [record.ID]: true };
  }
}

其中isInEditMode(),toggleEditMode()为判断是否在编辑状态的函数。

三、为表格添加编辑功能

在处于编辑模式的单元格中,显示一个输入框,以便用户可以编辑内容。在a-table标签中,使用template来定义单元格的样式。单元格内容需要双向绑定,因此可以使用v-model来绑定数据。以下代码为index.vue文件中。代码如下(示例):

<a-table
         row-key="id"
        :loading="loading"
        :columns="(cloneColumns as TableColumnData[])"
        :data="Data"
        :bordered="{wrapper:true,cell:true}"
        :size="size"
        :default-expand-all-rows="true"
        ref="artable"
        @row-click="handleRowClick" 
      >
 <template #classnm="{ record,  column }">
     <td @click="toggleEditMode(record)" :class="isInEditMode(record)? 'in-edit-mode' : ''">
       <div class="cell-content">
         {{ record[column.dataIndex] }}
       </div>
       <input v-show="isInEditMode(record)" type="text" v-model="record[column.dataIndex]" />
     </td>
 </template>
 <template #school="{ record,  column }">
     <td @click="toggleEditMode(record)" :class="isInEditMode(record)? 'in-edit-mode' : ''">
       <div class="cell-content">
         {{ record[column.dataIndex] }}
       </div>
       <input v-show="isInEditMode(record)" type="text" v-model="record[column.dataIndex]" />
     </td>
 </template>
 </a-table>
const inEditMode = ref<Record<string, boolean>>({});
const editedRecordsToSave = ref([]);
//用于判断当前行是否处于编辑状态
function isInEditMode(record: Record<string, any>): boolean {
  return !!inEditMode.value[record.ID];
}
//用于切换当前行的编辑状态
function toggleEditMode(record: Record<string, any>): void {
  inEditMode.value[record.ID] =!inEditMode.value[record.ID];
}

注意:如果使用下面代码一定要在data.ts文件中加入下面图片框起来部分,并且名字对应起来:
在这里插入图片描述

 <template #school="{ record,  column }">
     <td @click="toggleEditMode(record)" :class="isInEditMode(record)? 'in-edit-mode' : ''">
       <div class="cell-content">
         {{ record[column.dataIndex] }}
       </div>
       <input v-show="isInEditMode(record)" type="text" v-model="record[column.dataIndex]" />
     </td>
 </template>

四、保存数据

添加保存按钮,save为调用的接口,代码如下(示例):

<a-button type="primary" @click="saveData">
	<template #icon>
    	<icon-search />
    </template>
     	保存
</a-button>
function saveData(): void {
  collectEditedRecords();
  if (editedRecordsToSave.value.length === 0) {
    Message.error("没有处于编辑状态的行数据,不需要保存");
    return;
  }
  else{
    const editedRecords = editedRecordsToSave.value;

// 将代理对象转换为普通对象
const plainRecords = editedRecords.map(record => Object.assign({}, record));

// 现在 plainRecords是一个包含普通对象的数组
    save(plainRecords[0]).then(()=>{
      Message.success("保存成功");
      fetchData();
    inEditMode.value= {};
  });
}
}

四、完整代码

<a-button type="primary" @click="saveData">
              <template #icon>
                <icon-search />
              </template>
             保存
            </a-button>
<a-table
         row-key="id"
        :loading="loading"
        :columns="(cloneColumns as TableColumnData[])"
        :data="Data"
        :bordered="{wrapper:true,cell:true}"
        :size="size"
        :default-expand-all-rows="true"
        ref="artable"
        @row-click="handleRowClick" 
      >
 <template #classnm="{ record,  column }">
     <td @click="toggleEditMode(record)" :class="isInEditMode(record)? 'in-edit-mode' : ''">
       <div class="cell-content">
         {{ record[column.dataIndex] }}
       </div>
       <input v-show="isInEditMode(record)" type="text" v-model="record[column.dataIndex]" />
     </td>
 </template>
 <template #school="{ record,  column }">
     <td @click="toggleEditMode(record)" :class="isInEditMode(record)? 'in-edit-mode' : ''">
       <div class="cell-content">
         {{ record[column.dataIndex] }}
       </div>
       <input v-show="isInEditMode(record)" type="text" v-model="record[column.dataIndex]" />
     </td>
 </template>
 </a-table>
const inEditMode = ref<Record<string, boolean>>({});
const editedRecordsToSave = ref([]);
function isInEditMode(record: Record<string, any>): boolean {
  return !!inEditMode.value[record.SWUTID];
}

function toggleEditMode(record: Record<string, any>): void {
  inEditMode.value[record.SWUTID] =!inEditMode.value[record.SWUTID];
}

function handleRowClick(record: Record<string, any>): void {
  if (isInEditMode(record)) {
    toggleEditMode(record);
  } else {
    inEditMode.value = { [record.SWUTID]: true };
  }
}

// 收集处于编辑状态的行数据
function collectEditedRecords(): void {
  editedRecordsToSave.value = renderData.value.filter((record) => isInEditMode(record));
}
// 保存更改
function saveData(): void {
  collectEditedRecords();
  if (editedRecordsToSave.value.length === 0) {
    Message.error("没有处于编辑状态的行数据,不需要保存");
    return;
  }
  else{
    const editedRecords = editedRecordsToSave.value;

// 将代理对象转换为普通对象
const plainRecords = editedRecords.map(record => Object.assign({}, record));

// 现在 plainRecords是一个包含普通对象的数组
    save(plainRecords[0]).then(()=>{
      Message.success("保存成功");
      fetchData();
    inEditMode.value= {};
  });
}
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 使用 ElementUI 实现编辑表格,可以通过以下几个步骤实现: 1. 在 Vue 组件引入 ElementUI 的表格组件和按钮组件。可以使用 `el-table` 实现表格,使用 `el-button` 实现按钮。 2. 在 `data` 定义表格的数据源,以及保存编辑状态的变量。例如,定义一个 `tableData` 数组来保存表格的数据,定义一个 `editIndex` 变量来保存当前编辑的行的索引。 3. 在表格添加一个列,用于显示编辑按钮。该列的 `slot` 属性可以设置为 `header`,表示该列是表头,且表头内容由自定义模板来渲染。在自定义模板,可以添加一个按钮来触发编辑操作。 4. 添加编辑操作的方法。当点击编辑按钮时,将当前行的索引保存到 `editIndex` 变量。在表格的每一行,可以通过 `v-if` 指令来判断当前行是否处于编辑状态,从而决定是否显示编辑框。 5. 添加保存操作的方法。当点击保存按钮时,将编辑后的数据发送给后端,同时将 `editIndex` 变量重置为 `-1`,表示当前不处于编辑状态。 代码示例: ```html <template> <div> <el-table :data="tableData"> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="age" label="年龄"></el-table-column> <<el-table-column label="操作"> <template slot="header"> <el-button type="primary" @click="handleAdd">添加</el-button> </template> <template slot-scope="scope"> <el-button v-if="editIndex !== scope.$index" @click="handleEdit(scope.$index)">编辑</el-button> <el-button v-else @click="handleSave(scope.$index)">保存</el-button> </template> </el-table-column> </el-table> </div> </template> <script> export default { data() { return { tableData: [ { name: '张三', age: 20 }, { name: '李四', age: 25 }, { name: '王五', age: 30 } ], editIndex: -1 }; }, methods: { handleAdd() { this.tableData.push({ name: '', age: '' }); }, handleEdit(index) { this.editIndex = index; }, handleSave(index) { const editedData = this.tableData[index]; // 将编辑后的数据发送给后端 console.log('保存数据:', editedData); this.editIndex = -1; } } }; </script> ``` 在上面的代码示例,编辑按钮的显示与隐藏通过 `v-if` 指令来实现。当 `editIndex` 等于当前行的索引时,显示保存按钮;否则,显示编辑按钮。编辑后的数据可以通过表格的 `data` 属性来绑定。当数据发生变化时,表格会自动重渲染。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值