vue3实现表格单元格可编辑

以往编辑表格内容都是点击编辑按钮,进入编辑页面或弹窗对整行做编辑的效果。

而这次由于项目需要实现在表格内双击就能编辑对应单元格的功能,对于没有做过的我来说也是一个新挑战 。

需要达到的效果:

方案一

由于项目使用的是element-ui,所以一开始想到的就是去 table 组件找有没有能满足此需求的属性。没想到还真有(cell-dblclick)。

下面看实现效果(部分代码):

<template>
  <divclass="Table main">
    <el-table
      :data="tableData"
      @cell-dblclick="tableEdit"
    >
      <el-table-columnprop="name"label="姓名"width="150"></el-table-column>
      <el-table-columnprop="amount1"label="数值1"show-overflow-tooltip>
        <template#default="props">
          <span>{{props.row.amount1}}</span>
        </template>
      </el-table-column>
    </el-table>
  </div>
</template>
​
<script>
      tableData: [
          {
          name: '王小虎',
          amount1: '234',
          amount2: '3.2',
          amount3: 10,
        }
      ],
    // 双击表格修改数据
    tableEdit(row, column, cell, event) {
      if (column.label==='数值1'||column.label==='数值2'||column.label==='数值3') {
        constbeforeVal=event.target.textContent;
        event.target.innerHTML='';
        conststr=`<div class='cell'>
            <div class='el-input'>
              <input type='text' placeholder='请输入内容'>
            </div>
        </div>`;
        cell.innerHTML=str;
        //  获取双击后生成的input  而且根据层级嵌套还会有所变化
        constcellInput=cell.children[0].children[0].children[0];
        cellInput.value=beforeVal;
        cellInput.focus(); // input自动聚焦
        // 失去焦点后  将input移除
        cellInput.onblur=function () {
          constonblurCont=`<div class='cell'>${cellInput.value}</div>`;
          cell.innerHTML=onblurCont; // 换成原有的显示内容
        };
      }
    },
</script>

这样,就可以了!可是真的可以了吗?

仔细看一下,觉得这种写法局限性还是太多,不够灵活,放弃使用。

方案二

思路:不使用el-table的 cell-dblclick 属性,设置一个变量,监听双击事件,去控制单元格展示的内容。

(部分代码):

<el-table :data="tableData.data">
      <el-table-columnv-for="prop in tabHeader"
      :label="struct.fieldName"
      :prop="prop"
      align="center"
      >
        <template#default="scope">
          <divv-if="isEdit && scope.row.index === rowInd &&                            scope.column.index === colInd">
            <el-tooltip
                :content="desc">
              <el-inputv-if="struct.inputType === 'Input'&&
                struct.type==='Number'"
                v-model.number="scope.row[prop]"
                @blur="isEdit = false"
                @change="inputChange"
                ></el-input>
              <el-inputv-if="struct.inputType === 'Input'&&
              struct.type==='String'"
              v-model="scope.row[prop]"
              @blur="isEdit = false"
              @change="inputChange"
              ></el-input>
            </el-tooltip>
            <el-select
              v-if="struct.inputType === 'Select'"
              v-model="scope.row[prop]"
              @change="isEdit = false; inputChange()"
              >
              <el-optionv-for="opt in options"
                :label="opt" :value="opt" :key="opt"
              ></el-option>
            </el-select>
          </div>
          <divv-else@dblclick="dbCell(scope)"class="xiaoShou">
            {{scope.row[prop]}}
          </div>
        </template>
      </el-table-column>
    </el-table>
// 双击 出现输入框
constdbCell= (a: any) => {
    isEdit.value=true;
    rowInd.value=a.row.index;
    colInd.value=a.column.index;
};

这种实现方法更简单、拓展性更高,而且符合编写习惯。

需要注意的地方是区分点击的是哪个单元格, 且下拉框不能使用blur。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3 是一种流行的JavaScript框架,用于构建用户界面。要实现一个可编辑表格,你可以按照以下步骤进行: 1. 创建一个Vue组件,用于表示整个表格。可以使用`<table>`元素来定义表格的结构。 2. 在组件的`data`选项中定义一个数组,用于存储表格的数据。每个数组元素表示表格的一行数据。 3. 使用`v-for`指令在表格中循环渲染每一行数据,并显示每个单元格的值。 4. 为每个单元格添加一个点击事件,当用户点击单元格时,将其转换为可编辑状态。 5. 在可编辑状态下,将单元格替换为一个输入框或其他合适的编辑元素,并将其与数据绑定。 6. 监听输入框的变化,并更新数据数组中对应的值。 7. 提供保存或取消编辑的功能,当用户完成编辑时,将编辑状态切换回普通状态,并保存或取消对数据的修改。 下面是一个简单的示例代码: ```html <template> <table> <tr v-for="(row, index) in tableData" :key="index"> <td v-for="(cell, cellIndex) in row" :key="cellIndex"> <span v-if="!cell.editable" @click="editCell(index, cellIndex)">{{ cell.value }}</span> <input v-else type="text" v-model="cell.value" @blur="saveCell(index, cellIndex)" @keydown.enter="saveCell(index, cellIndex)" @keydown.esc="cancelEdit(index, cellIndex)"> </td> </tr> </table> </template> <script> export default { data() { return { tableData: [ { value: 'Cell 1', editable: false }, { value: 'Cell 2', editable: false }, { value: 'Cell 3', editable: false } ] }; }, methods: { editCell(rowIndex, cellIndex) { this.tableData[rowIndex].editable = true; }, saveCell(rowIndex, cellIndex) { this.tableData[rowIndex].editable = false; }, cancelEdit(rowIndex, cellIndex) { this.tableData[rowIndex].editable = false; } } }; </script> ``` 这个示例中,我们使用了一个`tableData`数组来存储表格的数据,每个元素包含一个`value`属性表示单元格的值,以及一个`editable`属性表示单元格是否可编辑。当用户点击单元格时,会调用`editCell`方法将单元格切换为可编辑状态,当用户完成编辑时,会调用`saveCell`方法保存修改,或调用`cancelEdit`方法取消编辑
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值