国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

ホームページ ウェブフロントエンド jsチュートリアル DiscrixUnion と React Hook Form を使用した動的フォーム

DiscrixUnion と React Hook Form を使用した動的フォーム

Dec 24, 2024 am 03:41 AM

Dynamic forms with discriminatedUnion and React Hook Form

フォーム検証は、最新の Web アプリケーションの重要な側(cè)面です。 React Hook Form (RHF) や Zod などのライブラリを使用すると、支払い方法などの複雑な構(gòu)造を含む動的フォームを効率的に検証できます。この記事では、Zod と RHF の両方を使用して、強(qiáng)力な DiscrixUnion を使用して動的にフォームを検証する方法について説明します。

DistributedUnion とは何ですか?

DistributedUnion は、構(gòu)造が異なるものの、共通の識別フィールドを共有するオブジェクトをモデル化するために使用される高度な型指定手法です。この判別フィールドは、どのサブタイプが使用されているかを識別し、それに応じて検証または操作を?qū)g行するために使用されます。
たとえば、次の 3 種類の支払い方法を含む支払いフォームを考えてみましょう。

  1. クレジット カード (カード番號と CVV が必要です)
  2. PayPal (メールアドレスが必要です)
  3. 銀行振込 (口座番號と銀行コードが必要です)。 これらの型はそれぞれ、discricedUnion を使用してモデル化できます。 Zod を使用したデータモデリングの例
import * as zod from "zod"

const IsNotEmptyString = (message: string) => zod.string({message}).min(1, {message})


export enum PaymentMethodEnum {
   CREDIT_CARD ="creditCard", 
   PAYPAL = "paypal", 
   BANKTRANSFER ="bankTransfer"
}

  const creditCardSchema = zod.object({
   type: zod.literal(PaymentMethodEnum.CREDIT_CARD),
   cardNumber: zod.string().regex(/^\d{16}$/, "The card number must contain 16 digits"),
   cvv: zod.string().regex(/^\d{3}$/, "The Card Validation Code must contain 3 digits"),
 })

 const paypalSchema =  zod.object({
   type: zod.literal(PaymentMethodEnum.PAYPAL),
   email: zod.string().email("PayPal email is invalid"),
 })

 const bankTransferSchema =  zod.object({
   type: zod.literal(PaymentMethodEnum.BANKTRANSFER),
   accountNumber: IsNotEmptyString("The account number must contain at least 10 characters"),
   bankCode: IsNotEmptyString("The bank code must contain at least 4 characters")
 })

export const paymentMethodSchema =  () => zod.discriminatedUnion("type",[
   creditCardSchema, paypalSchema,bankTransferSchema
]); 

export type PaymentMethodSchemaType = zod.infer < ReturnType <typeof paymentMethodSchema>>

**

検証はどのように機(jī)能しますか?

**

  1. discriminatedUnion は type フィールドを検査します:

    • タイプが「creditCard」の場合、Zod は次に従って検証します。 最初のオブジェクトで定義された制約。
    • タイプが「paypal」の場合、リンクされているルールのみをチェックします PayPal オブジェクトに送信します。
    • タイプが「bankTransfer」の場合、次に従って検証されます。 銀行振込の基準(zhǔn)
  2. 厳密な検証:

    • 各タイプは獨(dú)立しています。ユーザーの場合 無効なタイプが指定されているか、必須フィールドが省略されています。 Zod は特定のエラーをトリガーします。
  3. React フック フォームのシンプルさ:

    • スキーマにより、RHF は検証を動的に適応させることができます type フィールドに従って、ロジックを簡素化します。 フォーム。

**

なぜここで DiscrixUnion を使用するのでしょうか?

**

  1. 責(zé)任の明確な分離
    • 各支払い方法に特有の禁止事項 互いに干渉し合い、干渉し合います。
  2. 柔軟性
    • 新しいタイプを許可します (新しい支払いなど) メソッド)を簡単に追加できます。タイプ (新しい支払い方法など)。
  3. セキュリティ
    • 無効な値が検出されることを確認(rèn)します。 検証時間。

**

Reactフックフォームとの統(tǒng)合

**
React Hook Form を使用すると、高パフォーマンスと柔軟性を維持しながら、フォームの管理が容易になります。ここでは、Zod と RHF を統(tǒng)合して、distributedUnion に基づいてフォームを検証する方法を説明します。

