elementUI的table实现行内编辑的两种方法

一、在行数据中设置一个属性,用来区分当前行或者当前列是否在进行修改,使用v-show实现

  1. 在行内添加button,并直接操作当前数据对象,变更其值用来控制当前行或当前列是否修改,注意看几个button的click事件
  2. 如果在表格外部使用按钮操作,则定义一个method,传递行数据在table原始数据中的index,在method中操作对应index的数据。
<template>
  <div>
    <el-table :data="list">
      <el-table-column align="center" label="编号" width="80">
        <template slot-scope="{ row }">
          <span v-show="!row.editid">{{ row.id }}</span>
          <el-input v-show="row.editid" v-model="row.id"></el-input>
        </template>
      </el-table-column>

      <el-table-column width="180px" label="名称">
        <template slot-scope="{ row }">
          <span v-show="!row.editname">{{ row.name }}</span>
          <el-input v-show="row.editname" v-model="row.name"></el-input>
        </template>
      </el-table-column>

      <el-table-column align="center" label="操作" width="300">
        <template slot-scope="{ row }">
          <el-button
            v-show="!row.editid"
            type="primary"
            size="mini"
            icon="el-icon-edit"
            @click="row.editid = !row.editid"
          >
            编辑id
          </el-button>
          <el-button
            v-show="!row.editname"
            type="primary"
            size="mini"
            icon="el-icon-edit"
            @click="row.editname = !row.editname"
          >
            编辑名称
          </el-button>
          <el-button
            v-show="row.editid || row.editname"
            type="success"
            size="mini"
            icon="el-icon-circle-check-outline"
            @click="(row.editid = false) || (row.editname = false)"
          >
            Ok
          </el-button>
        </template>
      </el-table-column>
    </el-table>
  </div>
</template>

<script>
export default {
  name: "growth",
  data() {
    return {
      list: [
        { id: "1", name: "法外狂徒", editid: false, editname: false },
        { id: "2", name: "张三", editid: false, editname: false },
      ],
    };
  },
};
</script>

<style lang="scss" scoped></style>>

二、使用el-table自带的class来判断是否显示输入框,主要使用css实现

  1. el-table需要添加highlight-current-row="true",这样在点击某一行时,会将其设置为选中状态,并在dom节点上添加current-row类
  2. 如果需要清除或者变更某一行的选中状态,则使用el-table本身的setCurrentRow方法,细节见官方文档
<template>
  <div>
    <el-button @click="ok" type="success">确认</el-button>
    <el-table :data="list" highlight-current-row ref="mytb">
      <el-table-column align="center" label="编号" width="80">
        <template slot-scope="{ row }">
          <span>{{ row.id }}</span>
          <el-input v-model="row.id"></el-input>
        </template>
      </el-table-column>

      <el-table-column width="180px" label="名称">
        <template slot-scope="{ row }">
          <span>{{ row.name }}</span>
          <el-input v-model="row.name"></el-input>
        </template>
      </el-table-column>
    </el-table>
  </div>
</template>

<script>
export default {
  name: "growth",
  data() {
    return {
      list: [
        { id: "1", name: "法外狂徒" },
        { id: "2", name: "张三" },
      ],
    };
  },
  methods: {
    ok() {
      this.$refs.mytb.setCurrentRow();
    },
  },
};
</script>

<style lang="scss" scoped>
.el-table {
  // 默认情况下,即没有选中某一行时,只显示span
  span {
    display: block;
  }
  .el-input {
    display: none;
  }
  // 当点击某一行时,对应的行会添加current-row类,则内部的新的样式会生效
  .current-row {
    span {
      display: none;
    }
    .el-input {
      display: block;
    }
  }
}
</style>

三、两种方法的比较

  1. 方法1比较灵活,可以精准控制到每一个行的每一个列,但是要多写一些v-show和对应的变更方法。
  2. 方法2代码简单,编写好css,基本不需要在html中注意这部分的操作,但是相对的不灵活一些,一次性控制一整行,无法控制到列
  • 7
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
要在 ElementUI 的表格中实现合并单元格的功能,你可以使用 ElementUI 提供的 scoped slot `span-method` 来自定义单元格合并的方式。下面是一个示例代码: ```html <template> <el-table :data="tableData"> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="age" label="年龄"></el-table-column> <el-table-column prop="address" label="地址"></el-table-column> <el-table-column label="合计行" :span-method="handleSpanMethod"> <template slot-scope="{ row, column, rowIndex, columnIndex }"> <div v-if="columnIndex === 0"> 合计 </div> <div v-else> {{ getSum(column.prop) }} </div> </template> </el-table-column> </el-table> </template> <script> export default { data() { return { tableData: [ { name: '张三', age: 18, address: '北京' }, { name: '李四', age: 20, address: '上海' }, { name: '王五', age: 22, address: '广州' }, ], }; }, methods: { handleSpanMethod({ row, column, rowIndex, columnIndex }) { if (columnIndex === 0) { // 合并第一列的所有行 return { rowspan: this.tableData.length, colspan: 1, }; } }, getSum(prop) { let sum = 0; this.tableData.forEach((item) => { sum += item[prop]; }); return sum; }, }, }; </script> ``` 在上面的代码中,我们使用了 `handleSpanMethod` 方法来定义单元格的合并方式。通过判断 `columnIndex` 的值,我们可以确定要合并的单元格范围,这里我们合并了第一列的所有行。`span-method` 方法会返回一个对象,其中 `rowspan` 表示纵向合并的行数,`colspan` 表示横向合并的列数。 另外,我们使用了一个辅助方法 `getSum` 来计算合计值。你可以根据自己的需求修改计算逻辑。 请注意,以上代码只是一个示例,你需要根据自己的数据结构和需求进行相应的修改。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值