el-table表格内部实现可编辑操作,并添加校验

业务需求:项目需要设置一个打卡管理,配置打卡时间(可能是多个,不确定,因此不打算直接用form-item,直接使用table,设置一个模板后,根据需求进行添加或删除)。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如上图,开启打卡后,需要对前面几项进行填写,关闭则禁用,提交后,需要对开启打卡的数据进行校验。 代码如下:

<el-form :model="form" ref="form" :rules="rules" label-width="120px">
      <el-row>
        <el-col :span="6">
          <el-form-item label="姓名" prop="name">
            <el-input v-model="form.name" placeholder="请输入姓名"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item label="性别" prop="sex">
            <el-select v-model="form.sex" placeholder="请选择性别">
              <el-option
                v-for="item in sexList"
                :key="item.value"
                :label="item.name"
                :value="item.value"
              ></el-option>
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item label="出生日期" prop="birthdate">
            <el-date-picker
              v-model="form.birthdate"
              type="date"
              placeholder="选择出生日期"
              value-format="yyyy-MM-dd"
              format="yyyy-MM-dd"
            >
            </el-date-picker>
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item label="是否开启打卡">
            <el-switch v-model="form.isOpen"></el-switch>
          </el-form-item>
        </el-col>
      </el-row>
      <el-table :data="form.template" style="width: 100%" v-if="form.isOpen">
        <el-table-column
          prop="title"
          align="center"
          width="80px"
          :show-overflow-tooltip="true"
        >
        </el-table-column>
        <el-table-column
          label="打卡时间"
          prop="time"
          align="center"
          width="400px"
          :show-overflow-tooltip="true"
        >
          <template slot-scope="scope">
            <el-form-item
              :prop="
                !scope.row.isUse ? '' : 'template.' + scope.$index + '.time'
              "
              label-width="0"
              :rules="!scope.row.isUse ? {} : rules.time"
            >
              <el-time-picker
                is-range
                v-model="scope.row.time"
                :disabled="!scope.row.isUse"
                range-separator=""
                start-placeholder="开始时间"
                end-placeholder="结束时间"
                placeholder="选择时间范围"
                value-format="HH:mm:ss"
                format="HH:mm:ss"
              >
              </el-time-picker>
            </el-form-item>
          </template>
        </el-table-column>
        <el-table-column
          label="最早打卡时间"
          prop="start"
          align="center"
          :show-overflow-tooltip="true"
        >
          <template slot-scope="scope">
          	<!-- 通过当前的scope.row.isUse(开关)控制校验的规则和校验的字段 -->
            <el-form-item
              :prop="
                !scope.row.isUse ? '' : 'template.' + scope.$index + '.start'
              "
              label-width="0"
              :rules="!scope.row.isUse ? {} : rules.start"
            >
              <el-time-picker
                v-model="scope.row.start"
                :disabled="!scope.row.isUse"
                placeholder="选择时间范围"
                value-format="HH:mm:ss"
                format="HH:mm:ss"
              >
              </el-time-picker>
            </el-form-item>
          </template>
        </el-table-column>
        <el-table-column
          label="最晚打卡时间"
          prop="last"
          align="center"
          :show-overflow-tooltip="true"
        >
          <template slot-scope="scope">
            <el-form-item
              :prop="
                !scope.row.isUse ? '' : 'template.' + scope.$index + '.last'
              "
              label-width="0"
              :rules="!scope.row.isUse ? {} : rules.last"
            >
              <el-time-picker
                v-model="scope.row.last"
                :disabled="!scope.row.isUse"
                placeholder="选择时间范围"
                value-format="HH:mm:ss"
                format="HH:mm:ss"
              >
              </el-time-picker>
            </el-form-item>
          </template>
        </el-table-column>
        <el-table-column
          label="是否开启打卡"
          prop="isUse"
          align="center"
          :show-overflow-tooltip="true"
        >
          <template slot-scope="scope">
            <el-form-item prop="isUse" label-width="0">
              <el-switch v-model="scope.row.isUse"> </el-switch>
            </el-form-item>
          </template>
        </el-table-column>
      </el-table>
    </el-form>
    <div style="display:flex;justify-content:center;margin-top:20px;">
      <el-button @click="submitForm('form')">提交</el-button>
    </div>

