el-table中el-select与span 通过点击按钮进行编辑与显示切换;js给数据中的对象添加属性

本文展示了如何在Vue.js应用中实现表格的动态操作,包括新增行、编辑模式切换(使用el-select组件)以及删除功能。表格项非空验证和编辑状态管理是关键,同时确保数据在保存前不丢失。

效果实现:

 

1.点击新增一行 表格插入空白行
2.当表格项有数据时显示模式 操作显示修改和删除
3.点击修改切换成编辑模式(此处是el-select)

代码部分

<div class="addBtn">
        <el-button type="primary" size="mini" @click="add()">新增一行</el-button>
</div>
<el-form :model="form" ref="form" >
        <el-row>
          <el-col :span="24">
            <el-table class="table-cursor" :data="form.tableData" border>
              <el-table-column prop="indicatorName" label="指标名称" align="center">
                <template slot-scope="scope">
                  <el-form-item :prop="'tableData.' + scope.$index + '.indicatorName'" :rules="{
                      required: true,
                      message: '值不能为空',
                      trigger: 'change',
                    }">
                    <span v-if="scope.row.isEdit">
                      <el-select clearable v-model="scope.row.indicatorName" @change="scope.row.isEdit = true" filterable
                        class="dis-time">
                        <el-option v-for="item in indicatorNameTypeList" :key="item.enumValue" :label="item.enumName"
                          :value="item.enumValue + ''"></el-option>
                      </el-select>
                    </span>
                    <span v-else>{{ scope.row.indicatorName }}</span>
                  </el-form-item>
                </template>
              </el-table-column>
              <el-table-column label="操作" align="center">
                <template slot-scope="scope">
                  <el-tooltip effect="dark" v-show="scope.row.indicatorName && !scope.row.isEdit" content="编辑"
                    placement="bottom">
                    <el-button type="text" @click="valChange(scope.row, scope.$index, true)">修改</el-button>
                  </el-tooltip>
                  <el-tooltip effect="dark" v-show="scope.row.indicatorName && !scope.row.isEdit" content="删除"
                    placement="bottom">
                    <el-button type="text" @click="reduce(scope.$index)">删除</el-button>
                  </el-tooltip>
                  <el-tooltip effect="dark" v-show="scope.row.indicatorName && scope.row.isEdit" content="保存"
                    placement="bottom">
                    <el-button type="text" @click="valChange(scope.row, scope.$index, true)">保存</el-button>
                  </el-tooltip>
                </template>
              </el-table-column>
            </el-table>
          </el-col>
        </el-row>
</el-form>

data中定义的: 

 form: {
        sel: null,
        tableData: [{
          indicatorName: "年累计流量",
          indicatorCode: '3',
        }]
}

动态给表格数据中添加isEdit属性,用来区别编辑和展示模式切换也是关键所在!(js给数据中的对象添加属性)

 mounted() {
    this.form.tableData.map(i => {
      i.isEdit = false
    })
}

methods中定义的

//增加
    add() {
      for (let i of this.form.tableData) {
        if (i.isEdit) {
          return this.$message({
            type: "warning",
            message: "请先对上一条数据进行保存后再操作"
          });
        }
      }
      let row = {
        indicatorName: "",
        indicatorCode: '',
        isEdit: true
      }
      this.form.tableData.push(row)
      this.form.sel = row
    },
    //删除
    reduce(index) {
      this.form.tableData.splice(index, 1)
      //删除接口
    },
    //保存、编辑
    valChange(row, index, qx) {
      //点击修改,判断是否已经保存所有操作
      for (let i of this.form.tableData) {
        if (i.isEdit && i.indicatorCode != row.indicatorCode) {
          this.$message({
            type: "warning",
            message: "请先对上一条数据进行保存后再操作"
          });
          return false
        }
      }
      //提交数据
      if (row.isEdit) {
        const v = this.form.sel
        // 必填项判断
        if (v.indicatorName == '') {
          this.$message({
            type: "warning",
            message: "请选择指标项"
          });
        } else {
          row.isEdit = false
          //调用保存接口
        }
      } else {
        this.form.sel = row
        row.isEdit = true
      }
    },

### 在 el-table-v2 中集成 el-select 组件的实现方法 在 `el-table-v2` 中使用 `el-select` 组件,可以通过定义表格列时结合插槽来实现。以下是个完整的示例代码和详细说明。 #### 示例代码 ```vue <template> <div> <el-table-v2 class="class-detail-table" :columns="tableColumns" :data="tableData" :height="400" :width="800" > <!-- 自定义单元格插槽 --> <template #cell="{ column, row }"> <el-select v-if="column.key === 'status'" v-model="row[column.key]" placeholder="请选择状态" > <el-option v-for="option in statusOptions" :key="option.value" :label="option.label" :value="option.value" /> </el-select> <span v-else>{{ row[column.key] }}</span> </template> </el-table-v2> </div> </template> <script> export default { data() { return { // 表格列定义 tableColumns: [ { key: 'name', title: '姓名', width: 150 }, { key: 'age', title: '年龄', width: 100 }, { key: 'status', title: '状态', width: 150 } ], // 表格数据 tableData: [ { id: 1, name: '张三', age: 28, status: 'active' }, { id: 2, name: '李四', age: 30, status: 'inactive' }, { id: 3, name: '王五', age: 25, status: 'pending' } ], // 下拉选项 statusOptions: [ { value: 'active', label: '活跃' }, { value: 'inactive', label: '不活跃' }, { value: 'pending', label: '待定' } ] }; } }; </script> <style scoped> .class-detail-table { border: 1px solid #ebebeb; border-radius: 3px; transition: all 0.3s; } </style> ``` #### 代码说明 1. **表格列定义**: - `tableColumns` 定义了表格的列结构,每列包含 `key`(对应数据字段)、`title`(表头显示文本)和 `width`(列宽)[^1]。 2. **表格数据**: - `tableData` 是表格的数据源,每行是对象对象的键 `tableColumns` 的 `key` 对应。 3. **下拉选项**: - `statusOptions` 定义了 `el-select` 的选项列表,每个选项包含 `value` 和 `label` 属性。 4. **自定义单元格插槽**: - 使用 `#cell` 插槽来自定义单元格内容。通过判断 `column.key` 是否为 `'status'`,决定是否渲染 `el-select` 组件。 - 如果是 `'status'` 列,则渲染 `el-select`,并绑定当前行的数据字段 `row[column.key]`[^2]。 5. **动态绑定**: - `v-model` 实现了 `el-select` 的双向绑定,选中的值会直接更新到 `tableData` 中对应的行字段。 --- ### 注意事项 1. **性能优化**: - `el-table-v2` 是基于虚拟滚动的表格组件,适用于大量数据场景。确保在使用 `el-select` 等复杂组件时,避免过多的 DOM 操作以保持性能[^4]。 2. **样式调整**: - 如果 `el-select` 在单元格中显示异常,可以通过 `scoped` 样式或全局样式进行调整。 3. **事件监听**: - 可以通过监听 `el-select` 的 `change` 事件来执行额外逻辑,例如触发接口调用或更新其他数据--- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值