vue2 + element-ui中的el-form和el-table嵌套,实现表格表单内容编辑 + 表格表单数据校验 + 动态增减表单项

1 篇文章 0 订阅
1 篇文章 0 订阅

vue2 + element-ui中的el-form和el-table嵌套,实现表格表单内容编辑 + 表格表单数据校验 + 动态增减表单项

结合element-ui框架,Form表单示例动态增减表单项,又结合网上资料查询,实现。

效果图:

在这里插入图片描述

实现

1.el-form封装的表单校验功能
2.el-form动态增减表单项时,除了增加删除 form 的字段,校验规则 rules 也需要一起增加删除
3.el-table-column prop属性,render-header 方法,slot插槽

代码:

<el-form
          ref="dataForm"
          :model="form"
          :rules="rulesForm"
          label-position="right"
          label-width="110px"
          class="chargeRulesForm"
      >
	<el-form-item label="规则配置">
       <el-table :data="form.pilePriceRuleItemVOS">
         <!--    时段类型            -->
         <el-table-column prop="name" label="时段类型" :render-header="addRedStar">
           <template v-slot:default="scope">
             <el-form-item :prop="'pilePriceRuleItemVOS.' + scope.$index + '.name'">
               <el-input
                   v-model="scope.row.name"
                   clearable
                   placeholder="请输入"
                   :rules="rulesForm.pilePriceRuleItemVOS.name"
               />
             </el-form-item>
           </template>
         </el-table-column>
         <!--      开始时间          -->
         <el-table-column prop="startTime" label="开始时间" :render-header="addRedStar">
           <template v-slot:default="scope">
             <el-form-item :prop="'pilePriceRuleItemVOS.' + scope.$index + '.startTime'">
               <el-time-picker
                   v-model="scope.row.startTime"
                   placeholder="开始时间"
                   :rules="rulesForm.pilePriceRuleItemVOS.startTime"
               >
               </el-time-picker>
             </el-form-item>
           </template>
         </el-table-column>
         <!--      截止时间          -->
         <el-table-column prop="endTime" label="截止时间" :render-header="addRedStar">
           <template v-slot:default="scope">
             <el-form-item :prop="'pilePriceRuleItemVOS.' + scope.$index + '.endTime'">
               <el-time-picker
                   v-model="scope.row.endTime"
                   placeholder="截止时间"
                   :rules="rulesForm.pilePriceRuleItemVOS.endTime"
               >
               </el-time-picker>
             </el-form-item>
           </template>
         </el-table-column>
         <!--      电费(元/度)          -->
         <el-table-column prop="price" label="电费(元/度)" :render-header="addRedStar">
           <template v-slot:default="scope">
             <el-form-item :prop="'pilePriceRuleItemVOS.' + scope.$index + '.price'">
               <el-input
                   v-model="scope.row.price"
                   clearable
                   placeholder="请输入"
                   :rules="rulesForm.pilePriceRuleItemVOS.price"
               />
             </el-form-item>
           </template>
         </el-table-column>
         <!--      操作: 删除          -->
         <el-table-column label="操作" align="right">
           <template v-slot:default="scope">
             <el-button v-if="scope.$index > 0" type="danger" @click="deleteTableRowHandle(scope.row)">删除
             </el-button>
           </template>
         </el-table-column>
       </el-table>
       <br/>
       <div class="flex-end">
         <el-button
             type="primary"
             icon="el-icon-plus"
             @click="addTableRowHandle()"
         >添加新时段
         </el-button>
       </div>
     </el-form-item>
     <el-form-item>
       <el-button @click="returnpage">
         取消
       </el-button>
       <el-button
           type="primary"
           @click="onSubmitData"
       >
         确定
       </el-button>
     </el-form-item>
</el-form>

export default {
  data() {
    return {
      form: {
        pilePriceRuleItemVOS: [{
          name: "",
          startTime: "",
          endTime: "",
          price: ""
        }]
      }, //表单
      rulesForm: {
        ruleName: [{required: true, message: "请输入规则名称", trigger: "blur"}],
        serviceFees: [{required: true, message: "请输入服务费", trigger: "blur"}],
        pilePriceRuleItemVOS: [{
          name: [{required: true, message: "请输入时段类型", trigger: "blur"}],
          startTime: [{required: true, message: "请输入开始时间", trigger: "blur"}],
          endTime: [{required: true, message: "请输入截止时间", trigger: "blur"}],
          price: [{required: true, message: "请输入电费", trigger: "blur"}]
        }]
      }, // 表单校验规则
    };
  },
  methods: {
    //添加
    addTableRowHandle() {
      this.form.pilePriceRuleItemVOS.push({
        name: "",
        startTime: "",
        endTime: "",
        price: ""
      });
      this.rulesForm.pilePriceRuleItemVOS.push({
        name: [{required: true, message: "请输入时段类型", trigger: "blur"}],
        startTime: [{required: true, message: "请输入开始时间", trigger: "blur"}],
        endTime: [{required: true, message: "请输入截止时间", trigger: "blur"}],
        price: [{required: true, message: "请输入电费", trigger: "blur"}]
      });
	    },
	    //删除
	    deleteTableRowHandle(item) {
	      this.form.pilePriceRuleItemVOS.splice(this.form.pilePriceRuleItemVOS.indexOf(item), 1);
	      this.rulesForm.pilePriceRuleItemVOS.splice(this.rulesForm.pilePriceRuleItemVOS.indexOf(item), 1);
	    },
	    //取消
	    returnpage() {
	      //
	    },
	    // 表头生成必填校验红星样式
	    addRedStar(h, {column}) {
	      return [
	        h('span', {style: 'color: red'}, '*'),
	        h('span', ' ' + column.label)
	      ]
	    },
	    //提交
	    onSubmitData() {
	      this.$refs.dataForm.validate(valid => {
	        if (valid) {
	          console.log(1111, this.form)
	        } else {
	          return false;
	        }
	      });
	    },
	},
	
};

参考文档

1.element-ui组件库
2.https://blog.csdn.net/weixin_48612307/article/details/132445304 点击跳转

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现虚拟表格,可以在 `el-table` 组件添加 `:row-height` 属性,来指定每行的高度,然后再添加 `:height` 属性,来指定表格的高度。接着,可以在 `el-table` 添加 `slot-scope` 属性,来自定义表格的每行内容。最后,在 `el-table` 添加 `:highlight-current-row` 属性,来高亮展示当前行。 以下是一个示例代码: ```html <template> <el-table :data="tableData" :row-height="rowHeight" :height="tableHeight" :highlight-current-row="false"> <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> <template slot-scope="{ row }"> <div class="table-row" :style="{ height: rowHeight + 'px' }"> <span>{{ row.name }}</span> <span>{{ row.age }}</span> <span>{{ row.address }}</span> </div> </template> </el-table> </template> <script> export default { data() { return { tableData: [ { name: '张三', age: 20, address: '北京市' }, { name: '李四', age: 25, address: '上海市' }, { name: '王五', age: 30, address: '广州市' }, { name: '赵六', age: 35, address: '深圳市' } ], rowHeight: 50, tableHeight: 200 } } } </script> <style> .table-row { display: flex; justify-content: space-between; align-items: center; padding: 0 20px; box-sizing: border-box; border-bottom: 1px solid #f0f0f0; } </style> ``` 在上述代码,我们指定了每行高度为 `50px`,表格高度为 `200px`,并且自定义了每行内容的展示方式。同时,我们也添加了一些样式来美化表格

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值