Search code examples
node.jsreact-hook-form

react-hook-form & material-UI Select


I am having an issue getting the following code to work with react-hook-form.

I am seeking a solution so that when I hit submit, it submits it. The error is saying there is no name property, however you will see the code does have a name property value

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

const onSubmit = data => console.log(data);

  
return(
<form onSubmit={handleSubmit(onSubmit)} className={classes.container}>
         
 <TextField fullWidth   
                    onChange={changeBudget}
                    inputRef={register({ required: true })}
                    id="select" 
                    name="campaignSpend" 
                    label="Campaign Budget" 
                    value={campaignBudget}
                    select variant="outlined">
                      <MenuItem value="250">$250</MenuItem>
                      <MenuItem value="500">$500</MenuItem>
                      <MenuItem value="$1000">$1000</MenuItem>
                    </TextField>

                <Button className={classes.button} type="submit" variant="outlined" aria-label="delete" color="primary" >
                  Continue
                </Button>

 </form>
)

I also tried

<FormControl className={classes.formControl} component="fieldset" inputRef={register({ required: true })}>
                      <InputLabel id="demo-controlled-open-select-label">Campaign Budget</InputLabel>
                      <Select
                        labelId="demo-controlled-open-select-label"
                        id="demo-controlled-open-select"
                        name="test"
                        open={open}
                        onClose={handleClose}
                        onOpen={handleOpen}
                        value={campaignBudget}
                        onChange={changeBudget}
                   
                      >
                        <MenuItem value="">
                          <em>None</em>
                        </MenuItem>
                        <MenuItem value={10}>Ten</MenuItem>
                        <MenuItem value={20}>Twenty</MenuItem>
                        <MenuItem value={30}>Thirty</MenuItem>
                      </Select>
                    </FormControl>

Solution

  • If you are using v7 the best way was to use controllers for Material Ui components including Textfield and Selects

    import { useForm, Controller } from 'react-hook-form';
    
    //component
    
    const methods = useForm();
    const { control } = methods;
    
     <FormControl fullWidth variant="outlined">
                <InputLabel htmlFor="campaign_budget_label">Campaign Budget</InputLabel>
                <Controller
                  name="campaignSpend"
                  control={methods.control}
                  rules={{ required: 'Budget Required' }}
                  render={({ field: { onChange, value} }) => (
                    <Select 
                      value={value}
                      onChange={onChange}
                      label="Campaign Budget" 
                      labelId="campaign_budget_label"
                      >
                      <MenuItem value="250">$250</MenuItem>
                      <MenuItem value="500">$500</MenuItem>
                      <MenuItem value="$1000">$1000</MenuItem>
                    </Select>
                  )} 
                  defaultValue="" // make sure to set up defaultValue
                />
              </FormControl>