我试了React-Hook-form

复选框的简单代码如下所示:

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>
  )
}

我可以正确提交表单,但我喜欢一月复选框作为复选框开始,但当我在代码中显示"选中"时,我不知何故无法将其"取消选中".

我似乎错过了什么,任何帮助都将不胜感激.

推荐答案

通过checked的问题是,管理复选框会失go 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",而不是 for each 复选框指定自己的名称.如果有多个复选框使用相同的名称,结果将不是true/false,而是一个包含值的array.

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'
/>

Javascript相关问答推荐

如何从对象嵌套数组的第二级对象中过滤出键

为什么我达到了时间限制!?LeetCode链接列表循环(已解决,但需要解释!)

如何将拖放功能添加到我已自定义为图像的文件输入HTML标签中?

是什么原因导致此Angular 16电影应用程序中因类型错误而不存在属性?

在网页上添加谷歌亵渎词

当作为表达式调用时,如何解析方法decorator 的签名?

我的服务工作器没有连接到我的Chrome扩展中的内容脚本.我该怎么解决这个问题?

在286之后恢复轮询

还原器未正确更新状态

如何从HTML对话框中检索单选项组的值?

我可以使用空手道用户界面来获取网页的当前滚动位置吗?

如何在文本字段中输入变量?

检索相加到点的子项

使用带有HostBinding的Angular 信号来更新样式?

在查看网页时,如何使HTML中的按钮工作方式类似于鼠标上的滚轮或箭头键?

如何在AG-Grid文本字段中创建占位符

JavaScript将字符串数字转换为整数

如何在下一个js中更改每个标记APEXCHARTS图表的 colored颜色

在高位图中显示每个y轴系列的多个值

如何在Highlihte.js代码区旁边添加行号?