首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将挂钩窗体设置复选框更改为选中状态

将挂钩窗体设置复选框更改为选中状态
EN

Stack Overflow用户
提问于 2022-04-08 08:00:27
回答 2查看 7.1K关注 0票数 3

我正在试用反应钩式

复选框的简单代码如下:

代码语言:javascript
复制
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>
  )
}

我可以正确地提交表单,但是我像一月的复选框一样,从复选框开始,但是当我将“选中”放在代码中时,我不知何故不能“取消”它。

我似乎错过了什么,任何帮助都会非常感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-08 09:42:03

传递checked的问题是,它将控制权从useForm转移到管理复选框。

假设函数register()返回{ checked: true/false, onChange: changeHandler }。因此,如果我们在哪里查看属性,就会产生以下结果。

代码语言:javascript
复制
<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允许您在最初调用钩子时传递默认值。

代码语言:javascript
复制
const {
  register,
  handleSubmit,
  formState: { errors },
} = useForm({ defaultValues: { January: true } });

// ...

<input
  type='checkbox'
  {...register("January")}
  className='mx-3'
/>

或者,您也可以使用"months",而不是为每个复选框指定自己的名称。如果有多个使用相同名称的复选框,结果将不是true/false,而是包含值的数组。

代码语言:javascript
复制
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'
/>
票数 4
EN

Stack Overflow用户

发布于 2022-04-09 00:56:29

基于@3阈值4tOr的完整工作代码

代码语言:javascript
复制
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>
  )
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71793608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档