Vue elementUI フォームのネストされたテーブルと各行の検証の詳細な説明

Vue elementUI フォームのネストされたテーブルと各行の検証の詳細な説明

エフェクト表示

まずこれが望ましい効果かどうかを確認してください^_^

図に示すように、ElementUI フォームにはテーブルがネストされています。テーブルの各行では、[保存]、[追加]、[編集]、[削除]、[リセット] などの操作を実行できます。同時に、各行の特定のフィールドを検証できます (フォーム全体ではなく)。この要件は非常に一般的なので、記録されています。

コードリンク

giteeアドレス

キーコード

表形式データ

// データ形式は [オブジェクトネスト配列] である必要があります。[フォーム] はフォームにバインドされ、[リスト] はテーブルフォームにバインドされます: {
  // テーブルデータリスト: [
      { id: 1、名前: 'Xiaoye'、年齢: '12'、電話番号: '123456'、表示: true }、
      { id: 2、名前: 'Xiao Li'、年齢: '23'、電話番号: '123457'、表示: true }、
      { id: 3、名前: '小林'、年齢: '12'、電話番号: '123458'、表示: true }
  ]
},

コンポーネントのネスト

  1. フィールド検証を追加する場合、形式は次のように記述する必要があります: prop="'list.' + scope.$index + '.name'"
    これはelementuiで指定された形式です。レンダリングされた結果はlist.1.nameです。
  2. 各フィールドはフォームのルール属性に動的にバインドされる必要があります
  3. 上記の形式でない場合はエラーが発生します! ! !
 // フォームはテーブルの外側にネストする必要があり、フォームは [rules] [ref] 属性にバインドされる必要があります <el-form :model="form" :rules="rules" ref="form">
   <el-table :data="フォーム.リスト">
       <el-table-column prop="name" label="名前">
           <テンプレートスコープ="スコープ">
              // 各フィールドはフォームの [prop] [rules] 属性に動的にバインドされます <el-form-item :prop="'list.' + scope.$index + '.name'" :rules="rules.name">
                    <el-input size="mini" v-model="scope.row.name" placeholder="入力してください" clearable></el-input>
               </el-form-item>
           </テンプレート>
       </el-table-column>
  </el-table>
</el-form>

検証方法

  1. フォームのフィールド オブジェクトは this.$refs['form'].fields に存在し、フィールド オブジェクトには prop [datas.1.name] 属性と validateField メソッド [datas.1.name が検証に合格できるかどうかを確認する] があります。
  2. ただし、検証に合格できるかどうかを確認するには、validateFieldメソッドを手動で作成する必要があります。
  3. 作成する必要があります。作成しないとエラーが発生します。 ! !
 // フォーム検証メソッド // [form] は検証が必要なフォーム、つまりフォーム内の [ref] にバインドされたフィールドです // [index] は渡す必要のある行数、フィールド [scope.$index] です
検証フィールド(フォーム、インデックス) {
     結果を true にします。
     for (let item of this.$refs[form].fields) {
         if(item.prop.split(".")[1] == インデックス){
             this.$refs[form].validateField(item.prop, err => {
                 if(エラー!="") {
                     結果 = false;
                 }
             });
         }
         if(!結果) break;
     }
     結果を返します。
}

リセット方法

// 検証が必要なフォームフィールドをリセットします // パラメータは検証メソッドと同じです。すべてのフィールドをリセットする場合は、reset(form, index) {
    this.$refs[form].fields.forEach(item => {
        if(item.prop.split(".")[1] == インデックス){
            アイテムをリセットフィールド();
        }
    })
}
// すべてのフィールドをリセットする必要がある場合は、フォーム内のフィールドを直接制御できます // [row] は各行に渡されるデータです resetRow(row) {
    行名 = "";
    行.age = "";
    行.電話番号 = "";
}

完全なコード

オンラインリンクを使用しているため、ネットワークが不安定な場合はページが読み込まれない場合があります。 ご利用の際はローカルリンクに切り替えてください。

 <!DOCTYPE html>
<html lang="ja">

<ヘッド>
    <メタ文字セット="UTF-8">
    <meta http-equiv="X-UA-compatible" content="IE=edge">
    <meta name="viewport" content="width=デバイス幅、初期スケール=1.0">
    <title>Vue フォームのネストされたテーブルの行ごとの検証</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
    <!-- スタイルをインポート -->
    <link rel="スタイルシート" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css" rel="外部 nofollow" >
    <!-- コンポーネント ライブラリをインポートします-->
    <script src="https://unpkg.com/element-ui/lib/index.js"></script>
