Yup と Formik を使用して React Forms でインライン文字制限検証を実装する

Validation

Formik Forms での文字数制限のインライン検証をマスターする

でのフォームの操作 特に次のようなライブラリを使用する場合、正確な検証ルールの管理が必要になることがよくあります。 そして 。開発者が直面する一般的なシナリオの 1 つは、説明やテキスト領域を 250 文字に制限するなど、入力フィールドに文字制限を設定することです。

最大文字数制限を追加するのは簡単そうに見えますが、その制限を超えた場合にインライン検証エラーを有効にすることは課題を引き起こす可能性があります。たとえば、maxLength などの標準の HTML プロパティでは、ユーザーが制限を超えて入力することはできませんが、これは回避されます。 、エラー メッセージをトリガーするには 251 番目の文字を登録する必要があります。

このような状況では、入力のブロックとリアルタイムのフィードバックの提供の間で適切なバランスをとるのが難しい場合があります。追加の制限を設定したり、フィールド ブラー イベントに依存したりするなどの回避策を使用すると、多くの場合、エラー処理の応答性が低下したり、直感的ではなくなったりします。

このガイドでは、依存せずに即時のインライン検証を実現する方法を検討します。 最大長さ。を使用することで と では、文字制限を超えたときにライブ エラー メッセージを表示するカスタム検証ルールを有効にし、ユーザーにシームレスなエクスペリエンスを提供します。 🚀

指示 使用例
setFieldValue Formik の特定のフォーム フィールドの値をプログラムで更新するために使用されます。ここでは、文字が入力されると説明フィールドが動的に更新され、リアルタイムの文字カウントが可能になります。
setFieldTouched このコマンドは、フォームフィールドの「タッチされた」状態を手動で設定します。このスクリプトでは、文字数が 250 を超えるとトリガーされ、ユーザーが入力フィールドをぼかすことなく、Yup 検証フィードバックが可能になります。
validationSchema Yes 検証ルールを Formik に指定します。ここでは、descriptionValidation スキーマをフォームの構成に直接統合することで、250 文字の制限を適用しています。
Yup.string().max() 文字列の最大長制約を定義するための Yup 検証方法。このスクリプトでは、説明フィールドを 250 文字に制限し、それを超えるとエラーが表示されます。
ErrorMessage 検証が失敗した場合に、Formik にインライン エラー メッセージを表示します。ここでは、Formik のエラー処理を使用して、文字制限を超えた場合にすぐにメッセージを表示します。
inputProps マテリアル UI の TextField の追加属性を定義します。このコマンドは、最大行数や文字制限などのプロパティを設定し、フィールドの動作や表示に影響を与えます。
express.json() 受信した JSON ペイロードを解析する Express.js のミドルウェア。バックエンド検証スクリプトでは、このコマンドによりサーバーが req.body 内の JSON データを解析して処理できるようになります。
descriptionSchema.validate() サーバー側で Yup 検証ルールを適用します。バックエンド スクリプトでは、受信データを文字制限制約と照合してチェックし、検証の成功または失敗に基づいて応答を送信します。
helperText フィールドの下にカスタム ヘルパー メッセージを許可する TextField のマテリアル UI プロパティ。この場合、残りの文字数または検証エラーが表示され、ユーザー エクスペリエンスが向上します。
ErrorMessage component="div" Formik でのエラー メッセージのレンダリングをカスタマイズするために使用されます。このコマンドを div に設定すると、検証メッセージの形式と外観が制御されます。

リアルタイム フィードバックのための Formik と Yup を使用したインライン検証の実装

ここで提供される React スクリプトは、Formik フォーム内の文字制限されたテキスト フィールドでリアルタイムのインライン検証を実現することを目的としています。このセットアップでは、 フォームの取り扱いが簡単になるため、 検証スキーマを定義します。主な課題は、maxLength などの標準の HTML 入力属性により、ユーザーが文字制限を直接超えることができなくなり、Yup の検証をトリガーすることが制限されるという事実にあります。そこで代わりに、プログラムで文字数をチェックし、Formik の 制限を超えた場合のステータス。このアプローチにより、ユーザーはフィールドから離れるのを待つのではなく、251 文字に到達した瞬間に検証メッセージを表示できるようになります。 🚀

