LoginSignup
5
0

More than 1 year has passed since last update.

react-hook-formとMUIを使用した再利用可能なInput共通コンポーネントの作成(TypeScript)

Last updated at Posted at 2022-12-16

最近勉強会でMUIとReact-hook-formをテーマに発表したので、まとめていきます。
今回は最小単位のinputコンポーネントを作り、それを他で再利用してコンポーネントを作っていけるようにしましょう。

useController

公式文書のquick startの紹介では、react-hook-formではregisterを通じてinputを使用することになっています。

しかし、react-hook-formが非制御コンポーネント方式であるだけに、通常制御コンポーネント方式を使用するUIライブラリであるMUIと相互利用するには、曖昧な部分がありました。

そのため、react-hook-formではControllerというものを提供しています。
公式文書でも示されていますが、再利用可能なcontrolled inputを作成するのに便利です。

公式文書の例を見る

例を先に見てみると、InputコンポーネントのpropsでFormValues typeを渡していることがわかります。
つまり、TypeScriptでそのコンポーネントを実装するには、次のような構成にする必要がありました。

スクリーンショット 2022-12-16 16.51.17.png

しかし、このように構成すれば、再利用性があるとはいえません。
毎回 form によってそれぞれ Input コンポーネントを作成して FormValues を渡さなければならないからです。

これを解決するために、Typescriptのジェネリックを活用する必要がありそうでした。
一度UseControllerPropsがどのように宣言されているかを確認してみましょう。

再利用可能にする

スクリーンショット 2022-12-16 16.52.38.png

必要なタイプを見つけたので、今、対応するTypeをインポートします。

スクリーンショット 2022-12-16 16.53.34.png

作成したコンポーネントの使用

スクリーンショット 2022-12-16 16.54.56.png

useControllerを活用すると、直接Controllerで包むよりもコードの読みやすさが良くなりました。

register の代わりにcontroller を活用すれば、 rules を除いた error に対するハンドリングも、あえて form を使用するコンポーネントで作成する必要がなくなりました。

nameとcontrolを渡してあげれば、UIコンポーネントの入力も取得できました。

スクリーンショット 2022-12-16 16.55.25.png

結果

validationも正常に動作し、submit関数もよく実行されることがわかります。

スクリーンショット 2022-12-16 16.56.22.png

スクリーンショット 2022-12-16 16.56.27.png

これらでコンポーネントを作成するプロセスが完了です。
あとはstorybookでテストしてみました。
みなさんもぜひ試してみてください。

5
0
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
5
0