首页 前端知识 vue3 Ant Design Vue实现动态表单 动态校验规则 动态验证

vue3 Ant Design Vue实现动态表单 动态校验规则 动态验证

2024-10-26 09:10:15 前端知识 前端哥 266 244 我要收藏

目录

概要

整体实现流程

实现动态表单生成方法

动态表单效果

实现动态校验规则

实现动态ref验证

小结


概要

业务就是根据后端的动态数据。来分配表单,做一个根据数据生成表单的一个内容,

下面业务就做一个动态表单 ,共享数据表单和动态表单整合合并暂时不做教程

整体实现流程

1.使用reactive生成动态表单对象

2.使用reactive id为key生成formRules动态校验规则

3.使用ref id为key 生成每一个动态表单的ref

实现动态表单生成方法

提示:根据后端发过来的数据生成表单,做新增或者修改 --已新增为列子

我的JSON

[
    {
        "id": 7,
        "countryf": "马来西亚令吉",
        "countryCodef": "MYR",
        "sitef": "马来西亚",
        "toCountryf": "1.6118",
        "toRmbf": "0.6204",
        "deleteFlag": null,
        "createTime": null,
        "createUser": null,
        "updateTime": null,
        "updateUser": null
    },
    {
        "id": 18,
        "countryf": "越南盾",
        "countryCodef": "VND",
        "sitef": "越南",
        "toCountryf": "0.0002858",
        "toRmbf": "3499.3568",
        "deleteFlag": null,
        "createTime": null,
        "createUser": null,
        "updateTime": null,
        "updateUser": null
    },
    {
        "id": 19,
        "countryf": "泰国泰铢",
        "countryCodef": "THB",
        "sitef": "泰国",
        "toCountryf": "0.2042",
        "toRmbf": "4.8963",
        "deleteFlag": null,
        "createTime": null,
        "createUser": null,
        "updateTime": null,
        "updateUser": null
    },
    {
        "id": 20,
        "countryf": "菲律宾比索",
        "countryCodef": "PHP",
        "sitef": "菲律宾",
        "toCountryf": "0.1255",
        "toRmbf": "7.9683",
        "deleteFlag": null,
        "createTime": null,
        "createUser": null,
        "updateTime": null,
        "updateUser": null
    },
    {
        "id": 21,
        "countryf": "新加坡元",
        "countryCodef": "SGD",
        "sitef": "新加坡",
        "toCountryf": "5.4241",
        "toRmbf": "0.1844",
        "deleteFlag": null,
        "createTime": null,
        "createUser": null,
        "updateTime": null,
        "updateUser": null
    }
]

看json有那么就可以已id作为key或者其他数据 js的方法

//定义一个数据集合
const exchangeRateList = ref([])
//表单对象动态
const sitefformData=reactive({})
//校规则
const formRules = reactive({

})
//标签页切换
const activeKey = ref(0);
//定义一个打开抽屉方法或者组件加载的生命周期你 record, shopnames 是我修改的参数 新增可以删除
const onOpen = async (record, shopnames) => {

await getExchangeRate() //数据处理的方法
}
const getExchangeRate = () => {
	financeExchangeRateApi.financeExchangeRatePage().then(res => {
		exchangeRateList.value = res.records //存放数据集合
         exchangeRateList.value.forEach(record => {

				// 使用 record 的 value 属性作为 key,创建响应式的表单数据对象
				const key = record.countryCodef;

             sitefformData[key] = {} //生成每一个表单对象 {} 可以添加默认值 
            //例如{exchangeRatef: record.toCountryf}


});

})
}

vue3页面实现

:a-tabs:是一个表格

a-tab-pane:为标签页

forceRender:激活每一个标签页,不然校验规则不生效的

<a-tabs v-model:activeKey="activeKey" @change="handleTabClick">

<a-tab-pane v-for="(tab, indexs) in exchangeRateList" :key="indexs" :tab="tab.sitef" 
					forceRender
					 >
<a-form :model="sitefformData[tab.countryCodef]"
							layout="inline">

	<a-form-item label="平台佣金费率:" name="commissionf" style="margin-bottom: 16px;">
	<a-input v-model:value="sitefformData[tab.countryCodef].commissionf"
	placeholder="请输入平台佣金费率" 
     suffix="%" />									
     </a-form-item>
	</a-tab-pane>
    </a-tabs>

动态表单效果

点击标签切换就可以看到每一个表单的的内容

实现动态校验规则

提示:只有表单还是不行 需要动态规则的校验,不然用户填写什么都可以做那还是不行

就准备校验规则的实现

1.const formRules = reactive({})  //定义校验规则

2.在getExchangeRate()添加校验规则

const onOpen = async (record, shopnames) => {

await getExchangeRate() //数据处理的方法
}
const getExchangeRate = () => {
	financeExchangeRateApi.financeExchangeRatePage().then(res => {
		exchangeRateList.value = res.records //存放数据集合
         exchangeRateList.value.forEach(record => {

				// 使用 record 的 value 属性作为 key,创建响应式的表单数据对象
				const key = record.countryCodef;

             sitefformData[key] = {} //生成每一个表单对象 {} 可以添加默认值 
            //例如{exchangeRatef: record.toCountryf}
           
             //添加校验规则
formRules[key] = {commissionf: [required('请填写平台佣金费率')]}

});

})
}

3.vue页面 添加:rules="formRules[tab.countryCodef]"

<a-tab-pane v-for="(tab, indexs) in exchangeRateList" :key="indexs" :tab="tab.sitef" 

:rules="formRules[tab.countryCodef]"
                    forceRender
                     >

4.这样就为每一个表单都添加了一个校验规则

实现动态ref验证

例如:

只有校验规则还是不行 如果用户点击保存还是需要 函数进行校验才可以通过保存 所以要为每一个校验规则都绑定一个ref验证的函数

1.定义const formRefs = ref([]) // 用于存储表单引用的数组 

2.在form表单添加 ref校验 为什么这样写 你会发现当你切换标签页 其实 activeKey也是跟着变化的,这个就是他的索引,切换就可以拿到他的对象

<a-form :model="sitefformData[tab.countryCodef]" :rules="formRules[tab.countryCodef]"
						:ref="setFormRef(indexs)"	layout="inline">

3.定义引用方法

// 设置表单引用的函数

const setFormRef = (index) => {

    return (el) => {

        formRefs.value[index] = el;

    };

};

 4.在保存方法添加 这样循环每一个标签页 是否都校验成功

const onSubmit = async () => {
	await nextTick()
		const promises = formRefs.value.map((formRef) => formRef.validate());
		// 使用 Promise.all 等待所有表单校验完成
		Promise.all(promises).then(() => {
})
}

小结

提示:这样你就可以动态生成表单,动态校验规则了

及时关注我!!,学习更多知识

转载请注明出处或者链接地址:https://www.qianduange.cn//article/19181.html
标签
评论
会员中心 联系我 留言建议 回顶部
复制成功!