import { useForm, SubmitHandler, FieldErrors } from 'react-hook-form';
import { zodResolver } から '@hookform/resolvers/zod';
'./payment.css' をインポートします。
輸入 {
  PaymentMethodEnum、
  PaymentMethodスキーマ、
  PaymentMethodSchemaType、
'../validators/validate-payment-schema' から;

const 支払い = () => {
  const form = useForm<PaymentMethodSchemaType>({
    リゾルバー: zodResolver(paymentMethodSchema())、
    デフォルト値: {
      タイプ: PaymentMethodEnum.CREDIT_CARD、
    }、
  });

  const {レジスタ、フォームステート、ハンドルサブミット} = フォーム;

  const {エラー} = formState;

  constpaymentType = form.watch().type;

  const handleChangePaymentType = (タイプ: PaymentMethodEnum) => {
    form.setValue('タイプ', タイプ);
  };

  const handleResetForm = () => {
    form.reset(GetErrorState(paymentType));
  };

  const onSubmit: SubmitHandler<paymentmethodschematype> = (データ) => {
    console.log('データ', データ);
  };

  const PaymentTypeFormNode: React.ReactNode = (() => {
    スイッチ (支払いタイプ) {
      ケース PaymentMethodEnum.BANKTRANSFER:
        const BankTransferErrors = getErrorsByPaymentType(errors,paymentType);

        戻る (
          <div>
            <div className="フォーム">
              <label>口座番號</label>
              
              {bankTransferErrors?.accountNumber?.message && (
                <スパンクラス名="エラーメッセージ">
                  {bankTransferErrors.accountNumber.message}
                </span>
              )}
            </div>

            <div className="フォーム">
              <label>銀行コード</label>
              
              {bankTransferErrors?.bankCode?.message && (
                <スパンクラス名="エラーメッセージ">
                  {bankTransferErrors.bankCode.message}
                </span>
              )}
            </div>
          </div>
        );

      ケース PaymentMethodEnum.CREDIT_CARD:
        const CreditCardErrors = getErrorsByPaymentType(errors,paymentType);
        戻る (
          <div>
            <div className="フォーム">
              <label>カード番號</label>
              
              {creditCardErrors?.cardNumber && (
                <スパンクラス名="エラーメッセージ">
                  {creditCardErrors.cardNumber.message}
                </span>
              )}
            </div>

            <div className="フォーム">
              <label>CVV</label>
              
              {creditCardErrors?.cvv && (
                <スパンクラス名="エラーメッセージ">
                  {creditCardErrors.cvv.message}
                </span>
              )}
            </div>
          </div>
        );

      PaymentMethodEnum.PAYPAL の場合:
        const paypalErrors = getErrorsByPaymentType(errors,paymentType);
        戻る (
          <div className="フォーム">
            <label>メール</label>
            
            {paypalErrors?.email?.message && (
              <span className="errormessage">{paypalErrors.email.message}</span>
            )}
          </div>
        );

      デフォルト:
        新しいエラーをスロー(
          「徹底的なガード エラー: 値を受け取りました」paymentType
        );
    }
  })();

  戻る (
    <form className="form-wrapper" onSubmit={handleSubmit(onSubmit)}>
      <div className="フォーム">



<p>**</p>

<h2>
  
  
  結(jié)論
</h2>

<p>**<br>
それで皆さん。この記事がお役に立てば幸いです。 DiscrixUnion は、さまざまな方法で使用できるユーティリティ タイプです。 DiscrixUnion を使用する方法が他にもあると思われる場合は、コメントでお知らせください。この記事をお読みいただきありがとうございます。次の記事でお會いしましょう?</p>

<p>テスト アプリケーションのリンク: <br>
https://stackblitz.com/edit/vitejs-vite-ppgw9zrb?file=src/pages/payments.tsx</p>


          

            
        </paymentmethodschematype>

以上がDiscrixUnion と React Hook Form を使用した動的フォームの詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國語 Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中國語版

SublimeText3 中國語版

中國語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Java vs. JavaScript:混亂を解消します Java vs. JavaScript:混亂を解消します Jun 20, 2025 am 12:27 AM

JavaとJavaScriptは異なるプログラミング言語であり、それぞれ異なるアプリケーションシナリオに適しています。 Javaは大規(guī)模なエンタープライズおよびモバイルアプリケーション開発に使用されますが、JavaScriptは主にWebページ開発に使用されます。

JavaScriptコメント:短い説明 JavaScriptコメント:短い説明 Jun 19, 2025 am 12:40 AM

JavaScriptcommentsEareEssentialential-formaining、およびGuidingCodeexecution.1)single-linecommentseared forquickexplanations.2)多LinecommentsexplaincomplexlogiCorprovidededocumentation.3)clarifyspartsofcode.bestpractic

