Closed4

Chakra UIのRadio GroupをReact Hook Form x Yupでバリデーションを効かせながら実装する

mu-sukemu-suke

ゴール

  • Chakra UIのRadio GroupをReact Hook Formで状態管理しながら利用できること

課題点

  • forwardRefの仕組みがわかっていない
  • 型パズルが解けない

環境

ツール・ライブラリ 用途 バージョン
React フロントエンドのJSライブラリ 18.2.0
React Hook Form フォームバリデーションライブラリ 7.33.1
@hookform/resolvers 外部の検証ライブラリを使用する際に利用 2.9.6
yup JSスキーマビルダー 0.32.11
node.js フロント、サーバーサイドの実行環境 v16.14.0

参考資料

https://github.com/react-hook-form/react-hook-form/discussions/4591

https://codesandbox.io/s/chakra-ui-react-hook-form-custom-radio-forked-xve7r?file=/src/Toggle.js

https://chakra-ui.com/docs/components/radio/usage

mu-sukemu-suke

以下のコードを真似して書いたがtsで書いているので型が合わないという旨の警告が表示された

import { Box, Button, useRadio } from '@chakra-ui/react'
import React, { forwardRef } from 'react'

type InputProps = JSX.IntrinsicElements['input']

const GenderRadio = forwardRef<HTMLInputElement, InputProps>(
  ({ ...props }, ref) => {
    const { state, getInputProps, getCheckboxProps } = useRadio(props)
    const input = getInputProps({ ref })
    const checkbox = getCheckboxProps()

    return (
      <Box as="label">
        <input {...input} />
        <Button
          as="div"
          {...checkbox}
          cursor="pointer"
          colorScheme={state.isChecked ? 'red' : 'gray'}
        >
          ボタンです
        </Button>
      </Box>
    )
  }
)
GenderRadio.displayName = 'GenderRadio'

export default GenderRadio

TS2345: Argument of type '{ ref?: LegacyRef<HTMLInputElement> | undefined; key?: Key | null | undefined; accept?: string | undefined; alt?: string | undefined; autoComplete?: string | undefined; ... 282 more ...; onTransitionEndCapture?: TransitionEventHandler<...> | undefined; }' is not assignable to parameter of type 'UseRadioProps'.   Types of property 'value' are incompatible.     Type 'string | number | readonly string[] | undefined' is not assignable to type 'string | number | undefined'.       Type 'readonly string[]' is not assignable to type 'string | number | undefined'.

https://codesandbox.io/s/chakra-ui-react-hook-form-custom-radio-forked-xve7r?file=/src/Toggle.js

mu-sukemu-suke

型アサーションで無理やり解決させたけどこれで良いのか感が強い

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