</head>

<本文>
    <div id="アプリ">
        <!-- ページ コンポーネント -->
        <h2 style="text-align: center; line-height: 23px;color: #909399;">Vue フォームのネストされたテーブルの行ごとの検証</h2>
        <el-form :model="フォーム" :rules="ルール" ref="フォーム" :inline="true"
            スタイル="margin: 23px auto 0px; width: 96%; overflow: hidden;">
            <el-table border :data="form.list">
                <el-table-column align="center" prop="id" label="シリアル番号" width="55">
                </el-table-column>
                <el-table-column align="center" prop="name" label="名前">
                    <テンプレートスコープ="スコープ">
                        <el-form-item :prop="'list.' + scope.$index + '.name'" :rules="rules.name"
                            v-if="スコープ行を表示">
                            <el-input size="mini" v-model="scope.row.name" placeholder="入力してください" clearable>
                            </el-input>
                        </el-form-item>
                        <div v-if="!scope.row.show">{{scope.row.name}}</div>
                    </テンプレート>
                </el-table-column>
                <el-table-column align="center" prop="年齢" label="年齢">
                    <テンプレートスコープ="スコープ">
                        <el-form-item :prop="'list.' + scope.$index + '.age'" :rules="rules.age" v-if="scope.row.show">
                            <el-input size="mini" v-model="scope.row.age" placeholder="入力してください" clearable>
                            </el-input>
                        </el-form-item>
                        <div v-if="!scope.row.show">{{scope.row.age}}</div>
                    </テンプレート>
                </el-table-column>
                <el-table-column align="center" prop="phone" label="連絡先情報">
                    <テンプレートスコープ="スコープ">
                        <el-form-item :prop="'list.' + scope.$index + '.phone'" :rules="rules.phone"
                            v-if="スコープ行を表示">
                            <!-- <el-form-item v-if="scope.row.show"> -->
                            <el-input size="mini" v-model="scope.row.phone" placeholder="入力してください" clearable>
                            </el-input>
                        </el-form-item>
                        <div v-if="!scope.row.show">{{scope.row.phone}}</div>
                    </テンプレート>
                </el-table-column>
                <el-table-column label="操作" align="center" width="290" fixed="right">
                    <テンプレート スロット スコープ="スコープ">
                        <el-button type="text" style="color: #E6A23C;" @click="save(scope.$index, scope.row)"
                            v-if="scope.row.show" icon="el-icon-check">保存</el-button>
                        <el-button type="text" style="color: #409EFF;" @click="edit(scope.row)" v-if="!scope.row.show"
                            icon="el-icon-edit">編集</el-button>
                        <el-button type="text" style="color: #67C23A;" v-if="scope.$index+1 == listLength"
                            @click="addRow(scope.$index, scope.row)" icon="el-icon-plus">追加</el-button>
                        <el-button type="text" style="color: #F56C6C;" @click="delRow(scope.$index, scope.row)"
                            icon="el-icon-delete">削除</el-button>
                        <el-button type="text" style="color: #909399;" @click="reset('form', scope.$index)"
                            v-if="scope.row.show" icon="el-icon-refresh">リセット</el-button>
                        <!-- <el-button type="text" style="color: #909399;" @click="resetRow(scope.row)"
                            v-if="scope.row.show" icon="el-icon-refresh">リセット</el-button> -->
                    </テンプレート>
                </el-table-column>
            </el-table>
        </el-form>
    </div>
</本文>

