我正在试用反应钩式
复选框的简单代码如下:
import React from 'react'
import { useForm } from 'react-hook-form'
export default function App() {
const {
register,
handleSubmit,
formState: { errors },
} = useForm()
const onSubmit = (data: any) => console.log(data)
console.log(errors)
return (
<div className='mx-auto justify-center p-32 flex'>
<form onSubmit={handleSubmit(onSubmit)}>
<div className='p-2'>
<label htmlFor=''>January</label>
<input
type='checkbox'
placeholder='January'
{...register('January', {})}
className='mx-3'
checked
/>
</div>
<div className='p-2'>
<label htmlFor=''>February</label>
<input
type='checkbox'
placeholder='February'
{...register('February', {})}
className='mx-3'
/>
</div>
<input type='submit' />
</form>
</div>
)
}我可以正确地提交表单,但是我像一月的复选框一样,从复选框开始,但是当我将“选中”放在代码中时,我不知何故不能“取消”它。
我似乎错过了什么,任何帮助都会非常感激。
发布于 2022-04-08 09:42:03
传递checked的问题是,它将控制权从useForm转移到管理复选框。
假设函数register()返回{ checked: true/false, onChange: changeHandler }。因此,如果我们在哪里查看属性,就会产生以下结果。
<input
type='checkbox'
placeholder='January'
{...register('January', {})}
className='mx-3'
checked
/>
<input
type='checkbox'
placeholder='January'
{...{
checked: true/false,
onChange: changeHandler,
}}
className='mx-3'
checked
/>
<input
type='checkbox'
placeholder='January'
checked={true/false}
onChange={changeHandler}
className='mx-3'
checked
/>由于checked两次出现,后者将覆盖前者。在本例中,您的checked是最后一个,因此它重写了由useForm管理的值。
在register()调用之前传递它也无助于您,因为您的默认值将被useForm管理的值覆盖,因此永远不会使用。
现在我已经弄清楚了为什么会发生这个问题,让我们继续讨论解决方案。
useForm允许您在最初调用钩子时传递默认值。
const {
register,
handleSubmit,
formState: { errors },
} = useForm({ defaultValues: { January: true } });
// ...
<input
type='checkbox'
{...register("January")}
className='mx-3'
/>或者,您也可以使用"months",而不是为每个复选框指定自己的名称。如果有多个使用相同名称的复选框,结果将不是true/false,而是包含值的数组。
const {
register,
handleSubmit,
formState: { errors },
} = useForm({
defaultValues: { months: ["January"] }
// only January ^ is checked by default
});
//...
<input
type='checkbox'
value='January'
{...register("months")}
className='mx-3'
/>
<input
type='checkbox'
value='February'
{...register("months")}
className='mx-3'
/>发布于 2022-04-09 00:56:29
基于@3阈值4tOr的完整工作代码
import React, { useState } from 'react'
import { useForm } from 'react-hook-form'
export default function App() {
const {
register,
handleSubmit,
formState: { errors },
} = useForm({
defaultValues: { months: ['January'] },
})
const onSubmit = (data: any) => console.log(data)
console.log(errors)
return (
<div className='mx-auto justify-center p-32 flex'>
<form onSubmit={handleSubmit(onSubmit)}>
<div className='p-2'>
<label htmlFor=''>January</label>
<input
type='checkbox'
value='January'
placeholder='January'
{...register('months')}
className='mx-3'
/>
</div>
<div className='p-2'>
<label htmlFor=''>February</label>
<input
type='checkbox'
value='February'
placeholder='February'
{...register('months')}
className='mx-3'
/>
</div>
<input type='submit' />
</form>
</div>
)
}https://stackoverflow.com/questions/71793608
复制相似问题