Closed1

【material ui react-hook-form Next.js】watch機能を使用した選択肢連動型動的フォームを作成する。

hirohiro

何について書く?

  • react-hook-formのwatch機能を使用した選択肢連動型動的フォームを作成する方法

内容

  • 結論から
import { Button, FormControl, FormControlLabel, Grid, InputLabel, Radio, RadioGroup, TextField } from '@material-ui/core'
import Typography from '@material-ui/core/Typography'
import React from 'react'
import { Controller, useForm } from 'react-hook-form'

const Form = () => {
  const classes = useStyles()

  const { register, handleSubmit, errors, reset, control, watch, setValue } = useForm({
    mode: 'all',
  })

  const submit = (formData) => {
    console.log(formData)
  }

  const radioItems = ['A', 'B']

  const radioType = watch('radioItem')

  return (
    <form onSubmit={handleSubmit(submit)}>
      <Grid item sm={12}>
        <InputLabel shrink htmlFor="radioItem">
          radio
        </InputLabel>
        <FormControl error={Boolean(errors.radioItem)}>
          <Controller
            name="radioItem"
            control={control}
            rules={{ required: true }}
            defaultValue="A"
            as={
              <RadioGroup row aria-label="radioItem" name="radioItem" >
                {radioItems.map((radioItem, index) => <FormControlLabel key={index} control={<Radio color="default" value={radioItem} />} label={radioItem} />)}
              </RadioGroup>
            }
          />
        </FormControl>
        {radioType === 'B' ?
          <>
            <InputLabel shrink htmlFor="text">
              選択肢連動型フォーム
            </InputLabel>
            <FormControl fullWidth>
              <TextField
                name="text"
                inputRef={register({ required: true })}
                error={errors.requestDateTimes ? Boolean(errors.text) : null}
                type="text"
                variant="outlined"
              />
            </FormControl>
          </>
          : <></>
        }
      </Grid>
      <Grid container alignItems='center' justify='center' className={classes.footer}>
        <Grid item sm={3}>
          <Button type='submit' variant="contained" fullWidth className={classes.submitButton} disabled={!!Object.keys(errors).length}>
            <Typography className={classes.submitText} variant="button">送信する</Typography>
          </Button>
        </Grid>
      </Grid>
    </form>
  )
}

export default Form
  • Bを選択したとき、テキストエリアが出るようになる。radioItemのフォームを常に確認してくれるのがwatch機能で、その状態で動的テキストエリアを表示非表示可能となる。

参考サイト

このスクラップは2022/04/17にクローズされました