man*_*kur 19 javascript reactjs react-hooks react-hook-form
我有一个多步骤表单,我正在使用 react 来制作我正在使用的验证react-hook-form。
我已经完成了 90% 的事情,只是我面临的问题是获取动态的第二个表单数据。
我正在做的是
问题
我做了什么
在我的主要组件中,我这样做是为了验证
const forms = [
{
fields: ['desig', 'dept'],
component: () => (
<Pro register={register} errors={errors} defaultValues={defaultValues} />
),
},
{
fields: [
`userInfo[0].fname`, // here I am facing issue if I am statically putting 0,1 then it is validating that perticular form
`userInfo[0].sirname`,
],
component: () => (
<Basic
register={register}
errors={errors}
defaultValues={defaultValues}
inputHolder={inputHolder}
deleteRow={deleteRow}
addRow={addRow}
/>
),
},
];
Run Code Online (Sandbox Code Playgroud)
单击提交时,我正在执行此操作
const handleSubmit = (e) => {
triggerValidation(forms[currentForm].fields).then((valid) => {
if (valid) {
console.log('whole form data - ', JSON.stringify(defaultValues));
}
});
};
Run Code Online (Sandbox Code Playgroud)
如果在form2中添加了两个数据,我想要如下数据
{
"fname": "dsteve",
"sname": "smith",
"userInfo": [
{
"desig": "ddd",
"dept": "deptee"
},
{
"desig": "ddd",
"dept": "deptee"
}
]
}
Run Code Online (Sandbox Code Playgroud)
我已经做了一切,但只有我被卡住了,我知道问题出在哪里
而不是这个
fields: ["fname", "sname"],
Run Code Online (Sandbox Code Playgroud)
我必须这样做
fields:[`userInfo[0].name, `userInfo[0].sname],
Run Code Online (Sandbox Code Playgroud)
这个 0-1 我必须根据索引动态化,我不知道我错过了什么
我尝试通过索引映射字段,inputHolder但没有用
编辑/更新
如果我这样做
fields:[`userInfo[0].name`,`userInfo[1].name`, `userInfo[0].sname`,`userInfo[1].sname],
Run Code Online (Sandbox Code Playgroud)
所以它正在对两个字段进行验证,但这是我手动进行的,如果用户创建更多字段,那么应该动态获取这些字段。
这是我的代码沙箱,其中包含完整代码
我愿意使用任何新方法,但应该使用react-hook-form并完全填充我正在尝试做的事情
我现在不知道如何推进我的方法
我建议您使用yup作为验证实用程序。这是一个强大的工具。
import * as yup rom 'yup';
const schema = yup.object().shape({
field1: yup.string().required() // number, array - whatever,
field2: yup.string().required(),
})
Run Code Online (Sandbox Code Playgroud)
也应该为第二种形式创建类似的模式
import { yupResolver } from '@hookform/resolvers/yup';
const { register, handleSubmit } = useForm({
resolver: yupResolver(schema),
});
Run Code Online (Sandbox Code Playgroud)
对第二个表单执行相同的操作 - useForm + 验证解析器。
下一部分是让你的第二个表单是动态的,所以一定要使用钩子useFieldArray
const { fields, append, remove } = useFieldArray({
name: 'userInfo', *// key, a part of path to access your fields - userInfo[n].fname*
control: form.control, *// to connect you fields to basic form*
});
Run Code Online (Sandbox Code Playgroud)
现在您可以创建操作*(按钮/链接)*并向它们传递{附加、删除}操作。
默认情况下, {fields}应由 .map 呈现。一旦您尝试使用(n)计数部分验证您的第二个表单 - 您的架构将应用于每个部分。
还有另一种解决方案,您可以跳过第二种形式的部分(如果您的第二个模式可能很大,我更喜欢这种方式)。
您可以将useFieldArray字段连接到第一个表单,并且您的单个验证架构如下所示:
import * as yup rom 'yup';
const infoSchema = yup.object().schema({
firstName: yup.string(),
lastName: yup.string(),
})
*// enhance infoSchema to your expected logic.*
const schema = yup.object().shape({
field1: yup.string().required() // number, array - whatever,
field2: yup.string().required(),
userInfo: yup.array().of(infoSchema),
})
Run Code Online (Sandbox Code Playgroud)