カスタム React ライブラリを使用したヘッドレスフォームのレンダリング

カスタムコンポーネントを作成および実装して、組織の要件やガイドラインに従ってヘッドレスアダプティブフォームの外観と機能(動作)をカスタマイズできます。

これらのコンポーネントの主な目的は、フォームフィールドの外観やスタイルを制御することと、それらのフィールドを通じて収集されたデータをフォームモデルインスタンス内に格納することです。わかりにくいと思われるかもしれませんが、心配はいりません。これらの目的については、後ほど詳しく説明します。ここでは、カスタムコンポーネントを作成し、それらのコンポーネントを使用してフォームをレンダリングし、イベントを利用してデータの格納と REST エンドポイントへの送信を行う、最初の手順に的を絞ります。

このチュートリアルでは、Google マテリアル UI コンポーネントを使用して、カスタム React コンポーネントを使用したヘッドレスアダプティブフォームのレンダリング方法を説明します。ただし、このライブラリに限定されず、任意の React コンポーネントライブラリを自由に利用したり、独自のカスタムコンポーネントを開発したりできます。

この記事の最後には、スターターキットを使用したヘッドレスフォームの作成と公開の記事で作成した​ お問い合わせ ​フォームは、次のように変わります。

Google マテリアル UI コンポーネントを使用してフォームをレンダリングする主な手順は、次のとおりです。

1. Google マテリアル UI をインストールする

デフォルトでは、スターターキットはアドビの Spectrum コンポーネントを使用しています。これを、Google マテリアル UI を使用するように設定します。

  1. スターターキットが実行中でないことを確認します。スターターキットを停止するには、ターミナルを開き、react-starter-kit-aem-headless-forms に移動して Ctrl + C キーを押します(Windows、Mac および Linux で同じです)。

    ターミナルを閉じようとしないでください。ターミナルを閉じても、スターターキットは停止しません。

  2. 次のコマンドを実行します。


    npm install @mui/material @emotion/react @emotion/styled --force

Google マテリアル UI の npm ライブラリがインストールされ、スターターキットの依存関係にライブラリが追加されます。これで、マテリアル UI コンポーネントを使用して、フォームコンポーネントをレンダリングできるようになりました。

2. カスタム React コンポーネントを作成する

デフォルトのテキスト入力コンポーネントを Google マテリアル UI のテキストフィールドコンポーネントに置き換えるカスタムコンポーネントを作成します。

ヘッドレスフォーム定義で使用されるコンポーネントタイプ(fieldType または :type)ごとに別のコンポーネントが必要です。例えば、前のセクションで作成したお問い合わせフォームでは、Name、Email および Phone の各フィールドは text-input タイプ(fieldType: "text-input")であり、Message フィールドは multiline-input タイプ("fieldType": "multiline-input")です。

fieldType: "text-input" プロパティを使用するすべてのフォームフィールドをマテリアル UI のテキストフィールドコンポーネントでオーバーレイするカスタムコンポーネントを作成しましょう。

そのカスタムコンポーネントを作成し、カスタムコンポーネントを fieldType プロパティにマッピングするには:

  1. コードエディターで react-starter-kit-aem-headless-forms ディレクトリを開き、\react-starter-kit-aem-headless-forms\src\components に移動します。

  2. slider または richtext フォルダーのコピーを作成し、コピーしたフォルダーの名前を materialtextfield に変更します。スライダーとリッチテキストは、スターターアプリで使用できる 2 つのサンプルカスタムコンポーネントです。これらを使用して、独自のカスタムコンポーネントを作成できます。

    VSCode の materialtextfield カスタムコンポーネント

  3. \react-starter-kit-aem-headless-forms\src\components\materialtextfield\index.tsx ファイルを開き、既存のコードを以下のコードに置き換えます。このコードは、Google マテリアル UI のテキストフィールドコンポーネントを返し、レンダリングします。


     import React from 'react';
     import {useRuleEngine} from '@aemforms/af-react-renderer';
     import {FieldJson, State} from '@aemforms/af-core';
     import { TextField } from '@mui/material';
     import Box from '@mui/material/Box';
     import { richTextString } from '@aemforms/af-react-components';
     import Typography from '@mui/material/Typography';


     const MaterialtextField = function (props: State<FieldJson>) {

         const [state, handlers] = useRuleEngine(props);

         return(

         <Box>
             <Typography component="legend">{state.visible ? richTextString(state?.label?.value): ""} </Typography>
             <TextField variant="filled"/>
         </Box>

         )
     }

     export default MaterialtextField;

state.visible の部分では、コンポーネントが表示されるように設定されているかどうかをチェックします。そのように設定されている場合は、フィールドのラベルが richTextString(state?.label?.value) を使用して取得され、表示されます。

カスタムコンポーネント materialtextfield の準備が整いました。fieldType: "text-input" のすべてのインスタンスを Google マテリアル UI のテキストフィールドに置き換えるように、このカスタムコンポーネントを設定しましょう。

3. カスタムコンポーネントをヘッドレスフォームフィールドにマッピングする

サードパーティのライブラリコンポーネントを使用してフォームフィールドをレンダリングするプロセスは、マッピングと呼ばれます。各 (fieldType) を、サードパーティライブラリの対応するコンポーネントにマッピングします。

マッピング関連情報はすべて mappings.ts ファイルに追加されます。mappings.ts ファイル内の ...mappings ステートメントでは、(fieldType または :type) を Adobe Spectrum コンポーネントでオーバーレイするデフォルトのマッピングを参照しています。

最後の手順で作成した materialtextfield コンポーネントのマッピングを追加するには:

  1. mappings.ts ファイルを開きます。

  2. 次の import ステートメントを追加して、materialtextfield コンポーネントを mappings.ts ファイルに含めます。

    code language-javascript
        import MaterialtextField from "../components/materialtextfield";
    
  3. 次のステートメントを追加して、text-input を materialtextfield コンポーネントにマッピングします。

    code language-javascript
        "text-input": MaterialtextField
    

    このファイルの最終コードは次のようになります。

    code language-javascript
          import { mappings } from "@aemforms/af-react-components";
          import MaterialtextField from "../components/materialtextfield";
    
    
          const customMappings: any = {
            ...mappings,
            "text-input": MaterialtextField
         };
         export default customMappings;
    
  4. アプリを保存して実行します。フォームの最初の 3 つのフィールドは、Google マテリアル UI のテキストフィールド を使用してレンダリングされます。

    同様に、Message("fieldType": "multiline-input")フィールド用と Rate the Service フィールド("fieldType": "number-input")用のカスタムコンポーネントを作成することができます。Message フィールドと Rate the Service フィールドのカスタムコンポーネント用に次の Git リポジトリのクローンを作成できます。

    https://github.com/singhkh/react-starter-kit-aem-headless-forms

次の手順

Google マテリアル UI を使用したカスタムコンポーネントでフォームをレンダリングすることに成功しました。「Submit」ボタン(対応する Google マテリアル UI コンポーネントにマッピングされている)をクリックして、フォームを送信してみましたか? まだであれば、まず試してみてください。

フォームはデータを任意のデータソースに送信しますか? そうでなくても、ご心配なく。それは、フォームがランタイムライブラリと通信するように設定されていないからです。

ランタイムライブラリと通信できるようにフォームを設定するには、どうすればよいでしょうか? それをすべて詳しく説明する記事が近日公開予定です。どうぞお楽しみに。

recommendation-more-help
ce8b2828-9203-402e-a565-7b758c99b2ba