实现<el-table>表格内可编辑(多列)

本文介绍了如何使用ElementUI中的el-table实现表格中特定列的可编辑功能,包括单元格点击切换编辑状态、自动获取焦点以及数据提交和编辑状态管理的详细步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

el-table编辑多列

实现对el-table某几列数据可编辑:

思路如下:

        第一,点击单元格时变成可输入状态,离开单元格或者.enter时提交数据,变成不可输入状态;

        第二,el-input最好自动获取焦点,失焦时变成不可输入状态;

        第三,每个可编辑的列匹配一个是否在编辑状态的字段;

代码如下:

 <el-form :model="formData">
      <el-table :data="formData.tableData" border>
        <el-table-column label="ID" prop="id" align="center" header-align="center"/>
        <el-table-column label="姓名" prop="name" align="center" header-align="center">
          <template #default="{row, $index}">
            <el-form-item :prop="'tableData.'+$index+`.name`">
              <el-input
                v-if="row['isEditname']"
                style="text-align: center;"
                v-model="row.name"
                @blur="blurInput(row, 'isEditname')"
                @keydown.enter="inputNum(row, 'isEditname', 'name', Number(row.name))"
              />
              <span v-else style="display: inline-block;width: 100%;text-align: center;color: #1d61d6;">
                <el-button type="primary" plain text @click="handleEditNum($event, row, 'isEditname')">
                  {{row.name}}
              </el-button>
              </span>
            </el-form-item>
          </template>
        </el-table-column>
        <el-table-column label="城市" prop="address" align="center" header-align="center">
          <template #default="{row, $index}">
            <el-form-item :prop="'tableData.'+$index+`.address`">
              <el-input
                v-if="row['isEditaddress']"
                style="text-align: center;"
                v-model="row.address"
                @blur="blurInput(row, 'isEditaddress')"
                @keydown.enter="inputNum(row, 'isEditaddress', 'address', Number(row.address))"
              />
              <span v-else style="display: inline-block;width: 100%;text-align: center;color: #1d61d6;">
                <el-button type="primary" plain text @click="handleEditNum($event, row, 'isEditaddress')">
                  {{row.address}}
              </el-button>
              </span>
            </el-form-item>
          </template>
        </el-table-column>
        <el-table-column label="性别" prop="sex" align="center" header-align="center">
          <template #default="{row, $index}">
            <el-form-item :prop="'tableData.'+$index+`.sex`">
              <el-input
                v-if="row['isEditsex']"
                style="text-align: center;"
                v-model="row.sex"
                @blur="blurInput(row, 'isEditsex')"
                @keydown.enter="inputNum(row, 'isEditsex', 'sex', Number(row.sex))"
              />
              <span v-else style="display: inline-block;width: 100%;text-align: center;color: #1d61d6;">
                <el-button type="primary" plain text @click="handleEditNum($event, row, 'isEditsex')">
                  {{row.sex}}
              </el-button>
              </span>
            </el-form-item>
          </template>
        </el-table-column>
      </el-table>
    </el-form>
const formData = ref({
  tableData :[
    {id: '1', name: '张张', address: '重庆', sex: '男'},
    {id: '2', name: '李李', address: '北京', sex: '女'},
    {id: '3', name: '王王', address: '上海', sex: '男'},
    {id: '4', name: '可可', address: '广州', sex: '女'},
  ]
})
const editProp = ['name', 'address', 'sex']
function inputNum(row, isEditColumn, column, value) {
  row[isEditColumn] = false
  let par = {}
  par[column] = value
  //再将数据提交给后端接口...
}

function blurInput(row, column){
  row[column] = false//不可编辑状态
}

function handleEditNum(e, row, clolumn) {
  row[clolumn] = true//编辑状态
  const parentNode = e.currentTarget.parentElement.parentElement
  nextTick(() => {
    const input = parentNode.querySelector('.el-input__inner')//获取input
    input.focus()//自动获取焦点
  })
}
function handleArr() {
  formData.value.tableData.forEach((item) => {
    let par = {}
    editProp.forEach(editItem =>{
      par[`isEdit${editItem}`] = false
    })
    item = Object.assign(item, par)
  })
  console.log(formData.value.tableData)
}
onMounted(() => {
  handleArr()
})

