1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

React Hook Form v6 でMaterial UIのSwitchに初期値が入らない

Last updated at Posted at 2021-12-05

##はじめに
初投稿になります。
業務でReact Hook Form v6を使っていて、かなり詰まったので投稿します。

##現象
タイトルの通り、React Hook Form v6のdefaultValuesに設定した値が
Material UIのSwitchに設定されないという事象が発生しました。
Switchだけでなく、ラジオボタンやチェックボックスでも同じだと思います。

import { Button, Switch, FormControlLabel } from "@material-ui/core";
import { Controller, useForm } from "react-hook-form";

const ReactHookFormTest = () => {
  const { handleSubmit, control } = useForm({
    defaultValues: {
      switch1: true,
      switch2: true
    }
  });

  return (
    <>
      <form onSubmit={handleSubmit((data) => console.log(data))}>
        <Controller
          as={Switch}
          type="checkbox"
          name="switch1"
          control={control}
        />
        <br />
        <FormControlLabel
          control={
            <Controller
              name="switch2"
              control={control}
              as={Switch}
            />
          }
          label="aaa"
        />
        <Button type="submit" color="primary">
          送信
        </Button>
      </form>
    </>
  );
};

export default function App() {
  return (
    <div className="App">
      <ReactHookFormTest />
    </div>
  );
}

スクリーンショット 2021-12-05 22.59.57.png
defaultValuesに両方trueを設定しているのに、スイッチがオフのままです...。

##原因
React Hook Formのバージョンによる原因だったようです。
公式のGithubのリリース情報を調べてみると、チェックボックス系の仕様が
v6.0.3から変わったようで、Controllerの中のasプロパティは使えないようです。
v6.0.3以上を使っている場合は、renderプロパティを使う必要があります。
ちなみに上記コードはv6.0.2以下のバージョンであれば、正常に動作しました。

##対策
公式Githubで拾ってきたコードに変更してみた。

import { Button, Switch, FormControlLabel } from "@material-ui/core";
import { Controller, useForm } from "react-hook-form";

const ReactHookFormTest = () => {
  const { handleSubmit, control } = useForm({
    defaultValues: {
      switch1: true,
      switch2: true
    }
  });

  return (
    <>
      <form onSubmit={handleSubmit((data) => console.log(data))}>
        <Controller
          render={(props) => (
            <Switch
              onChange={(e) => props.onChange(e.target.checked)}
              checked={props.value}
            />
          )}
          type="checkbox"
          name="switch1"
          control={control}
        />
        <br />
        <FormControlLabel
          control={
            <Controller
              name="switch2"
              control={control}
              render={(props) => (
                <Switch
                  onChange={(e) => props.onChange(e.target.checked)}
                  checked={props.value}
                />
              )}
            />
          }
          label="aaa"
        />
        <Button type="submit" color="primary">
          送信
        </Button>
      </form>
    </>
  );
};

export default function App() {
  return (
    <div className="App">
      <ReactHookFormTest />
    </div>
  );
}

スクリーンショット 2021-12-05 23.11.19.png

見事チェックが入りました!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?