vue+element-ui实现表格编辑的三种实现方式

yizhihongxing
  1. 方式一:基于element-ui table组件的行内编辑功能

element-ui提供了table组件可供开发者使用,在table组件中,只需设置editable属性为true,就能实现行内编辑的功能。同时,通过监听table组件的@cell-click事件,就可以在用户单击单元格时进行编辑

具体示例代码如下:

<!-- template -->
<template>
  <el-table :data="tableData" @cell-click="handleCellClick">
    <el-table-column label="姓名" prop="name"></el-table-column>
    <el-table-column label="年龄" prop="age"></el-table-column>
    <el-table-column label="地址" prop="address"></el-table-column>
  </el-table>
</template>

<script>
// script
export default {
  data() {
    return {
      tableData: [
        { name: '张三', age: 18, address: '北京市海淀区' },
        { name: '李四', age: 20, address: '上海市黄浦区' },
        { name: '王五', age: 22, address: '广东省深圳市南山区' }
      ],
      editable: false  // 初始设置为不可编辑
    }
  },
  methods: {
    handleCellClick(row, column, cell, event) {  // 监听cell-click事件
      if (this.editable === false) {   // 如果不是可编辑状态,则什么都不做,退出函数
        return
      }
      this.$nextTick(() => {   // 在下一个 tick 时进行编辑,此处使用了nextTick方法
        const editableCell = cell.getElementsByTagName('input')[0]   // 获取当前单元格的可编辑元素
        editableCell.focus()  // 将光标设置到可编辑元素中
      })
    }
  }
}
</script>
  1. 方式二:基于element-ui dialog组件的表格编辑功能

如果需要实现编辑后保存的功能,我们可以使用dialog组件来创建编辑表单。

具体示例代码如下:

<!-- template -->
<template>
  <div>
    <el-table :data="tableData">
      <el-table-column label="姓名" prop="name"></el-table-column>
      <el-table-column label="年龄" prop="age"></el-table-column>
      <el-table-column label="地址" prop="address"></el-table-column>
      <el-table-column label="操作">
        <template #default="scope">
          <el-button type="text" @click="showDialog(scope.$index)">编辑</el-button>
        </template>
      </el-table-column>
    </el-table>
    <el-dialog :visible.sync="dialogVisible" title="编辑">
      <el-form ref="editForm" :model="editForm" label-width="100px">
        <el-form-item label="姓名" prop="name">
          <el-input v-model="editForm.name"></el-input>
        </el-form-item>
        <el-form-item label="年龄" prop="age">
          <el-input v-model.number="editForm.age"></el-input>
        </el-form-item>
        <el-form-item label="地址" prop="address">
          <el-input v-model="editForm.address"></el-input>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="dialogVisible = false">取消</el-button>
        <el-button type="primary" @click="submitForm('editForm')">保存</el-button>
      </div>
    </el-dialog>
  </div>
</template>

<script>
// script
export default {
  data() {
    return {
      tableData: [
        { name: '张三', age: 18, address: '北京市海淀区' },
        { name: '李四', age: 20, address: '上海市黄浦区' },
        { name: '王五', age: 22, address: '广东省深圳市南山区' }
      ],
      dialogVisible: false,   // 标记dialog是否可见
      editForm: {}   // 保存当前正在编辑的表单数据
    }
  },
  methods: {
    showDialog(editIndex) {   // 显示dialog编辑框
      this.dialogVisible = true
      this.editForm = Object.assign({}, this.tableData[editIndex])
    },
    submitForm(formName) {    // 保存表单数据
      this.$refs[formName].validate((valid) => {
        if (valid) {
          const editIndex = this.tableData.findIndex((item) => item.name === this.editForm.name)
          this.tableData.splice(editIndex, 1, this.editForm)   // 替换当前编辑的表单数据
          this.dialogVisible = false
        }
      })
    }
  }
}
</script>
  1. 方式三:基于vue3的实现

在vue3中,我们可以通过<template v-for>的每个列表项绑定一个状态来实现表格编辑功能。

具体示例代码如下:

<!-- template -->
<template>
  <table>
    <thead>
      <tr>
        <th>姓名</th>
        <th>年龄</th>
        <th>地址</th>
        <th>编辑</th>
      </tr>
    </thead>
    <tbody>
      <tr v-for="(rowData, rowIndex) in tableData" :key="rowIndex">
        <td :class="{ 'table-editing': rowData.editing }">
          <span v-if="!rowData.editing">{{ rowData.name }}</span>
          <span v-else>
            <input type="text" v-model="rowData.name" @blur="toggleRowEditStatus(rowIndex)">
          </span>
        </td>
        <td :class="{ 'table-editing': rowData.editing }">
          <span v-if="!rowData.editing">{{ rowData.age }}</span>
          <span v-else>
            <input type="number" v-model.number="rowData.age" @blur="toggleRowEditStatus(rowIndex)">
          </span>
        </td>
        <td :class="{ 'table-editing': rowData.editing }">
          <span v-if="!rowData.editing">{{ rowData.address }}</span>
          <span v-else>
            <input type="text" v-model="rowData.address" @blur="toggleRowEditStatus(rowIndex)">
          </span>
        </td>
        <td>
          <button v-if="!rowData.editing" @click="toggleRowEditStatus(rowIndex)">编辑</button>
          <button v-else @click="saveRowData(rowIndex)">保存</button>
        </td>
      </tr>
    </tbody>
  </table>
