我正在使用react-hook-form库来创建一个多步动态大表单(超过 70 个字段)。我的大部分表单字段都是动态的(用户可以通过单击 + 按钮添加/删除更多字段)。为了实现这一点,我使用了 react-hooks 并为每个动态字段添加了一个钩子。但我觉得我的代码不够抽象,可能有更聪明的方法来做到这一点。下面是我的表单的示例屏幕截图:
钩子和表单字段的相应代码在这里:
// hooks
const [sizes, setSizes] = React.useState([0]);
const [formats, setFormats] = React.useState([0]);
const [counter, setCounter] = React.useState(1);
// buttons
const addSizesFieldset = () => {
setSizes(prevIndexes => [...prevIndexes, counter]);
setCounter(prevCounter => prevCounter + 1);
};
const removeSizesFieldset = index => () => {
setSizes(prevIndexes => [
...prevIndexes.filter(item => item !== index)
]);
setCounter(prevCounter => prevCounter - 1);
};
const addFormatsFieldset = () => {
setFormats(prevIndexes => [...prevIndexes, counter]);
setCounter(prevCounter => prevCounter + 1);
};
const removeFormatsFieldset = index => () => {
setFormats(prevIndexes => [
...prevIndexes.filter(item => item !== index)
]);
setCounter(prevCounter => prevCounter - 1);
};
// form field arrays
{sizes.map(index => {
const fieldName = `sizes[${index}]`;
return (
<fieldset name={fieldName} key={fieldName} >
<h4>Sizes:</h4>
<label>
Size:
<input
type="text"
placeholder="Input"
name={`${fieldName}.size`}
ref={register}
/>
</label>
<button type="button" onClick={addSizesFieldset}>
+
</button>
<button type="button" onClick={removeSizesFieldset(index)}>
-
</button>
</fieldset>
);
})}
{formats.map(index => {
const fieldName = `formats[${index}]`;
return (
<fieldset name={fieldName} key={fieldName} >
<h4>Formats:</h4>
<label>
Format:
<input
type="text"
placeholder="Input"
name={`${fieldName}.format`}
ref={register}
/>
</label>
<button type="button" onClick={addFormatsFieldset}>
+
</button>
<button type="button" onClick={removeFormatsFieldset(index)}>
-
</button>
</fieldset>
);
})} ´´
想象一下,您正在const add/remove...Fieldset
为 70 个字段执行这些钩子瞬间和函数。对我来说,这似乎太多重复了,但除了“React 可以处理多个钩子,所以不用担心”评论之外,我找不到任何解决方案或新想法。
如果您想在代码沙盒上尝试您的想法,我还准备了以下代码: