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 セキュリティモジュールの導入

推薦する

MySQL でテーブルを作成するときの NULL と NOT NULL の使用方法の詳細な説明

MySQL の仕様によっては、テーブル作成仕様にすべてのフィールドが空であってはならないという要件を...

モバイルデバイス上のぼやけた小さなアイコンの問題を解決する方法

序文以前、画像とテキストの垂直方向のずれの問題について説明しました。ここで示した小さな例では、小さな...

div ボックス モデルの使用経験の概要

ボックスモデルの計算<br />マージン + ボーダー + パディング + コンテンツC...

Nginx のアンチホットリンクを設定する方法

実験環境• 最小限のインストール済みの CentOS 7.3 仮想マシン• 構成: 1 コア/512...

MySQLの自動増分主キーの実装の詳細な説明

目次1. 自己増分値はどこに保存されますか? 2. 自己価値修正メカニズム3. 自動増分値を変更する...

HTML テーブル マークアップ チュートリアル (22): 行の境界線の色属性 BORDERCOLORLIGHT

行内では、明るい境界線の色を個別に定義できます。基本的な構文<TR ボーダーカラーライト=co...

WIN10 システムと Docker 内部コンテナ IP 間の通信方法

1. Windows 版の Docker をインストールしたら、Docker クイックスタート ター...

WeChatアプレットは日付と時刻に基づいた並べ替え機能を実装

最近、小さなプログラム プロジェクトを引き継いだのですが、リストを日付と時刻で並べ替えるという要件が...

Vue で計算プロパティを使用する際の知識ポイントのまとめ

計算されたプロパティ場合によっては、テンプレートにロジックを詰め込みすぎると、テンプレートが重くなり...

CSSを使用して中央に固定された2つの列と適応型列を実現する方法

1. 絶対位置とマージンを使用するこの方法の原則は、左側と右側をドキュメントの流れから外れるように配...

小規模プロジェクトで Vue が点滅するのを防ぐ方法

まとめHTML: 要素と v-cloak CSS: [v-cloak]{表示: なし}プロセスページ...

MySQL で中国語の文字をピンインでソートする簡単な例

名前を格納するフィールドが GBK 文字セットを使用している場合、GBK 内部コード自体がエンコード...

HTML ウェブページのブラウザタイトルバーに小さなアイコンを表示する方法

この効果と同様に、方法も非常に簡単です。ヘッダーに次のように記述します: <link rel=...