React Hook Forms + Material UI 复选框

Fel*_*e V 8 reactjs material-ui react-hook-form

使用 React Hook Form 和 material-ui 复选框组件提交表单构建时出现错误。复选框的数量是从我的 api 列表中构建的:

        <Grid item xs={12}>
          <FormControl
            required
            error={errors.project?.stack ? true : false}
            component='fieldset'>
            <FormLabel component='legend'>Tech Stack</FormLabel>
            <FormGroup>
              <Grid container spacing={1}>
                {techs.map((option, i) => (
                  <Grid item xs={4} key={i}>
                    <FormControlLabel
                      control={
                        <Checkbox
                          id={`stack${i}`}
                          name='project.stack'
                          value={option.id}
                          inputRef={register({required: 'Select project Tech Stack'})}
                        />
                      }
                      label={option.name}
                    />
                  </Grid>
                ))}
              </Grid>
            </FormGroup>
            <FormHelperText>{errors.project?.stack}</FormHelperText>
          </FormControl>
        </Grid>
Run Code Online (Sandbox Code Playgroud)

提交表单时,我收到以下错误(多次,每个复选框呈现 1 个):

Uncaught (in promise) Error: Objects are not valid as a React child (found: object with keys {type, message, ref})。如果您打算渲染一组子项,请改用数组。

我不明白这个错误。该消息显然表明这是一个渲染问题,但组件渲染良好。问题发生在提交。有什么建议吗?

谢谢

Rom*_*kyi 10

如果有人很难使用 React Material-ui 和 React-Hook-Form 实现多选复选框,你可以查看我的Codesandbox 示例

此外,react-hook-form 在其文档中的章节下提供了一个代码示例useController(不要忘记切换到复选框选项卡)。

在此输入图像描述


Jua*_*cía 8

更新:如果您使用的是 RHF >= 7,您应该使用props.field调用props.field.valueprops.field.onChange


您可以使用默认的复选框控制器:

<FormControlLabel
    control={
      <Controller
        name={name}
        control={control}
        render={(props) => (
          <Checkbox
            {...props}
            checked={props.value}
            onChange={(e) => props.onChange(e.target.checked)}
          />
        )}
      />
    }
    label={label}
  />
Run Code Online (Sandbox Code Playgroud)

我使用了 RHF 的控制器示例,但必须添加checked={props.value}https : //github.com/react-hook-form/react-hook-form/blob/master/app/src/controller.tsx

  • check={!!props.value} 以避免在值最初未定义的情况下从不受控更改为受控的警告 (3认同)
  • 您可以省略 `onChange={(e) =&gt; props.onChange(e.target.checked)}` - react-hook-form 检查事件目标(如果它是复选框),然后读取 `checked` 字段。 (2认同)

Fel*_*e V 7

我设法在不使用控制器的情况下使其工作。道具应该在 FormControlLabel 内,而不是在 Checkbox 内

                <Grid item xs={4} key={i}>
                    <FormControlLabel
                      value={option.id}
                      control={<Checkbox />}
                      label={option.name}
                      name={`techStack[${option.id}]`}
                      inputRef={register}
                    />
                  </Grid>
                ))}
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是不适用于 RHF &gt;= 7 (5认同)