JSで日付と時間を操作する方法は? JSで日付と時間を操作する方法は? Jul 01, 2025 am 01:27 AM

JavaScriptで日付と時間を処理する場合は、次の點(diǎn)に注意する必要があります。1。日付オブジェクトを作成するには多くの方法があります。 ISO形式の文字列を使用して、互換性を確保することをお勧めします。 2。時間情報を取得および設(shè)定して、メソッドを設(shè)定でき、月は0から始まることに注意してください。 3.手動でのフォーマット日付には文字列が必要であり、サードパーティライブラリも使用できます。 4.ルクソンなどのタイムゾーンをサポートするライブラリを使用することをお勧めします。これらの重要なポイントを習(xí)得すると、一般的な間違いを効果的に回避できます。

なぜの下部にタグを配置する必要があるのですか? なぜの下部にタグを配置する必要があるのですか? Jul 02, 2025 am 01:22 AM

PLACSTHETTHETTHE BOTTOMOFABLOGPOSTORWEBPAGESERVESPAGESPORCICALPURPOSESESFORSEO、userexperience、andDesign.1.IthelpswithiobyAllowingseNStoAccessKeysword-relevanttagwithtagwithtagwithtagwithemaincontent.2.iTimrovesexperiencebyepingepintepepinedeeping

JavaScript vs. Java:開発者向けの包括的な比較 JavaScript vs. Java:開発者向けの包括的な比較 Jun 20, 2025 am 12:21 AM

javascriptispreferredforwebdevelopment、whilejavaisbetterforlge-scalebackendsystemsandroidapps.1)javascriptexcelsininintingtivewebexperiences withitsdynAmicnature anddommanipulation.2)javaofferstruntypyping-dobject-reientedpeatures

JavaScript:効率的なコーディングのためのデータ型の調(diào)査 JavaScript:効率的なコーディングのためのデータ型の調(diào)査 Jun 20, 2025 am 12:46 AM

javascripthassevenfundamentaldatypes:number、string、boolean、undefined、null、object、andsymbol.1)numberseadouble-precisionformat、有用であるため、有用性の高いものであるため、but-for-loating-pointarithmetic.2)ストリングリムムット、使用率が有用であること

DOMでのイベントの泡立ちとキャプチャとは何ですか? DOMでのイベントの泡立ちとキャプチャとは何ですか? Jul 02, 2025 am 01:19 AM

イベントキャプチャとバブルは、DOMのイベント伝播の2つの段階です。キャプチャは最上層からターゲット要素までであり、バブルはターゲット要素から上層までです。 1.イベントキャプチャは、AddEventListenerのUseCaptureパラメーターをTrueに設(shè)定することにより実裝されます。 2。イベントバブルはデフォルトの動作であり、UseCaptureはfalseに設(shè)定されているか、省略されます。 3。イベントの伝播を使用して、イベントの伝播を防ぐことができます。 4.イベントバブルは、動的なコンテンツ処理効率を改善するためにイベント委任をサポートします。 5.キャプチャを使用して、ロギングやエラー処理など、事前にイベントを傍受できます。これらの2つのフェーズを理解することは、タイミングとJavaScriptがユーザー操作にどのように反応するかを正確に制御するのに役立ちます。

JavaScriptアプリケーションのペイロードサイズをどのように削減できますか? JavaScriptアプリケーションのペイロードサイズをどのように削減できますか? Jun 26, 2025 am 12:54 AM

JavaScriptアプリケーションがゆっくりとロードされ、パフォーマンスが低い場合、問題はペイロードが大きすぎることです。ソリューションには、次のものが含まれます。1。コード分割(コードスプリッティング)を使用し、React.lazy()またはビルドツールを介して大きなバンドルを複數(shù)の小さなファイルに分割し、最初のダウンロードを減らすために必要に応じてロードします。 2。未使用のコード(Treeshaking)を削除し、ES6モジュールメカニズムを使用して「デッドコード」をクリアして、導(dǎo)入されたライブラリがこの機(jī)能をサポートしていることを確認(rèn)します。 3.リソースファイルを圧縮してマージし、GZIP/BrotliとTerserがJSを圧縮できるようにし、ファイルを合理的にマージし、靜的リソースを最適化します。 4.頑丈な依存関係を交換し、day.jsやフェッチなどの軽量ライブラリを選択します

See all articles