最初のスクリプトは、Formik の そして コマンドは入力の動作を制御するために使用されます。ここで、ユーザーが入力すると、Formik の onChange ハンドラーが動的に更新します。 文字数が 250 を超えると、setFieldTouched がトリガーされてフィールドが「タッチ済み」としてマークされ、Yup の検証がアクティブになり、エラー メッセージがインラインで表示されます。この即時フィードバックは、ユーザーにすぐに通知を確実に提供し、使いやすさを向上させ、エラーを減らすために非常に重要です。オンライン申請書に記入するところを想像してみてください。送信エラーを待たずに回答を編集する必要があるかどうかが即座にフィードバックされるため、すぐにわかります。 👍

2 番目の方法では、プログラムによる文字数の検証のみに依存して、maxLength 属性を完全に削除します。このバージョンでは、onChange イベント ハンドラーが積極的な役割を果たし、文字数が 250 以下の場合にフィールド値が正常に更新されるようにします。入力が 251 文字のしきい値に達した場合、入力は余分な文字をブロックせず、代わりにフィールドにタッチ済みのフラグを立てます。これにより、ハード制限のないシームレスな入力エクスペリエンスが維持され、オーバーフローを処理するよりソフトな方法が提供されます。 helperText はライブ文字カウンターとしても機能し、ユーザーが入力中に残りの文字を追跡できるようにします。これは、ソーシャル メディアのプロフィールやメッセージ ボックスなど、文字制限が厳しい場合に非常に役立ちます。

最後に、バックエンド ソリューションは Express と Yup を利用してサーバー側で入力の長さを検証します。これは、セキュリティを強化したり、API エンドポイントを操作するときに役立ちます。サーバーは受信した JSON データを解析し、Yup スキーマに対して検証し、検証の成功を確認するか、エラー メッセージで応答します。この検証層は、クライアント側のチェックがバイパスされる可能性のあるケースを防ぐのに役立ち、入力元に関係なく 250 文字を超える入力がないことが保証されます。フロントエンドとバックエンドの両方で階層化検証を使用することは、バイパス試行に対する回復力を提供するため、安全なアプリケーション開発のベスト プラクティスであり、運用環境に最適です。こうすることで、クライアント側の検証がアクティブ化されなかったり、回避されたりした場合でも、バックエンドがエラーを捕捉して処理し、データの整合性を保護します。

Formik、Yup、TypeScript を使用して React フォームにインライン検証を実装する

解決策 1: フロントエンド フォームに反応して文字数制限を検証する

import React from 'react';
import { Field, Formik, Form, ErrorMessage } from 'formik';
import * as Yup from 'yup';
import TextField from '@material-ui/core/TextField';
// Define the validation schema with Yup, setting max length
const descriptionValidation = Yup.string()
  .max(250, 'Description cannot exceed 250 characters')
  .optional();
// Function component
const DescriptionForm = () => {
  return (
    <Formik
      initialValues={{ description: '' }}
      validationSchema={Yup.object({ description: descriptionValidation })}
      onSubmit={(values) => console.log('Submitted', values)}
    >
      {({ errors, touched, setFieldValue, setFieldTouched }) => (
        <Form>
          <Field
            as={TextField}
            name="description"
            label="Description"
            multiline
            rows={4}
            placeholder="Optional"
            error={Boolean(errors.description && touched.description)}
            helperText={
              errors.description && touched.description
                ? errors.description
                : 'Limit: 250 characters'
            }
            onChange={(event) => {
              const { value } = event.target;
              setFieldValue('description', value);
              if (value.length > 250) {
                setFieldTouched('description', true);
              }
            }}
          />
          <ErrorMessage name="description" component="div" className="error" />
        </Form>
      )}
    </Formik>
  );
};
export default DescriptionForm;

maxLength プロパティを使用しない代替インライン検証

解決策 2: 入力をブロックせずに手動の文字長検証に対応する

import React from 'react';
import { Field, Formik, Form, ErrorMessage } from 'formik';
import * as Yup from 'yup';
import TextField from '@material-ui/core/TextField';
// Yup schema for 250-character limit
const descriptionValidation = Yup.string()
  .max(250, 'Description cannot exceed 250 characters')
  .optional();
// Component definition
const DescriptionForm = () => {
  return (
    <Formik
      initialValues={{ description: '' }}
      validationSchema={Yup.object({ description: descriptionValidation })}
      onSubmit={(values) => console.log('Form Submitted:', values)}
    >
      {({ errors, touched, setFieldValue, setFieldTouched, values }) => (
        <Form>
          <TextField
            name="description"
            label="Description"
            multiline
            rows={4}
            placeholder="Optional"
            value={values.description}
            error={Boolean(errors.description && touched.description)}
            helperText={
              errors.description && touched.description
                ? errors.description
                : `Characters left: ${250 - values.description.length}`
            }
            onChange={(event) => {
              const { value } = event.target;
              if (value.length <= 250) {
                setFieldValue('description', value);
              } else {
                setFieldTouched('description', true);
              }
            }}
          />
          <ErrorMessage name="description" component="div" className="error" />
        </Form>
      )}
    </Formik>
  );
};
export default DescriptionForm;

Express.js を使用したバックエンド検証と文字制限の可能性

解決策 3: Express および Yup で Node.js を使用したバックエンド検証

const express = require('express');
const app = express();
const Yup = require('yup');
// Middleware for JSON parsing
app.use(express.json());
// Define Yup schema
const descriptionSchema = Yup.object().shape({
  description: Yup.string()
    .max(250, 'Description cannot exceed 250 characters')
    .optional(),
});
// POST route with validation
app.post('/submit', async (req, res) => {
  try {
    await descriptionSchema.validate(req.body);
    res.status(200).json({ message: 'Validation Passed' });
  } catch (error) {
    res.status(400).json({ error: error.message });
  }
});
// Server setup
app.listen(3000, () => console.log('Server running on port 3000'));

Formik と React でのインライン検証手法の拡張

React で Formik と Yup を使用してインライン検証を実装する場合、標準の onChange 検証に代わる 1 つの方法は、カスタム デバウンス関数を使用することです。入力をデバウンスすることで、ユーザーが一定時間入力を停止するまで検証チェックを遅らせることができ、よりスムーズなエクスペリエンスを実現します。これにより、検証エラーが早すぎたり予期せず発生したりするのを防ぐことができ、ユーザーが文字数制限の高いフィールドに長い応答を入力する場合に特に役立ちます。デバウンスされた onChange を使用することで、開発者は不必要な検証を減らすことができ、両方の機能を向上させることができます。 特に低速のデバイスや大きなフォームでのユーザー エクスペリエンス。長いフォームに詳細を入力し、一時停止した後に初めてエラー メッセージが表示されることを想像してみてください。これで気が散ることははるかに少なくなります。

もう 1 つのアプローチには、Formik の利用が含まれます。 それぞれに独自の文字数制限があるコメントやメモのリストなど、同様の検証が必要になる可能性がある動的フィールドの場合。 FieldArray を使用すると、各入力が独自の独立した文字カウンターと検証状態を維持できるため、複雑なフォームが簡素化されます。 Formik のツールを使用して、リアルタイム検証メッセージを表示するように各フィールドを設定できます。 そしてYupの最大バリデーター。たとえば、ユーザーが複数の短いメモを追加する必要がある場合、FieldArray を使用すると、各エントリに検証制限を簡単に適用して管理でき、各メモに固有のインライン エラーが表示されます。