JS代码:

<script>
export default {
  data() {
    return {
      form: {
        name: "123",
        sex: "1",
        birthdate: "1",
        isOpen: false,
        template: [],
      },
      sexList: [
        { name: "男", value: "1" },
        { name: "女", value: "2" },
        { name: "未知", value: "-1" },
      ],
      // 模板数据
      defaultTable: [
        { title: "开始时间", time: "", start: "", last: "", isUse: true },
        { title: "截止时间", time: "", start: "", last: "", isUse: true },
      ],
      // 表格数据的校验
      rules: {
        name: {
          required: true,
          message: "请输入名字",
          tirgger: ["blur", "change"],
        },
        sex: {
          required: true,
          message: "请选择性别",
          tirgger: ["blur", "change"],
        },
        birthdate: {
          required: true,
          message: "请选择出生日期",
          tirgger: ["blur", "change"],
        },
        time: {
          required: true,
          type: "array",
          message: "打卡时间不能为空",
          tirgger: ["blur", "change"],
        },
        start: {
          required: true,
          type: "string",
          message: "最早打卡时间不能为空",
          tirgger: ["blur", "change"],
        },
        last: {
          required: true,
          message: "最晚打卡时间不能为空",
          tirgger: ["blur", "change"],
        },
      },
    };
  },
  mounted() {
    this.init();
  },
  methods: {
  	// 初始化后,把默认模板添加的form的template中  如果需要配置多个,可以在添加个增加或减少事件,对form的template 进行push和splice事件
    init() {
      this.form.template.push(...this.defaultTable);
    },
    submitForm(form) {
      console.log(this.form);
      this.$refs[form].validate((valid) => {
        if (valid) {
          console.log("校验通过");
        } else {
          console.log("校验失败");
        }
      });
    },
  },
};
</script>

当然,以上只是一种写法,还有一种是给每项新增一个判断,默认是span之类的不可修改标签,点击之后,切换成input或者其他可修改的标签,进行操作。当点击其他位置后,恢复成span之类的不可修改标签。

个人记录。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
对于 el-table 表格编辑校验,你可以使用以下方法之一: 1. 在 el-table-column 中使用 scoped slot 的方式自定义编辑组件,并在编辑组件中添加校验逻辑。例如,你可以在编辑组件的 change 事件中进行校验,并通过设置 el-form-item 的 rules 属性实现校验效果。 ```html <el-table :data="tableData"> <el-table-column label="姓名" prop="name"> <template slot-scope="scope"> <el-form-item :prop="'name' + scope.$index" :rules="[{ required: true, message: '请输入姓名', trigger: 'blur' }]"> <el-input v-model="scope.row.name" @change="handleNameChange(scope.row, scope.$index)"></el-input> </el-form-item> </template> </el-table-column> </el-table> ``` 2. 另一种方法是监听 el-tablerow-change 事件,在事件处理函数中进行校验。你可以在该事件处理函数中获取到当前编辑行的数据,并进行校验逻辑判断。 ```html <el-table :data="tableData" @row-change="handleRowChange"> <el-table-column label="姓名" prop="name"> <template slot-scope="scope"> <el-input v-model="scope.row.name"></el-input> </template> </el-table-column> </el-table> ``` ```javascript methods: { handleRowChange(row) { // 校验逻辑判断 if (!row.name) { this.$message.error('姓名不能为空'); // 可以将错误信息保存在 row 对象的某个属性中,然后在表格中进行展示 row.errorName = '姓名不能为空'; } else { row.errorName = ''; } } } ``` 这些方法可以帮助你在 el-table 表格实现编辑校验的功能。根据你的实际需求,选择适合你的方法进行使用。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值