</template>

<script>
// script
export default {
  data() {
    return {
      tableData: [
        { name: '张三', age: 18, address: '北京市海淀区', editing: false },
        { name: '李四', age: 20, address: '上海市黄浦区', editing: false },
        { name: '王五', age: 22, address: '广东省深圳市南山区', editing: false }
      ]
    }
  },
  methods: {
    toggleRowEditStatus(rowIndex) {   // 切换当前行的编辑状态
      this.tableData[rowIndex].editing = !this.tableData[rowIndex].editing
    },
    saveRowData(rowIndex) {   // 保存当前行的数据
      this.tableData[rowIndex].editing = false
    }
  }
}
</script>

以上就是三种vue+element-ui实现表格编辑的方式示例。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue+element-ui实现表格编辑的三种实现方式 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • vue-week-picker实现支持按周切换的日历

    接下来我会详细讲解如何使用 vue-week-picker 实现支持按周切换的日历的完整攻略。 1. 简介 vue-week-picker 是一个基于 Vue.js 开发的支持按周切换的日历组件。其核心功能是支持用户在周与周之间进行切换,并显示所选周的日期范围。 2. 安装 首先需要在 Vue.js 项目中安装 vue-week-picker 组件,可以通过…

    Vue 2023年5月29日
    00
  • VUE + UEditor 单图片跨域上传功能的实现方法

    下面是详细讲解“VUE + UEditor 单图片跨域上传功能的实现方法”的完整攻略。 准备工作 首先,我们需要准备以下内容: vue.js:前端框架 UEditor:富文本编辑器 proxy:图片上传代理 其中,UEditor 和 proxy 是必备的,vue.js 可以根据个人喜好选择其他前端框架。 实现方法 1. 在Vue中引入UEditor 我们需要…

    Vue 2023年5月28日
    00
  • el-select 数据回显,只显示value不显示lable问题

    针对el-select数据回显时只显示value而不显示label的问题,有两种解决方案: 方案一:将options数组中的每个对象中的value和label互换 这种方案的核心思想是将options数组中的每个对象中value和label属性的值互换。比如原来options数组的一个元素是这样的: { value: ‘1’, label: ‘选项1’ } …

    Vue 2023年5月27日
    00
  • Vue中的Object.defineProperty全面理解

    Vue中的Object.defineProperty全面理解 Object.defineProperty是ES5语法中用于定义对象属性上的方法。Vue.js中的数据绑定功能就是基于此实现的。本文将深入讲解Object.defineProperty的相关知识点,旨在帮助读者了解Vue.js底层的实现原理。 Object.defineProperty的基本使用 …

    Vue 2023年5月28日
    00
  • Vuex localStorage的具体使用

    当使用Vuex时,我们经常需要将数据在页面刷新后保留下来,此时,可以使用HTML5的localStorage进行本地存储。Vuex为我们提供了相应的方法来实现此功能。 在Vuex中,使用localStorage可以将状态永久存储在本地,当用户刷新页面、关闭浏览器时,状态不会丢失。Vuex提供store.subscribe方法,我们可以通过该方法监听Vuex的…

    Vue 2023年5月28日
    00
  • axios post提交formdata的实例

    下面是详细的攻略。 1. axios post提交formdata的基本语法 在使用axios提交formdata时,需要使用FormData类来创建一个表单对象。具体语法如下: const formData = new FormData() formData.append(‘name1’, ‘value1’) formData.append(‘name2’…

    Vue 2023年5月28日
    00
  • vue学习笔记五:在vue项目里面使用引入公共方法详解

    首先需要明确一下,该攻略是讲述如何在Vue项目中引入公共方法,让这些方法可以在项目的多个地方进行调用。下面按照步骤一一介绍。 步骤一:创建公共方法文件 首先我们需要创建一份公共方法文件,将这些方法封装在一起,供整个项目使用。我们可以在Vue项目的根目录下,创建一个名为utils.js的文件,用于存储公共方法。下面是一个简单的示例: // utils.js /…

    Vue 2023年5月28日
    00
  • Vue 组件渲染详情

    Vue 组件渲染详情是指在 Vue 应用中,如何使用组件进行渲染及其相关的细节。下面将从 Vue 组件的定义、组件间通信、组件生命周期、组件的复用以及常见问题五个方面,来详细讲解 Vue 组件渲染的攻略。 Vue 组件的定义 Vue 组件分为两种:全局组件和局部组件,其定义方式分别如下: 全局组件 全局组件可以在任何 Vue 实例的模板中使用,定义方式如下:…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部