<script setup lang="ts"> import { ref, onMounted } from 'vue' /* 导入部门类型 */ /* 导入部门类型 */ import type { DeptModelArray } from '@/api/model/model' import { addApi, queryAllApi } from '@/api/api' import { ElMessage } from 'element-plus' /* 表格数据 ref<指定的类型> 指定的类型:可以通过interface定义出来 */ const tableData = ref<DeptModelArray>([]) /* mock云端假数据:前端测试的时候,后端还没写好,就可以先用mock造一些假数据 */ /* 在页面启动时候通过钩子函数获取数据,渲染到前端页面 */ const deptSearch = async () => { const result = await queryAllApi() tableData.value = result.data } onMounted(() => { deptSearch() }) const dialogFormVisible = ref(false) const addDept = () => { dialogFormVisible.value = true //当添加部门数据时候,就清除上一次的记录 form.value = { name: '' } } const form = ref({ name: '', }) const submitDept = async () => { const result = await addApi(form.value) dialogFormVisible.value = false if (result.code == 1) { ElMessage.success('部门添加成功') deptSearch() } else { ElMessage.error(result.msg) } } </script> <template> <h1>部门管理</h1> <el-button type="primary"> <el-icon><Search /></el-icon> 搜索 </el-button> <el-button type="success" @click="addDept"> <el-icon><plus /></el-icon>新增 </el-button> <el-button type="danger"> <el-icon><delete /></el-icon>批量删除 </el-button> <br /><br /> <el-table :data="tableData" border stripe> <el-table-column type="selection" width="45" align="center" /> <el-table-column type="index" label="序号" width="70" align="center" /> <el-table-column prop="name" label="部门名称" min-width="100" /> <el-table-column prop="createTime" label="创建时间" min-width="160" align="center" /> <el-table-column prop="updateTime" label="最后修改" min-width="160" align="center" /> <el-table-column label="操作" align="center" fixed="right"> <template #default=""> <div class="action-buttons"> <el-button size="small" type="primary"> <el-icon><edit /></el-icon>编辑 </el-button> <el-button size="small" type="danger"> <el-icon><delete /></el-icon>删除 </el-button> </div> </template> </el-table-column> </el-table> <!-- 内嵌在对话框中的表单提交数据 --> <el-dialog v-model="dialogFormVisible" title="添加部门" width="500"> <el-form :model="form"> <el-form-item label="部门名称"> <el-input v-model="form.name" autocomplete="off" /> </el-form-item> </el-form> <template #footer> <div class="dialog-footer"> <el-button @click="dialogFormVisible = false">取消</el-button> <el-button type="primary" @click="submitDept"> 添加 </el-button> </div> </template> </el-dialog> </template> <style scoped></style> 我的项目是vue3+element-plus构建的,帮我完善剩下的功能,美化样式
最新发布
07-19
帮我给每一行加一下注释:<div class="content-box__gap el-flex-grow el-overflow-hidden"> <div class="fill-height el-flex el-flex-column el-padding16 el-whiteBg"> <div class="el-flex-grow"> <el-table :data="dataList" height="100%"> <el-table-column label="序号" type="index" align="center" :index="indexMethod" width="100" /> <el-table-column label="多测业务类型编码" align="center" prop="declarationKeyTypeCode" :show-overflow-tooltip="true"> <template slot-scope="scope"> <span>{{ format(scope.row.declarationKeyTypeCode) }}</span> </template> </el-table-column> <el-table-column label="多测业务类型" align="center" prop="declarationKeyTypeCode" :show-overflow-tooltip="true" /> <el-table-column label="多测材料类型id" align="center" prop="surveyKeyTypeCode" :show-overflow-tooltip="true"> <template slot-scope="scope"> <span>{{ format(scope.row.surveyKeyTypeCode) }}</span> </template> </el-table-column> <el-table-column label="多测材料目录" align="center" prop="surveyKeyTypeCode" :show-overflow-tooltip="true" /> <el-table-column label="创建时间" align="center" prop="createTime" width="180"> <template slot-scope="scope"> <span>{{ $xxDateFormat.date(scope.row.createTime) }}</span> </template> </el-table-column> <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180"> <template slot-scope="scope"> <el-button v-hasPermi="['system:dict:edit']" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" >编辑</el-button > <el-button v-hasPermi="['system:dict:remove']" class="btn-delete" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" >删除</el-button >
03-13
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值