【发布时间】:2023-01-29 23:33:38
【问题描述】:
我使用 React Hook 表单创建了一个表单组件。该组件由一组复选框和一个文本输入组成。当用户单击最后一个复选框 custom 时出现文本输入。这个想法是:当用户点击它时会出现一个文本输入,用户可以添加自定义答案/选项。例如:如果用户在输入中键入 test,那么当用户保存表单时,test 值应该出现在数组中,但 custom 文本不应出现在数组中。在我的应用程序中,我无权访问 const onSubmit = (data) => console.log(data, "submit");,因此我需要更改 Component 组件中的值。现在,当我单击提交时,我在最终数组中得到了 custom 值。
问题:如何解决上述问题?
const ITEMS = [
{ id: "one", value: 1 },
{ id: "two", value: 2 },
{ id: "Custom Value", value: "custom" }
];
export default function App() {
const name = "group";
const methods = useForm();
const onSubmit = (data) => console.log(data, "submit");
return (
<div className="App">
<FormProvider {...methods}>
<form onSubmit={methods.handleSubmit(onSubmit)}>
<Component ITEMS={ITEMS} name={name} />
<input type="submit" />
</form>
</FormProvider>
</div>
);
}
export const Component = ({ name, ITEMS }) => {
const { control, getValues } = useFormContext();
const [state, setState] = useState(false);
const handleCheck = (val) => {
const { [name]: ids } = getValues();
const response = ids?.includes(val)
? ids?.filter((id) => id !== val)
: [...(ids ?? []), val];
return response;
};
return (
<Controller
name={name}
control={control}
render={({ field, formState }) => {
return (
<>
{ITEMS.map((item, index) => {
return (
<>
<label>
{item.id}
<input
type="checkbox"
name={`${name}[${index}]`}
onChange={(e) => {
field.onChange(handleCheck(e.target.value));
if (index === ITEMS.length - 1) {
setState(e.target.checked);
}
}}
value={item.value}
/>
</label>
{state && index === ITEMS.length - 1 && (
<input
{...control.register(`${name}[${index}]`)}
type="text"
/>
)}
</>
);
})}
</>
);
}}
/>
);
};
演示:https://codesandbox.io/s/winter-brook-sml0ww?file=/src/Component.js:151-1600
【问题讨论】:
-
看起来你已经开始工作了。我使用该链接验证了提交用户在自定义字段中键入的文本是记录到控制台的内容。也许我不明白你的问题。一旦字段可见,您是否试图阻止看到“自定义”文本?
-
@codejockie,试试这个:选择所有复选框并在输入中添加文本,提交后,然后取消选择一个复选框并提交,您会看到值没有正确保存。你找到问题了吗?
-
@codejockie,你能帮忙吗?
-
我稍微修改了你的代码。例子请看以下链接:codesandbox.io/s/cocky-aryabhata-7jprlr?file=/src/Custom.js
-
@codejockie,如何获取值数组?示例:
[first, second, inputValue]
标签: javascript reactjs react-hook-form