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

  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 excel上传预览和table内容下载到excel文件中

    Vue Excel上传预览 在Vue中实现Excel上传预览,需要使用以下三个库:xlsx、file-saver、vue-xlsx。引入这三个库后,在Vue组件中可以实现以下代码: <template> <div> <input type="file" @change="onUpload"…

    Vue 2023年5月28日
    00
  • Vue.js中的计算属性、监视属性与生命周期详解

    Vue.js中的计算属性、监视属性与生命周期详解 计算属性 什么是计算属性 计算属性(computed)是Vue.js内置的一个特殊属性,可以定义一个依赖其它属性的计算属性,而这个计算属性的值会被缓存起来,在某些需要频繁用到的属性计算中,计算属性会比直接通过方法计算效率更高,因为计算属性是有缓存的,只有在它的相关属性发生改变时才会重新计算,否则直接取缓存值。…

    Vue 2023年5月28日
    00
  • vue 封装导出Excel数据的公共函数的方法

    下面是关于Vue封装导出Excel数据的公共函数的方法的完整攻略: 1. 添加文件依赖 首先,需要在项目中添加xlsx和file-saver两个文件依赖,这两个依赖可以通过npm安装: npm install –save xlsx file-saver 然后,在Vue组件中调用需要导出Excel的数据的所在请求API,并将请求结果存储在某个变量中。例如: …

    Vue 2023年5月27日
    00
  • Vue+webpack项目配置便于维护的目录结构教程详解

    下面我将详细讲解“Vue+webpack项目配置便于维护的目录结构教程详解”的完整攻略。 1. 开始前的准备 首先需要确保已经正确安装了Node.js和Vue-cli,并且创建了一个基于Vue-cli的项目。 2. 目录结构设计 在Vue-cli创建的项目中,已经自带了一些目录和文件,如下所示: . ├── README.md ├── babel.confi…

    Vue 2023年5月28日
    00
  • vue3中使用swiper的完整版教程(超详细!)

    Vue3中使用Swiper的完整版教程(超详细!) Swiper是一款非常流行的轮播图插件,这里介绍如何在Vue3中使用Swiper。 安装Swiper插件 使用以下命令安装Swiper: npm install swiper 如果你已经在项目中安装了jQuery,那么就不需要再安装Swiper了。 引入Swiper插件 在Vue3中,你可以使用以下方式引入…

    Vue 2023年5月28日
    00
  • Vue2.x与Vue3.x中路由钩子的区别详解

    来详细讲解“Vue2.x与Vue3.x中路由钩子的区别详解”。 Vue2.x与Vue3.x中路由钩子的区别详解 路由钩子的概念 在Vue中,路由是一个非常重要的概念,它用来管理应用程序中的导航。路由钩子则是在路由发生改变的时候,触发的一些函数,用于控制路由跳转的行为以及实现一些特殊的业务逻辑。 Vue2.x中路由钩子 在Vue2.x中,路由钩子分为三种类型:…

    Vue 2023年5月28日
    00
  • vue3.0 移动端二次封装van-uploader实现上传图片(vant组件库)

    下面我将为大家详细讲解如何在 vue3.0 移动端进行二次封装 van-uploader 组件实现上传图片。主要包含以下步骤: 安装 vant 组件库 创建一个新的 vue 组件,引入 vant 的 van-uploader 组件 封装 van-uploader 组件,增加一些自定义的属性和方法 在组件中使用封装后的 van-uploader 组件 接下来,…

    Vue 2023年5月28日
    00
  • mpvue 单文件页面配置详解

    我来为你详细讲解“mpvue 单文件页面配置详解”的完整攻略。 mpvue 单文件页面配置详解 1. 简介 mpvue 是一款使用 Vue.js 开发小程序的前端框架,可在小程序原生 API 基础上,结合 Vue.js 语法规范进行开发。 在 mpvue 中,我们可以通过单文件组件(SFC)的形式,实现对小程序页面的开发和配置。通过配置 SFC 的 temp…

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