ElementUI编辑表格单元格与查看模式切换的应用

需求:有时候在填写表单的时候,想要在输入的时候是input输入框的状态,但是当鼠标移出输入框失去焦点时,希望是查看的状态,这种场景可以通过 v-if实现

vue2+ElementUi里面使用如下:

1.el-table标签注册 @cell-click="editName" :key="randomKey"

2.在需要编辑的单元格el-table-column 加入template---input输入框

javscript 复制代码
 <el-table
      key="one"
      cellspacing="0"
      border
      style="border-collapse: collapse;min-height: 65vh;"
      :data="tableData2"
      :cell-style="iCellStyle"
      :header-cell-style="tableHeaderColor"
      :row-class-name="TableRowClassName"
      :key="randomKey"
      @cell-click="editName"
      show-summary
    >
    
 <el-table-column prop="item2" label="晚目标" align="center">
        <template slot-scope="scope">
          <el-input
            v-if="scope.row[scope.column.property + 'isShow']"
            :ref="scope.column.property"
            v-model="scope.row.item2"
            @blur="alterData(scope.row, scope.column)"
          ></el-input>
          <span v-else>{{ scope.row.item2 }}</span>
        </template>
      </el-table-column>
      
</el-table>


data:{
randomKey: Math.random(),
}

methds:{

//编辑单元格事件更新
 editName(row, column) {
      row[column.property + 'isShow'] = true
      // refreshTable是table数据改动时,刷新table的
      this.refreshTable()
      this.$nextTick(() => {
        this.$refs[column.property] && this.$refs[column.property].focus()
      })
    },

  //表格触发事件
  alterData(row, column) {
      row[column.property + 'isShow'] = false
      this.refreshTable()
    },
    
    //更新表格
    refreshTable() {
      this.randomKey = Math.random()
    },

}

vue3+ElementPlus 表单编辑与查看模式切换的应用

方法一

实现思路:

具体实现如下:当flag=true时候展示el-input输入框(v-if="row.flag")

当flag=false时,展示else部分也就
部分,也就是查看模式的页面
当el-input失去焦点时候绑定一个toLook事件,将flag设置为false,进去查看模式
当div元素点击时触发一个toEdit事件,将flag设置为true,进入编辑模式

html

javascript 复制代码
<el-table-column label="属性值名称">
  <template #default="scope">
 <el-input
   ref="inputArr"
   v-if="scope.row.flag"
   @blur="toLook(scope.row)"
   size="small"
   placeholder="请你输入属性值名称"
   v-model="scope.row.valueName">
</el-input>
    
              
   <div v-else @click="toEdit(scope.row)">{{ scope.row.valueName }}</div>
  </template>
</el-table-column>

js

javascript 复制代码
const toLook = (row) => {
    row.flag = false 
}

const toEdit = (row) => {
  row.flag = true
  //nextTick:响应式数据发生变化,获取更新的DOM(组件实例)
  nextTick(() => {
    inputArr.value.focus()
  })
}

方法二:

点击编辑,使当前行需要修改的列变为 input 输入框

javascript 复制代码
<template>
  <div class="p-10">
    <el-table :data="tableData" border>
      <el-table-column prop="date" label="Date"></el-table-column>
      <el-table-column prop="name" label="Name"></el-table-column>
      <el-table-column prop="address" label="Address"></el-table-column>
      <el-table-column label="Value">
        <template #default="scope">
          <span v-show="scope.$index !== editIndex">{{ scope.row.value }}</span>
          <el-input
            v-show="scope.$index === editIndex"
            v-model="scope.row.value"
          ></el-input>
        </template>
      </el-table-column>
      <el-table-column label="Operate">
        <template #default="{ row }">
          <el-button link @click="handleEdit(row)">Edit</el-button>
          <el-button type="primary" link @click="handleSave">Save</el-button>
          <el-button type="danger" link @click="handleDelete(row)"
            >Delete</el-button
          >
        </template>
      </el-table-column>
    </el-table>
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue'

const tableData = ref([
  {
    date: '2016-05-03',
    name: 'Tom',
    address: 'No. 189, Grove St, Los Angeles',
    value: '1'
  },
  {
    date: '2016-05-02',
    name: 'Tom',
    address: 'No. 189, Grove St, Los Angeles',
    value: '2'
  },
  {
    date: '2016-05-04',
    name: 'Tom',
    address: 'No. 189, Grove St, Los Angeles',
    value: '3'
  },
  {
    date: '2016-05-01',
    name: 'Tom',
    address: 'No. 189, Grove St, Los Angeles',
    value: '4'
  }
])
const editIndex = ref(-1)

const handleEdit = (row) => {
  editIndex.value = tableData.value.indexOf(row)
}

const handleSave = () => {
  editIndex.value = -1
  console.log(tableData.value)
}

const handleDelete = (row) => {
  tableData.value.splice(tableData.value.indexOf(row), 1)
}
</script>
相关推荐
我穿棉裤了几秒前
文字换行自动添加换行符“-”
前端·javascript·vue.js
six+seven5 分钟前
Node.js内置模块fs
前端·node.js
少莫千华6 分钟前
【HTML】CSS绘制奥运五环
前端·css·html
沛沛老爹6 分钟前
Web开发者转型AI安全核心:Agent Skills沙盒环境与威胁缓解实战
java·前端·人工智能·安全·rag·web转型升级
仰泳之鹅19 分钟前
【杂谈】C语言中的链接属性、声明周期以及static关键字
java·c语言·前端
2501_9403152622 分钟前
【无标题】(leetcode933)最近的请求次数
java·前端·javascript
每天吃饭的羊34 分钟前
LeetCode 第一题
前端
入门级前端开发35 分钟前
vue集成xlsl实现前端表格导入导出
前端·javascript·vue.js
小二·39 分钟前
Python Web 开发进阶实战:联邦学习平台 —— 在 Flask + Vue 中构建隐私保护的分布式 AI 训练系统
前端·python·flask
一人の梅雨1 小时前
中国制造网商品详情接口进阶实战:跨境场景下的差异化适配与问题攻坚
java·前端·javascript