</html>
<スクリプト>
    var アプリ = 新しい Vue({
        el: '#app',
        データ() {
            戻る {
                // フォームデータフォーム: {
                    // テーブルデータリスト: [{ id: 1, name: '', age: '', phone: '', show: true }]
                },
                // フォーム検証ルール: {
                    name: [{ required: true, message: '名前を入力してください! ', トリガー: 'ぼかし' }],
                    age: [{ required: true, message: '年齢を入力してください! ', トリガー: 'ぼかし' }],
                    phone: [{ required: true, message: '連絡先情報を入力してください! ', トリガー: 'ぼかし' }],
                },
                // デフォルトのテーブルの長さは1です
                リストの長さ: 1,
            }
        },

        メソッド: {
            // ValidatevalidateField(フォーム、インデックス) {
                結果を true にします。
                for (let item of this.$refs[form].fields) {
                    if (item.prop.split(".")[1] == インデックス) {
                        this.$refs[form].validateField(item.prop, err => {
                            (エラー!= ""の場合{
                                結果 = false;
                            }
                        });
                    }
                    if (!結果) break;
                }
                結果を返します。
            },

            // リセット [検証フィールドのみ]
            リセット(フォーム、インデックス) {
                this.$refs[form].fields.forEach(item => {
                    if (item.prop.split(".")[1] == インデックス) {
                        アイテムをリセットフィールド();
                    }
                })
            },

            // リセット [すべて]
            リセット行(行) {
                行名 = "";
                行.age = "";
                行.電話番号 = "";
            },

            // 保存 save(index, row) {
                if (!this.validateField('form', index)) return;
                行を表示します。
            },

            // 追加 addRow(index, row) {
                if (!this.validateField('form', index)) return;
                this.form.list.push({
                    id: インデックス + 2,
                    名前: ''、
                    年: ''、
                    電話: ''、
                    表示: 真
                });
                this.listLength = this.form.list.length;
            },

            // 編集 edit(row) {
                行を表示します。
            },

            // 削除 delRow(index, row) {
                if (this.form.list.length > 1) {
                    this.form.list.splice(インデックス、1);
                    this.listLength = this.form.list.length;
                } それ以外 {
                    this.form.list = [{
                        id: 1,
                        名前: ''、
                        年: ''、
                        電話: ''、
                        表示: 真
                    }];
                }
            },
        }
    })
</スクリプト>

要約する

Vue elementUI フォームのネストされたテーブルと各行のチェックに関するこの記事はこれで終わりです。より関連性の高い elementUI フォームのネストされたテーブルの内容については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Vue3+Element+Tsは、フォームの基本的な検索リセットやその他の機能を実装します
  • Vue3.0 で要素プラス UI スタイルを導入する 2 つの方法
  • vue3 + elementPlus リセットフォームの問題

<<:  Layuiテーブルは指定された行のラジオボタンを選択し、その行の実装コードまでスクロールします。

>>:  モバイル開発における 1px ラインの理解と解決策

推薦する

JavaScript の for/of、for/in の詳細な紹介

目次JavaScriptでは、 forループを記述する一般的な方法がいくつかあります。最初の、そして...

MySQL5.7+ MySQL Workbenchのインストールと設定方法のグラフィックチュートリアル(MAC)

この記事では、主にMACオペレーティングシステムでのMySQL5.7とMySQLWorkbenchの...

Nginx レベルで基本的なユーザー認証を構成する手順を完了します。

序文アプリケーション シナリオ: おそらく、内部 Web サイトは外部ユーザーにアクセス可能である必...

純粋なCSSで立体的な画像配置効果を実現するサンプルコード

1. 要素の幅/高さ/パディング/マージンのパーセンテージ基準要素の幅/高さ/パディング/マージンの...

JavaScriptはオブジェクトの不要なプロパティを削除します

目次例方法1: 削除方法2: 分解補充する要約するThinking シリーズは、10 分で実用的なプ...

tomcat9.exeをクリックするとクラッシュする問題を解決する方法

ある読者から連絡があり、ダウンロードが終了し、操作がまだ開始されていないのに、なぜ Tomcat の...

CSSで背景ぼかしを設定する方法

ページを作成するときに、ページの見栄えを良くするために、背景画像を設定する必要があることがよくありま...

フロントエンドJavaScriptのクラス

目次1. クラス1.1 コンストラクタ() 1.2 ゲッターとセッター1.3 これ1.4 静的プロパ...

Vue.jsは画像切り替え機能を実装する

この記事では、画像切り替え機能を実装するためのVue.jsの具体的なコードを参考までに共有します。具...

mysql 複数テーブル接続削除関数の削除

単一のテーブルを削除する: tableName から columnName = value を削除し...

MySQL 5.7.18 のインストール中に MySQL サービスの起動に失敗する問題の解決策

MySQL は非常に強力なリレーショナル データベースです。しかし、初心者の中には、インストールや設...

Alibaba Cloud Server ドメイン名解決手順 (初心者向けチュートリアル)

ウェブサイトの構築を始めたばかりの初心者には、理解し、学ぶべきことがたくさんあります。ウェブサイトを...

Zabbix による VMware Exsi ホストの監視のグラフィカルな手順

1. 仮想化 vcenter に入り、ブラウザでログインし (クライアントは設定する場所を見つけませ...

HTML 基本要約推奨事項 (テキスト形式)

HTMLテキスト書式タグ 標簽 描述 <b> 定義粗體文本 <em> 呈現...

DockerとFastDFSのインストールコマンドと使い方の詳しい説明

Dockerの機能1) すぐに始められるユーザーがプログラムを「Docker 化」するには、わずか数...