eladmin,复杂表单(对象数组)验证问题

最近在做的页面中有个需求,在这里插入图片描述
添加规格这种模块化的表单内容
单独封装组件又复杂化了
然后昨天看到了一个表单数组循环出来固定的几条内容
受其启发,想到用v-for处理
代码如下(本身为了界面美观,进行了一个v-for分成两列,这里主要讲解思路,大概简化了,不保证放出代码可直接运行本身也放的不全
v-for分列思路

子表单(用el-card包裹,可以按需去掉,主要是思路)

<el-card
	v-for="(item, index) in form.ruleList"
    shadow="never"
    :body-style="{ padding: '10px 15px' }"
>
    <div slot="header" class="clearfix">
        <span>规格{{ index+1 }}</span>
        <el-button
            style="float: right"
            type="text"
            :disabled="form.ruleList.length<2"
            @click="removeRules(index)"
        >移除规格</el-button>
    </div>
    <el-form
        ref="ruleList"
        :model="item"
        :rules="goodRulesvalid"
        label-width="80px"
    >
        <el-form-item
            label="规格名称"
            prop="ruleName"
        >
            <el-input v-model="item.ruleName" />
        </el-form-item>
        <el-form-item label="总库存" prop="goodsAllNumber">
            <el-input-number
                v-model="item.goodsAllNumber"
                controls-position="right"
                :min="0"
            />
        </el-form-item>
        <el-form-item label="剩余库存" prop="goodsNumber">
            <el-input-number
                v-model="item.goodsNumber"
                controls-position="right"
                :min="0"
            />
        </el-form-item>
        <el-form-item label="原价" prop="goodsOriginal">
            <el-input-number
                v-model="item.goodsOriginal"
                controls-position="right"
                :min="0"
            />
        </el-form-item>
        <el-form-item label="现价" prop="goodsNumber">
            <el-input-number
                v-model="item.goodsPrice"
                controls-position="right"
                :min="0"
            />
        </el-form-item>
    </el-form>
</el-card>

父表单存在添加按钮,直接在数组中添加空对象
卡片组件(子表单)中移除按钮,数组方法splice剪切当前下标,且不影响数组顺序

        // 添加商品规则
        addRules() {
            this.form.ruleList.push({
                ruleName: null,
                goodsAllNumber: null,
                goodsNumber: null,
                goodsOriginal: null,
                goodsPrice: null,
                ruleId: null
            });
        },
        // 移除商品规则
        removeRules(index) {
            this.form.ruleList.splice(index, 1);
        },

子表单,v-for循环后,ref(这里的ruleList只是起名占位)会是一个数组

在这里插入图片描述
在这里插入图片描述

验证规则rules绑定的是另写的对数组里对象的验证
model为下图ruleList的每一项,因为v-for,直接绑定item了
在这里插入图片描述

然后在验证前[CRUD.HOOK.beforeValidateCU]的钩子中再进行验证,即保证了父级表单和子级表单是同步验证的

        [CRUD.HOOK.beforeValidateCU](crud, form) {
            console.log(this.$refs);
            for (var i = 0; i < this.$refs.ruleList.length; i++) {
                console.log(this.$refs.ruleList[i]);
                this.$refs.ruleList[i].validate(valid => {
                    if (!valid) {
                        return false;
                    }
                });
            }
        },
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Vue中,可以使用Vue的验证规则来验证数组。下面是一个示例代码,演示如何使用Vue的验证规则来验证数组: 首先,在Vue组件中定义一个包含数组数据对象,并为每个数组元素定义验证规则。例如,我们有一个名为"items"的数组,每个元素都应该是字符串,并且不能为空。 ```html <template> <form @submit="submitForm"> <div v-for="(item, index) in items" :key="index"> <input v-model="items[index]" :class="{ 'is-invalid': !isItemValid(index) }"> <div v-if="!isItemValid(index)" class="invalid-feedback">Item is required.</div> </div> <button type="submit">Submit</button> </form> </template> <script> export default { data() { return { items: ['', '', ''], // 初始值为空字符串的数组 }; }, methods: { submitForm() { // 在提交时,检查每个数组元素是否满足验证规则 if (this.items.every(item => item !== '')) { // 执行提交的操作 console.log('Form submitted successfully!'); } else { console.log('Form validation failed!'); } }, isItemValid(index) { // 验证特定索引的数组元素是否满足验证规则 return this.items[index] !== ''; }, }, }; </script> ``` 在上面的代码中,我们使用`v-for`指令遍历数组,并使用`v-model`指令将输入框与数组元素进行绑定。使用`:class`绑定了一个条件类,当数组元素不满足验证规则时添加`is-invalid`类,以便显示样式上的错误提示。同时,我们在每个输入框后面显示了一个错误提示信息,只有当数组元素不满足验证规则时才会显示。 在`submitForm`方法中,我们使用`every`方法检查所有数组元素是否都不为空字符串,如果是,则验证通过,可以执行提交的操作。 上述代码只是一个简的示例,你可以根据具体的需求和验证规则进行更复杂验证
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值