質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

317閲覧

複数項目のreact-hook-formのバリデーションエラーで詰まっている

ishidakouiki

総合スコア73

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

1クリップ

投稿2024/04/06 02:55

実現したいこと

・項目1 = hoge1
・項目2 = hoge2
のtextfileがあって、

①送信ボタンをクリックしonSubmitでForm全体の値を送信する
②項目1と項目2のバリデーションが発火
入力内容は、
・項目1は入力されている
・項目2は空

*validatehoge2が発火
hoge2 のtextが赤色になる
下記項目

<Text control={control} name="hoge2" type="text" label="" rules={{ validate: validatehoge2 }} />


修正内容、
・項目1の入力内容を全て削除 => 空
・項目2は空

*validatehoge1のみが発火(hoge1の項目が修正されたので)
hoge2 のtextが赤色が消えない

*実現したいこと
ここでhoge2 のバリデーションも発火させて
hoge2のバリデーションエラーを消したい。

・onchangeでhoge1とhoge2が変更された時、
お互いのvalidateを実行する方法もあるが、
その方法だと、送信ボタンをクリック前にvalidateが発火され
UIにエラー表示が出てしまう。

発生している問題・分からないこと

ーーーーーーーーーーー

エラーメッセージ

error

1ーーーーーーーーーーーーーー

該当のソースコード

index.tsx(親CP)

1<FormProvider {...form}> 2 〜〜〜 3  <hoge/> 4</FormProvider>

hoge.tsx(子コンポーネント)

1export default function hoge() { 2 const { control} = useFormContext(); 3 return ( 4 <> 5 <div> 6 <Label>test</Label> 7 〜〜〜 8 </div> 9 <div spacing={1}> 10 <Label>複数項目</Label> 11 <Text 12 control={control} 13 name="hoge1" 14 type="text" 15 label="" 16 rules={{ validate: validatehoge1 }} 17 /> 18 <Text 19 control={control} 20 name="hoge2" 21 type="text" 22 label="" 23 rules={{ validate: validatehoge2 }} 24 /> 25 </div> 26 ) 27

text.tsx(孫コンポーネント)

1export function Text(props: any): JSX.Element { 2 return ( 3 <Controller 4 name={props.name} 5 control={props.control} 6 rules={props.rules} 7 render={({ field: { onChange, onBlur, value, ref }, fieldState }) => ( 8 <MuiTextField 9 label={props.label} 10 type={props.type} 11 error={fieldState.invalid} 12 helperText={props.helperText} 13 InputProps={props.InputProps} 14 value={value === null ? "" : value} 15 placeholder={props.placeholder} 16 onChange={onChange} 17 onBlur={onBlur} 18 inputRef={ref} 19 /> 20 )} 21 /> 22 ); 23}

validate.ts

1// hoge1のバリデーション 2export function validatehoge1(hoge1: string, form: any): string | undefined { 3 if(!hoge1&& !form.hoge2) { 4 return 5 } 6 if (!hoge1&& form.hoge2) { 7 return "「hoge1を入力してください。"; 8 } 9 if (hoge1&& _hoge1.length > 10) { 10 return "「hoge1の文字数が超えております。10文字以内で入力してください"; 11 } 12} 13 14// hoge2のバリデーション 15export function validatehoge2(hoge2: string , form: any): string | undefined { 16 if(!hoge2&& !form.hoge2) { 17 return 18 } 19 if (!hoge2 && form.hoge2) { 20 return "hoge2を入力してください。"; 21 } 22 if (hoge2 && _hoge2.length > 30) { 23 return "「hoge2の文字数が超えております。10文字以内で入力してください"; 24 } 25}

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

ーーーーーーーーーーー

補足

ーーーーーーーーーーー

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

************自己解決

投稿2024/04/07 13:55

ishidakouiki

総合スコア73

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問