我有一个多步骤的表单,该表单是使用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}
/>
),
},
];
点击提交后,我正在执行
const handleSubmit = (e) => {
triggerValidation(forms[currentForm].fields).then((valid) => {
if (valid) {
console.log('whole form data - ', JSON.stringify(defaultValues));
}
});
};
在这里,如果要在form2中添加两个数据,我想要如下数据:
{
"fname": "dsteve",
"sname": "smith",
"userInfo": [
{
"desig": "ddd",
"dept": "deptee"
},
{
"desig": "ddd",
"dept": "deptee"
}
]
}
我已经做了所有事情,但是只有在这里我被困住了,我知道问题出在哪里
代替这个
fields: ["fname", "sname"],
我必须这样做
fields:[`userInfo[0].name, `userInfo[0].sname],
这个0-1我必须根据索引进行动态调整,我不知道自己缺少什么
我尝试通过inputHolder
映射具有索引的字段,但是没有用
编辑/更新
如果我这样做
fields:[`userInfo[0].name`,`userInfo[1].name`, `userInfo[0].sname`,`userInfo[1].sname],
因此,它正在对两个字段进行验证,但是我正在手动操作,如果用户创建更多字段,则应该动态获取这些字段。
这是我的代码沙箱,其中包含完整的代码
我愿意使用任何新方法,但是应该使用react-hook-form
并完全填写我要尝试的操作
我现在不知道该如何接受我的方法
答案 0 :(得分:3)
您可以创建一个由2个空字符串组成的数组,其中第一个表示第一行F名称,然后 第二个代表在MainComponent中您inputHolder下的第一行S Name:
const [inputHolder, setinputHolder] = useState([
{
id: 1,
fname: "",
sname: ""
}
]);
const [names, setNames] = useState(["", ""]);
接下来,每次用户向您添加的新行添加到名称数组中的空字符串中时。
const addRow = () => {
console.log(inputHolder.length);
let item = {
id: inputHolder.length + 1,
fname: "",
sname: ""
};
setinputHolder([...inputHolder, item]);
setNames([...names, "", ""]);
};
每个空字符串代表F名称和S名称。 最后,将字段设置为第二种形式的名称:
fields: names,
component: (register, errors, defaultValues) => (
<Form2
register={register}
errors={errors}
defaultValues={defaultValues}
inputHolder={inputHolder}
addRow={addRow}
/>
答案 1 :(得分:1)
我建议您使用 yup 作为验证工具。这是一个功能强大的工具。
import * as yup rom 'yup';
const schema = yup.object().shape({
field1: yup.string().required() // number, array - whatever,
field2: yup.string().required(),
})
也应为第二种形式创建相似的模式
import { yupResolver } from '@hookform/resolvers/yup';
const { register, handleSubmit } = useForm({
resolver: yupResolver(schema),
});
对第二个表单执行相同的操作- 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*
});
现在,您可以创建动作*(按钮/链接)*,并将其传递给 {附加,删除} 动作。
{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),
})