首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >react-hook-form和MUI FormControl

react-hook-form和MUI FormControl
EN

Stack Overflow用户
提问于 2020-09-24 16:26:11
回答 1查看 8.4K关注 0票数 3

所以我正在尝试为我的表单注册一些单选按钮,但是它不会注册。

代码语言:javascript
复制
<FormControl component="fieldset" inputRef={register({ required: true })}>
  <FormLabel component="legend">Promoting</FormLabel>
  <RadioGroup aria-label="promoting" name="promoting" value={promoting} onChange={handleChange} inputRef={register({ required: true })}>
    <FormControlLabel value="business" control={<Radio  />} label="Business" />
    <FormControlLabel value="nonprofit" control={<Radio />} label="Non-Profit" />
    <FormControlLabel value="event" control={<Radio  />} label="Event" />
  </RadioGroup>
</FormControl>

我想知道我做错了什么

完整代码:

代码语言:javascript
复制
export default function BuildAd() {
  const [promoting, setValue] = React.useState('female');

  const handleChange = (event) => {
    setValue(event.target.value);
  };

  const { register, handleSubmit, errors } = useForm();

  const onSubmit = data => console.log(data);
  console.log(errors);
  
  return (
    <div style={{ padding: 16, margin: 'auto', maxWidth: 600 }}>
    <CssBaseline />
    
    <Typography variant="h5" align="center" component="h2" gutterBottom>
      Create your campaign
    </Typography>
         <Paper style={{ padding: 16 }}>
              <form onSubmit={handleSubmit(onSubmit)}>
                <input type="text" placeholder="First name" name="First name" ref={register({required: true, maxLength: 80})} />
                <input type="text" placeholder="Last name" name="Last name" ref={register({required: true, maxLength: 100})} />
                <input type="text" placeholder="Email" name="Email" ref={register({required: true, pattern: /^\S+@\S+$/i})} />
                <input type="tel" placeholder="Mobile number" name="Mobile number" ref={register({required: true, minLength: 6, maxLength: 12})} />
                <select name="Title" ref={register({ required: true })}>
                  <option value="Mr">Mr</option>
                  <option value="Mrs">Mrs</option>
                  <option value="Miss">Miss</option>
                  <option value="Dr">Dr</option>
                </select>

                <input name="Developer" type="radio" value="Yes" ref={register({ required: true })}/>
                <input name="Developer" type="radio" value="No" ref={register({ required: true })}/>


                <Typography variant="h5">What are you Advertising</Typography>
                    <Box m={2}/>
                    <FormControl component="fieldset" inputRef={register({ required: true })}>
                    <FormLabel component="legend">Promoting</FormLabel>
                    <RadioGroup aria-label="promoting" name="promoting" value={promoting} onChange={handleChange} inputRef={register({ required: true })}>
                      <FormControlLabel value="business" control={<Radio inputRef={register({ required: true })} />} label="Business" />
                      <FormControlLabel value="nonprofit" control={<Radio inputRef={register({ required: true })} />} label="Non-Profit" />
                      <FormControlLabel value="event" control={<Radio inputRef={register({ required: true })} />} label="Event" />
                    </RadioGroup>
                  </FormControl>
                  
                <input type="submit" />
            </form>
      </Paper>
    </div>
  );
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-24 18:34:13

如果Controller不起作用,您可以使用可控组件。

在您的例子中,我怀疑这是因为name属性在传递到原生输入(如inputselect )时作为name属性传递给RadioGroup is not the same

react-hook-form V7

代码语言:javascript
复制
const { handleSubmit, control } = useForm({
  defaultValues: {
    promoting2: '',
  },
});
代码语言:javascript
复制
<FormControl component="fieldset">
  <FormLabel component="legend">Promoting</FormLabel>
  <Controller
    rules={{ required: true }}
    control={control}
    name="promoting2"
    render={({ field }) => (
      <RadioGroup {...field}>
        <FormControlLabel
          value="business"
          control={<Radio />}
          label="Business"
        />
        <FormControlLabel
          value="nonprofit"
          control={<Radio />}
          label="Non-Profit"
        />
        <FormControlLabel
          value="event"
          control={<Radio />}
          label="Event"
        />
      </RadioGroup>
    )}
  />
</FormControl>

react-hook-form V6

代码语言:javascript
复制
const { register, handleSubmit, errors, control } = useForm({
  promoting: '',
});
const onSubmit = (data) => alert(JSON.stringify(data, null, 2));
代码语言:javascript
复制
<form onSubmit={handleSubmit(onSubmit)}>
  <FormControl component="fieldset">
    <FormLabel component="legend">Promoting</FormLabel>
    <Controller
      rules={{ required: true }}
      control={control}
      name="promoting"
      as={
        <RadioGroup>
          <FormControlLabel
            value="business"
            control={<Radio />}
            label="Business"
          />
          <FormControlLabel
            value="nonprofit"
            control={<Radio />}
            label="Non-Profit"
          />
          <FormControlLabel
            value="event"
            control={<Radio />}
            label="Event"
          />
        </RadioGroup>
      }
    />
  </FormControl>

  <input type="submit" />
</form>

如果您想要在onChange触发时读取值,则在将元素传递给as属性时不能这样做:

代码语言:javascript
复制
<Controller
  {...}
  as={
    <MyComponent
      onChange={handleChange} // handleChange will never be called
    />
  }
/>

这是因为Controller会复制您传入的元素,并传递它自己的onChange属性,这些属性将覆盖您的属性。参见herehere

要解决这个问题,您需要使用另一种方法通过使用render属性传递元素,以获得对应该如何呈现组件的更多控制。

代码语言:javascript
复制
<Controller
  rules={{ required: true }}
  control={control}
  name="promoting2"
  render={({ name, onBlur, onChange, value }) => (
    <RadioGroup
      value={value}
      onBlur={onBlur}
      onChange={(e) => {
        onChange(e);
        console.log(e.target.value); // will be called this time
      }}
    >
      <FormControlLabel
        value="business"
        control={<Radio />}
        label="Business"
      />
      {...}
    </RadioGroup>
  )}
/>

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64042394

复制
相关文章

相似问题

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