Vue+ElementUI で超大規模なフォーム例を処理する方法

Vue+ElementUI で超大規模なフォーム例を処理する方法

最近、社内の業務調整により、以前の超長文のロジックが大幅に変更されたため、リファクタリングする予定です(退職したバックエンドスタッフが以前書いたもので、コメントはありません。1つのコンポーネントが4,000行以上あり、本当にやる気がありません)。便宜上、プロジェクトを 14 個のコンポーネントに分割して簡素化しました。

全体的なアイデア

  • 大きなフォームはビジネスモジュールごとに分割されます
  • 保存するときに、el-form が提供する検証メソッドを使用して検証します (分割された各コンポーネントをループします)
  • Mixin は各コンポーネントの共通抽出です (後のプロジェクトのメンテナンスにも役立ちます)

始める

ここでは、2つのコンポーネントの分割を例に挙げます: form1、form2 (読者の便宜のため、命名を批判しないでください)

ここで 2 つのコンポーネントがフォーム、ref、model にバインドされている理由は、後で説明します (後のメンテナンスの便宜のため)

// フォーム1 コンポーネント <テンプレート>
    <el-フォーム
      ref="フォーム"
      :model="フォーム"
      ラベル幅="10px"
    >
      <el-form-item label="名前" prop="名前">
          <el-input v-model="フォーム名" />
      </el-form-item>
    </el-form>
</テンプレート>
<スクリプト>
エクスポートデフォルト{
  名前: 'Form1'、
    小道具: {
      形状: {}
  },
  データ() {
    戻る {
      ルール:
        名前: [
          { 必須: true、メッセージ: '名前を入力してください'、トリガー: 'blur' }
        ]
      }
    }
  },
  メソッド: {
    // ここで親コンポーネントをループして検証validForm()を呼び出します。{
        結果 = false とする
        this.$refs.form.validate(有効 => 有効 && (結果 = true))
        結果を返す
    }
    // ここでは別の方法で書きましたが、ループしてチェックするときには Promise オブジェクトになります。問題があります。大物たちが私にアドバイスをくれることを願っています。validForm() {
        // ここでの出力構造は明らかにブール値ですが、親コンポーネントのループ呼び出し後はプロミス型なので、変換する必要があります。 return this.$refs.form.validate().catch(e => console.log(e))
    }
  }
}
</スクリプト>
 
// form2 コンポーネント <テンプレート>
    <el-フォーム
      ref="フォーム"
      :model="フォーム"
      ラベル幅="10px"
    >
      <el-form-item label="年齢" prop="年齢">
          <el-input v-model="form.age" />
      </el-form-item>
    </el-form>
</テンプレート>
<スクリプト>
エクスポートデフォルト{
  名前: 'Form2'、
  小道具: {
      形状: {}
  },
  データ() {
    戻る {
      ルール:
        名前: [
          { 必須: true、メッセージ: '年齢を入力してください'、トリガー: 'blur' }
        ]
      }
    }
  },
  メソッド: {
    // ここで親コンポーネントをループして検証validForm()を呼び出します。{
        結果 = false とする
        this.$refs.form.validate(有効 => 有効 && (結果 = true))
        結果を返す
    }
  }
}
</スクリプト>

親コンポーネントがどのように参照されているかを確認する

// 親コンポーネント <テンプレート>
    <div class="parent">
        <form1 ref="form1" :form="formData.form1" />
        <form2 ref="form2" :form="formData.form2" />
        <el-button type="primary" @click="save">エラー</el-button>
    </div>
</テンプレート>
<スクリプト>
...参照を省略すると、export default {
    名前: '親'、
    ... 登録データを省略する() {
        戻る {
            フォームデータ: {
                フォーム1: {},
                フォーム2: {}
            }
        }
    },
}
</スクリプト>

formData の属性名 form1 と form2 はそれぞれサブフォーム コンポーネントの ref で使用されるため、トラバーサル中に順番に見つけることができ、保存関数を変更できます。コードは次のとおりです。

メソッド: {
    保存 () {
        //各フォーム オブジェクトのキー値、つまり各フォームの参照値 const formKeys = Object.keys(this.formData)
        // 各フォームの検証メソッドを実行します const valids = formKeys.map(item => this.$refs[item].validForm())
        // すべてのフォームが検証に合格した後のロジック if (valids.every(item => item)) {
          コンソール.log(11)
        }
    }
}