場合によっては、Formik の検証をネイティブ JavaScript メソッドと組み合わせることで、さらに詳細な制御が可能になります。たとえば、 JavaScript のメソッドを使用すると、検証がトリガーされる前に入力テキストを必要な長さに動的にトリミングできます。この方法は、ツイートや SMS の長さのテキスト メッセージの入力を制限する場合など、入力が正確な基準を満たすことが重要な場合に非常に役立ちます。 Formik と部分文字列などの JavaScript 関数を組み合わせることで、開発者はユーザー エクスペリエンスとデータの整合性の両方を制御するための幅広いオプションを利用できるようになり、手動で編集したりフォームをリセットしたりすることなく、テキストを常に許容範囲内に収めることができます。

  1. 主な使用目的は何ですか はい、検証のためですか?
  2. Formik と Yup を組み合わせると、特に大規模なフォームや複雑な検証ニーズがあるフォームの場合、React アプリケーションでのフォームの処理と検証が簡素化されます。 Formik はフォームの状態を管理し、Yup は検証スキーマを処理します。
  3. どのようにして とは異なります フォーミックで?
  4. フィールドの「タッチ済み」ステータスを更新し、検証目的で操作されたものとしてマークします。 フィールドの値を直接更新します。これらを組み合わせると、検証がいつどのように行われるかを管理するのに役立ちます。
  5. 両方のネイティブを使用できますか はい、検証ですか?
  6. maxLength を使用すると、フロントエンドでの入力長が制限されますが、Yup の検証がインライン エラーに対してトリガーされなくなる可能性があります。インライン検証が必要な場合は、maxLength を削除し、代わりに Formik の onChange ハンドラーを使用して Yup に依存することを検討してください。
  7. なぜ使用するのか Formik での検証はありますか?
  8. 開発者は、複数のフィールドが同様の検証ルールに従う動的フォームを処理できるため、各エントリに特定の要件があるコメントやタグなどのアイテムのリストに最適です。
  9. デバウンス関数とは何ですか?また、それを Formik 検証で使用する理由は何ですか?
  10. デバウンスは、ユーザーが入力を一時停止するまで検証を遅らせ、過剰な検証呼び出しを減らす手法です。これは特に長いテキスト フィールドに役立ち、ユーザーの注意をそらす可能性のある時期尚早な検証メッセージを防ぐことができます。
  11. Yup を使用して複数のフィールドを検証するためのベスト プラクティスは何ですか?
  12. うん、使ってね そして スキーマを使用して複雑な検証を定義し、カスタム エラー メッセージを適用して、どのフィールドが要件を満たしていないのかを明確にします。
  13. 残りの文字をユーザーに動的に表示するにはどうすればよいですか?
  14. 使用する マテリアル UI の TextField コンポーネントでは、リアルタイムの文字数表示が可能です。これにより、ユーザーが残りの入力容量を追跡しやすくなり、使いやすさが向上します。
  15. バックエンド検証はフロントエンド検証を Yes に置き換えることができますか?
  16. バックエンド検証はデータの整合性にとって重要ですが、フロントエンド検証はユーザーに即時にフィードバックを提供し、エクスペリエンスを向上させます。データを安全かつユーザーフレンドリーに処理するには、どちらも推奨されます。
  17. 削除するメリットは何ですか インライン検証用の属性?
  18. 削除中 Formik と Yup は検証プロセスを完全に制御できるため、入力長を直接制限することなく、文字制限を超えるとすぐにインライン エラーを表示できます。

Formik と Yup を使用してインライン検証を実装すると、文字制限のあるフィールドに対して、よりスムーズでインタラクティブなユーザー エクスペリエンスが提供されます。取り除くことで そしてFormikを使用して 戦略的には、ユーザーはハード制限に邪魔されることなく即座にフィードバックを得ることができます。この手法は、アプリケーション フォームやバイオ分野などのシナリオに最適です。

このアプローチには柔軟性があり、特定のニーズに合わせてさらにカスタマイズできます。文字制限のインライン検証により、特に複数の文字ベースのフィールドを管理する場合に、データの一貫性とユーザーフレンドリーなエクスペリエンスが保証されます。 Formik、Yup、JavaScript を組み合わせることで、開発者はユーザーに直感的かつ堅牢な検証の両方を提供できます。 🚀

  1. の包括的な概要を提供します。 React での検証処理テクニック。 Formikのドキュメント
  2. 使用方法の詳細 スキーマ検証ツールとして使用でき、特に入力制約の管理に役立ちます。 はい、GitHub リポジトリ
  3. 導入のベストプラクティスについて説明します React を中心とした最新のフロントエンド フレームワークで。 スマッシング マガジン: フォーム検証 UX
  4. Formik を使用して動的フィールド検証を探索します また、それをインラインエラーにどのように適用できるかについても説明します。 ReactJS ドキュメント: フォーム