校验v-for中的form表单

场景:
整体外层一个form,内层多个form组成。
点击新增会在增加一个from表单,点击删除即删除一个form。

视图层:

<div      
    v-for="(item, index) in actionData"      
    :key="item"      class="form-wrapper"  
>    
    <el-form        
        ref="actionForm"        
        :model="item"        
        label-width="68px"        
        class="item-form"    
    >    
    </el-form>
</div>

数据层

data:

actionData: [{ id: 'no1', name: '前端'}];

methods:

/* add */
const add = () => {  actionData.push({});};
/* del */
const del = (index) => {  actionData.splice(index, 1);};

/* -----校验所有form------ */

const validate = (refs) => {   
    const promises = refs.map((form, index) => form.validate());   
    return Promise.all(promises);
};

/* submit */
async function submit = () => {
    try {
        rule = await validate(this.$refs.actionForm);   
    } catch (e) {     
        rule = e;   
    };   
    if (!rule) {     
        return false;   
    } else {     
        /* todo*/   
   }
};

总结:

1、for 循环体 或者map里是不支持await。

2、避免层层嵌套的回调校验。

如果验证失败自动滚定位到校验失败的位置:

const restpotion = () => {  
    let anchor = document.querySelectorAll('.el-form-item__error')[0]; 
        anchor.scrollIntoView({
            block: 'end',                
            behavior: 'smooth',  
    });
};

参考:https://juejin.cn/post/7049342392515690526

### 关于 Ant Design Vue 中 `a-form` 动态表单校验 在 Ant Design Vue 的 `a-form` 组件中处理动态表单时,确保每个字段唯一标识非常重要。当使用 `v-for` 渲染多个相同类型的表单项时,需特别注意如何设置这些项目的键值以及它们对应的模型属性。 对于对象嵌套结构下的表单校验问题,在较新版本的 ant-design-vue 和 vue (如 "ant-design-vue": "^3.2.20", "vue": "^3.2.33") 中[^1],如果遇到二次提交时不触发校验的情况,可能是因为内部状态管理机制未能正确识别到变化或是某些配置不当所致。 下面是一个基于上述情况构建的例子,展示了如何利用 `v-for` 来创建可以被有效验证的动态表单: ```html <template> <a-form :model="formData" ref="ruleForm"> <!-- 假设 formData 是一个多级的对象 --> <div v-for="(item, index) in formData.items" :key="index"> <a-form-item :rules="{ required: true, message: '此项不能为空' }" :name="['items', index, 'value']"> <!-- 这里指定了路径 --> <a-input v-model="item.value"></a-input> </a-form-item> </div> <button @click.prevent="handleSubmit()">Submit</button> </a-form> </template> <script setup lang="ts"> import { reactive, ref } from 'vue'; const ruleForm = ref(null); // 初始化数据 let formData = reactive({ items: [ { value: '' }, { value: '' } ] }); function handleSubmit() { ruleForm.value.validateFields().then(() => { console.log('All fields are valid'); }).catch(errorInfo => { console.error('Validation failed:', errorInfo); }); } </script> ``` 此代码片段展示了一个简单的动态表单实例,其中包含了两个输入框,并且这两个输入框都绑定了各自的校验规则。通过指定 `name` 属性来指示具体要校验的数据位置,从而解决了多层嵌套情况下难以准确定位的问题。此外,还提供了按钮用于触发表单的整体校验逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值