ref コンポーネントと model コンポーネントの両方が form にバインドされるのはなぜですか?

  • 比較すると、form1 と form2 には共通の props メソッドがあることがわかります。
  • mixinで抽出してみましょう
エクスポートデフォルト{
  小道具: {
    形状: {
      必須: true、
      タイプ: オブジェクト、
      デフォルト: () => {}
    },
  },
  メソッド: {
    有効なフォーム(){
      結果 = false とする
      this.$refs.form.validate(有効 => 有効 && (結果 = true))
      結果を返す
    }
  }
}

form1 form2 内の minix を参照し、対応するコンポーネント内の対応するプロパティとメソッドを削除します。

結論

  • フォームが大きすぎる問題を解決するのは非常に面倒です。ここではコンポーネントを分割するだけです
  • コンポーネント間の連携も大きな難関です。次回は完成してから投稿します。

Vue+ElementUI が超大型フォームをどのように処理するかについての記事はこれで終わりです。Vue+ElementUI が超大型フォームをどのように処理するかについての詳細は、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vueの基本 ElementUIのフォームの詳しい説明
  • Vue elementUI フォームのネストされたテーブルと各行の検証の詳細な説明
  • フォームから Vue ElementUI を使用してログイン効果を実装する例
  • Vue ElementUI フォームのフォーム検証
  • Vue Element-ui フォーム検証ルールの実装
  • Vue2 での Element UI フォームの使用に関する詳細な説明

<<:  HTMLハイパーリンクaタグのhrefジャンプとonclick間の実行順序の例

>>:  Nginx+ModSecurity セキュリティモジュールの導入

推薦する

発生したブラウザの互換性の問題と解決策(推奨)について

序文:先週の日曜日、先輩から3ページ作るのを手伝って欲しいと頼まれました。データのやり取りなどはなく...

JSONオブジェクトのキーを置き換える最良の方法

JSON (JavaScript Object Notation、JS Object Notatio...

CocosCreatorプロジェクト構造の仕組みの詳細な説明

目次1. プロジェクトフォルダ構造1. アセットフォルダ2. 図書館3. ローカル設定(ローカル) ...

一般的な XHTML タグの紹介

<br />しばらくの間、多くの人が XHTML の使い方を知らないことに気付きました。...

CSS と Bootstrap アイコンを使用して、上下にジャンプするインジケーター矢印のアニメーション効果を作成します。

ページが非常に長い場合は、下にさらにコンテンツがあることをユーザーに知らせるために矢印が必要になるこ...

ビジネス HTML メール作成に関する提案

許可ベースの電子メール マーケティングにより、マーケティングとプロモーションのコストを大幅に削減でき...

Typescriptの基本構文13個を共有する

目次1. Tsとは何か2. 基本的な文法1. プリミティブデータ型を宣言する2. オブジェクト型を宣...

外部ネットワークアクセスを許可するためのMysql5.6の設定手順の詳細を共有する

最近、MySQL 5.6 を導入しましたが、デフォルトでは MySQL はローカル サービスのみを許...

HTML テーブル データを Json 形式に変換するサンプル コード

<table>テーブルデータをJSON形式に変換するJavaScript関数は次のとおり...

Alibaba Cloud Server Linux システムは Tomcat を構築して Web プロジェクトを展開します

私は全体のプロセスを 4 つのステップに分けます。 JDKをダウンロードしてインストールするTomc...

JavaScript のアンチシェイクとスロットリングの違いと実装

目次1. 手ぶれ補正2. スロットリング3. まとめ序文:フロントエンド開発者には、次の 2 つの要...

JavaScript で知らない Object.entries の使い方

目次序文1. 共通オブジェクトを反復処理するには for...of を使用します2. 通常のオブジェ...

MySQLで判定文を書く方法のまとめ

MySQL で判断文を書く方法:方法1. CASE関数case関数の構文: CASE条件 値1の場合...

使用状況分析を備えたMySQL

持つことの使用法having 句を使用すると、グループ化後にさまざまなデータをフィルター処理できます...