'ReactHookForm'그룹 schema로 Form 만들기
14808 단어 React Hook Formyuptech
ReactHookForm
과yup
의schema로 표를 만드는 방법.yup
라고 썼지만 zod
도 같은 일을 할 수 있을 거예요.샘플 코드 여기 있습니다.
https://github.com/iteduki/
ReactHookForm
-book-example이 글의 전제는
ReactHookForm
의 기본적인 용법을 아는 것이다.ReactHookForm과 Yup의 조합입니다.
ReactHookForm
에서 사용resolvers
은 모델을 바탕으로 검증할 수 있다사용 방법은 npm 창고의 QuickStart와 같이
useForm
의 옵션만 제공resolver: yupResolver(schema)
.const { register, handleSubmit } = useForm({
resolver: yupResolver(schema),
});
분할schema
Yup.object()
자체적으로 펼칠 수 없지만 대상의 필드를 yup
에 정의된 모드로 설정하면 각 모드를 펼쳐서 하나의 모드를 만들 수 있습니다.구체적인 코드는 다음과 같다.
const userNameSchema = {
name: Yup.string().required('名前を入力してください')
}
const userEmailSchema = {
email: Yup.string().required('メールアドレスを入力してください')
}
const schema = Yup.object({
...userNameSchema,
...userEmailSchema
})
이렇게 분할 모드를 통해 모드를 가진 각 구성 요소를 조합하여 표를 만들 수 있다.예를 들어 어떤 형식에서 이름만 있으면 schema는 위
userNameSchema
만 포함하면 된다.schema로 틀을 만들다
yup
정의된 패턴에 따라 몰드 제작 가능const userNameSchema = {
name: Yup.string().required('名前を入力してください')
}
const yupObject = Yup.object(userNameSchema)
type UserNameFormValues = Yup.InferType<typeof yupObject>
// => type UserNameFormValues = { name: string }
string
이외에 number
,boolean
,array
,required
등도 표시할 수 있다.안 하면
string | undefined
여기서 생성할 수 있는 유형과ReactHookForm
를 조합하여 검증형 폼을 만든다.형식적으로 만들기name
ReactHookForm
에서 제공한 Path
형식의 수신 형식 형식과 유효한 필드 이름의 상수 형식을 되돌려줍니다.import type { Path } from 'react-hook-form'
type NameType = Path<{ firstName: string; lastName: string; }>
// => type NameType = 'firstName' | 'lastName'
type UserNameType = Path<{ users: { firstName: string; lastName: string }[] }>
// => type UserNameType = "users" | `users.${number}` | `users.${number}.firstName` | `users.${number}.lastName`
는 수조와 대상을formname
의 유형으로 설정할 수 있다.이것을 이용하여 input
name
속성을 검증할 수 있는 구성 요소를 만듭니다.TextInput
코드를 먼저 업로드합니다.
import type { InputHTMLAttributes } from 'react'
import type { FieldValues, Path } from 'react-hook-form'
import { useFormContext } from 'react-hook-form'
export interface TextInputProps<T> extends Omit<InputHTMLAttributes<HTMLInputElement>, 'name'> {
name: Path<T>
}
export const TextInput = <T extends FieldValues = never>({
name,
...props
}: TextInputProps<T>): ReturnType<React.VFC> => {
const { register } = useFormContext()
return <input type="text" {...register(name)} {...props} />
}
방금 Path<T>
에서 제작한 name
TextInput 구성 요소만 받습니다.Path
와 함께 importFieldValues
은 useForm
의 유형 매개 변수와 같은 유형이고 실체는Record<string, any>
이다.기본값은 never
입니다. 유형을 지정하지 않으면 오류가 발생합니다.const userNameSchema = {
firstName: Yup.string().required('名前を入力してください')
lastName: Yup.string().required('姓を入力してください')
}
const yupObject = Yup.object(userNameSchema)
type UserNameFormValues = Yup.InferType<typeof yupObject>
export const UserName: React.VFC = () => {
return (
<>
<TextInput<UserNameFormValues> name="lastName">
<TextInput<UserNameFormValues> name="firstName">
</>
)
}
와 방금name
의 패턴을 조합하면 이런 느낌이 든다.지정되지 않은 유형에 포함된
name
를 입력하면 오류가 발생하여 name
의 입력을 방지할 수 있습니다.이렇게 하면 조합
yup
의 모델과 이로 인해 발생하는 유형과ReactHookForm
가 제공하는 유형을 통해 형식적인 형식 개발을 할 수 있다.모드는 모든 구성 요소가 닫혀 있기 때문에 구성 요소 단위로 조합하거나 테스트할 수 있습니다.
Reference
이 문제에 관하여('ReactHookForm'그룹 schema로 Form 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/mistolteen/articles/81fc5236c21ba4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)