element可编辑表格验证失效问题

elemnet官网实例

动态增减表单项

<el-form :model="dynamicValidateForm" ref="dynamicValidateForm" label-width="100px" class="demo-dynamic">
  <el-form-item
    v-for="(domain, index) in dynamicValidateForm.domains"
    :label="'域名' + index"
    :key="domain.key"
    :prop="'domains.' + index + '.value'"
    :rules="{
      required: true, message: '域名不能为空', trigger: 'blur'
    }"
  >
    <el-input v-model="domain.value"></el-input><el-button @click.prevent="removeDomain(domain)">删除</el-button>
  </el-form-item>
  <el-form-item>
    <el-button @click="addDomain">新增域名</el-button>
  </el-form-item>
</el-form>
<script>
  export default {
    data() {
      return {
        dynamicValidateForm: {
          domains: [{
            value: ''
          }]
        }
      };
    },
    methods: {
      removeDomain(item) {
        var index = this.dynamicValidateForm.domains.indexOf(item)
        if (index !== -1) {
          this.dynamicValidateForm.domains.splice(index, 1)
        }
      },
      addDomain() {
        this.dynamicValidateForm.domains.push({
          value: '',
          key: Date.now()
        });
      }
    }
  }
</script>

绑定方式为利用index动态进行绑定:prop="‘domains.’ + index + ‘.value’"

同理,可以利用index对表格内表单进行沿验证绑定


<el-form :model="ruleForm" ref="ruleForm">
            <el-button class='newlyAdded' size="small"  @click="planAdd" v-if="mode!=='see'" type="primary" style="margin-bottom:10px;">新增节点</el-button>
            <el-table class="tableSpecialForm"  :data="ruleForm.buildPlan" border style="width: 100%;margin:20px 0;">
                <el-table-column label="计划节点">
                    <template slot-scope="scope">
                        <el-form-item :key="scope.row.key" :prop="'buildPlan.'+ scope.$index + '.planNode'" :rules="planRules.planNode">
                            <el-input :disabled="mode==='see'||scope.$index=='0'||scope.$index=='1'||scope.$index=='2'"  v-model="scope.row.planNode" placeholder="请输入" class="nm-input">
                        </el-form-item>
                    </template>
                </el-table-column>
                <el-table-column label="计划完成时间" width="250">
                    <template slot-scope="scope">
                        <el-form-item :key="scope.row.key" :prop="'buildPlan.'+ scope.$index + '.planComptime'"  :rules="planRules.planComptime">
                            <el-date-picker v-model="scope.row.planComptime" value-format="yyyy-MM-dd" format="yyyy 年 MM 月 dd 日" type="date" placeholder="选择时间"  :disabled="mode==='see'" class="nm-input">
                            </el-date-picker>
                        </el-form-item>
                    </template>
                </el-table-column>
                <el-table-column label="计划支付比例(100%)">
                    <template slot-scope="scope">
                        <el-form-item :key="scope.row.key" :prop="'buildPlan.'+ scope.$index + '.planPayment'"  :rules="planRules.planPayment">
                            <el-input :disabled="mode==='see'" v-model="scope.row.planPayment" placeholder="请输入">
                        </el-form-item>
                    </template>
                </el-table-column>
                <el-table-column label="备注">
                    <template slot-scope="scope">
                        <el-form-item :key="scope.row.key" :prop="'buildPlan.'+ scope.$index + '.planRemarks'"  :rules="planRules.planRemarks ">
                            <el-input :disabled="mode==='see'" :rows="2" type="textarea" v-model="scope.row.planRemarks" placeholder="请输入">
                        </el-form-item>
                    </template>
                </el-table-column>
                <el-table-column label="" align="center" width="70" v-if="mode!=='see'">
                    <template slot-scope="scope">
                        <el-button v-if="scope.$index!='0'&&scope.$index!='1'&&scope.$index!='2'" type="info" icon="el-icon-minus" size="mini"  @click="removeTableList(scope.$index)"></el-button>
                    </template>
                </el-table-column>
            </el-table>
        </el-form>

利用:prop="‘buildPlan.’+ scope.$index + ‘.planComptime’"进行绑定

或者:prop="‘buildPlan[’+scope.$index+’].planComptime’"

也可以用es6语法中的` ,可以在字符串中进行数据的换算,并能通过${ }来获取参数 ,类似

`resource.${scope.$index}.provideOrg`

重点:绑定后对表格进行操作,发现会出现,删除第二行,第三行表格行会直接继承第二行验证结果,且不能改变验证结果
原因是没有加key
这与vue的机制有很大关系,当然包括react也都是这么处理的,key是一个非常重要的属性
key 的特殊属性主要用在 Vue 的虚拟 DOM 算法,在新旧 nodes 对比时辨识 VNodes。如果不使用 key,Vue 会使用一种最大限度减少动态元素并且尽可能的尝试修复/再利用相同类型元素的算法。使用 key,它会基于 key 的变化重新排列元素顺序,并且会移除 key 不存在的元素。
在之后的添加表格中key为Date.now(),保证key值不重复

  this.projectform.budgetEstimate5.push( {costName:'',calculateBasis:'',calculateMethod:'',totalPrice:0,remarks:'',key:Date.now()})

然后在table中每个表单项中绑定key,:key=“scope.row.key”

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Element UI是一个流行的开源UI组件库,由饿了么开发,专为Vue.js应用提供丰富的前端界面解决方案。Element UI中的"可编辑表格"(Editable Table)是一个功能强大的组件,它允许用户在页面上直接修改表格中的数据,支持单元格级别的操作,比如文本输入、选择、删除等。 具体特点包括: 1. **实时更新**:对表格中的每一项数据进行编辑后,改动会被即时反映到数据模型中,无需额外提交或刷新操作。 2. **列宽自适应**:表格可以根据内容自动调整列宽,使得显示更加直观和舒适。 3. **事件处理**:提供了诸如点击、输入等事件的处理机制,方便开发者定制各种交互行为。 4. **内置验证**:对于输入的数据,可以设置校验规则,确保数据的合理性。 5. **API友好**:表格提供了丰富的API接口,用于获取数据、添加行、删除行等操作。 要使用Element UI的可编辑表格,首先需要安装Element UI库,然后在模板中引用相应的组件,并配置列定义、数据源以及是否开启编辑模式。例如: ```html <template> <el-table :data="tableData" :editable="isEditable"> <!-- 列定义 --> <el-table-column prop="name" label="姓名" width="180" /> <el-table-column prop="age" label="年龄" width="180" /> <!-- 更多列... --> </el-table> </template> <script> import { ElTable, ElTableColumn } from "element-plus"; export default { components: { ElTable, ElTableColumn, }, data() { return { tableData: [ // 数据列表... ], isEditable: true, // 是否启用编辑模式,默认为false }; }, }; </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值