iviewは動的なフォームとカスタム検証期間の重複を実装します

iviewは動的なフォームとカスタム検証期間の重複を実装します

フォーム項目を動的に追加する

iview の動的なフォーム追加は非常に簡単です。フォーム項目を配列に設定し、新しい項目を追加するときにデフォルト値をプッシュするだけです。残りの作業は iview が行います。

<テンプレート lang="html">
 <divクラス="">

    <フォーム
      ref="フォーム検証"
      :model="フォーム検証"
      :rules="ルールを検証"
      :ラベル幅="100"
      :label-colon="true"
    >
   <フォーム項目
    v-for="(item, index) in formValidate.showTimeDurations"
    :key="インデックス"
    :prop="'showTimeDurations[' + インデックス + '].値'"
    :label="'期間を表示' + (インデックス + 1)"
   >
    <行>
     <タイムピッカー
      タイプ="時間範囲"
      v-model="item.value"
      配置="下端"
      placeholder="期間を選択してください"
      スタイル="幅: 400px;"
      :disabled="編集不可"
      </タイムピッカー>
     <ボタン shape="circle" icon="md-close" @click="handleRemove(index)" style="margin-left: 10px;"></Button>
    </行>
   </フォーム項目>
   <FormItem style="width: 500px;" v-if="formValidate.showTimeDurations.length < 3">
    <Button type="dashed" long @click="handleAddDuration" icon="md-add">表示期間を追加</Button>
   </フォーム項目>
   </フォーム>
 </div>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
 名前: 'banner_new',
 データ() {
  戻る {
   フォーム検証: {
    showTimeDurations: [{値: ['','']}]
   }
  }
 },
 メソッド: {
  ハンドル追加期間() {
   this.formValidate.showTimeDurations.push({値: ['','']})
  },
  ハンドル削除(インデックス) {
   this.formValidate.showTimeDurations.splice(インデックス、1)
  }
 }
}
</スクリプト>

<style lang="css" スコープ>
</スタイル> 

フォーム検証

iview のフォーム検証は:rules="rulesValidate"は、メソッドに設定されるメソッドです。

タイトルフォーム項目と送信ボタンを追加する

 <フォーム項目 label="名前" prop="タイトル" style="幅: 500px;">
    <Input v-model="formValidate.title" :disabled="isDisEdit" :placeholder="'スライドショーの名前を入力してください (最大 50 文字)'" maxlength="50" show-word-limit></Input>
  </フォーム項目>
  ...
  <行タイプ="flex" justify="start" style="margin-top: 20px;">
    <Button type="primary" style="width: 100px; margin-left: 20px;" v-if="isCanSave" @click="handleSubmit('formValidate')">保存</Button>
  </行>
  メソッド: {
    handleSubmit(フォーム) {
      // 検証メソッドを呼び出すと検証が実行されます this.$refs[form].validate(validate => {
        // 検証が成功したかどうかの検証=true/false})
    },
  }

フォーム検証:

ルール検証: {
  タイトル:
    {
      必須: true、
      メッセージ: 'スライドショーの名前を入力してください'
      トリガー: 'ぼかし'
    },
    {
      タイプ: '文字列',
      最大: 50,
      メッセージ: '50文字以内、中国語/文字/数字/一般文字'、
      トリガー: '変更'
    }
  ]、

次のようにも書ける。

タイトル: [{{ 必須: true、メッセージ: '画像名を入力してください'、トリガー: 'ぼかし'}}]

検証条件は配列になっており、複数の条件を記述することができます。カスタム検証が必要な場合は、データに検証子を定義できます。

データ() {
  constdurationValidator = (ルール、値、コールバック) => {
    if(this.isShowTimePicker && value.toString() === ',') {
      callback(new Error('表示期間を選択してください'));
    }そうでない場合(値[0] === 値[1]) {
      callback(新しいエラー('正しい期間を選択してください'))
    }else if(!showTimeDurationsJudge(this.formValidate.showTimeVOS)){
      callback(新しいエラー('期間を繰り返すことはできません'))
    }それ以外 {
      折り返し電話()
    }
  };
  constdurationValidate = [{ バリデータ:durationValidator, トリガー: 'blur' }];
  戻る {
    ルール検証: {
      'showTimeDurations[0].value': 期間の検証、
      'showTimeDurations[1].value': 期間検証、
      'showTimeDurations[2].value': 期間検証、
    }
  }
}

'showTimeDurations[0].value': durationValidate,この書き方は、フォームの動的項目の最初のサブ項目の値を検証することを意味します。サブ項目が3つある場合は、3回繰り返す必要があります。もっと良い書き方があるのでしょうか?とりあえずこれで終わりです。

showTimeDurationsJudge 、期間が繰り返されるかどうかを確認するメソッドです。

期間が重複していることを確認する

まず、2 つの期間があるかどうかを確認する方法を考えてみましょう。日をまたぐ状況は考慮されません。

考えてみると、2つの期間が重ならないための必要十分条件は

  • 前の期間 (a1) の開始時刻 (start1) と終了時刻 (end1) は、次の期間 (a2) の開始時刻 (start2) より前である必要があります。
  • 次の期間 (a2) の開始時刻 (start2) と終了時刻 (end2) は、前の期間 (a1) の終了時刻 (end1) より後である必要があります。

上記の条件を満たすことで、2 つの期間が完全にずらされることが保証されます。

コントロールによって与えられた時間は「00:00:00」という形式の文字列であるため、文字列をサイズを比較できるタイムスタンプに変換する moment ライブラリを導入しました。

定数ジャッジ = (a1,a2) => {
 結果 = false とする
  定数 start1 = moment(a1[0],"HH:mm:ss").valueOf()
  定数 end1 = moment(a1[1],"HH:mm:ss").valueOf()
  定数 start2 = moment(a2[0],"HH:mm:ss").valueOf()
  定数 end2 = moment(a2[1],"HH:mm:ss").valueOf()

  開始1 == 開始2の場合
    偽を返す
  }それ以外の場合(開始1 > 開始2) {
    結果 = 開始1 > 終了2
  }それ以外 {
    結果 = 終了1 < 開始2
  }
  結果を返す
}

重複がある場合は false を返し、重複がない場合は true を返します。 2 つの期間を比較できるようになった後、さらに期間がある場合は、ループを使用して比較できます。完全なコードは次のとおりです。

'moment' から moment をインポートする

エクスポートconst showTimeDurationsJudge = (期間) => {
 judgeResult = true とします
 期間 && 期間.長さ > 1 の場合 {
  for(let i=0;i<durations.length-1;i++){
   for(j=i+1;j < 期間.長さ;j++) {
       判定結果 = 判定結果 && 判定(期間[i].値、期間[j].値)
     }
  }
 }
 判定結果を返す
}

定数ジャッジ = (a1,a2) => {
 結果 = false とする
  定数 start1 = moment(a1[0],"HH:mm:ss").valueOf()
  定数 end1 = moment(a1[1],"HH:mm:ss").valueOf()
  定数 start2 = moment(a2[0],"HH:mm:ss").valueOf()
  定数 end2 = moment(a2[1],"HH:mm:ss").valueOf()

  開始1 == 開始2の場合
    偽を返す
  }それ以外の場合(開始1 > 開始2) {
    結果 = 開始1 > 終了2
  }それ以外 {
    結果 = 終了1 < 開始2
  }
  結果を返す
}

これで、iview が動的フォームとカスタム検証期間の重複を実装する方法について説明したこの記事は終了です。iview フォーム検証の関連コンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • iview フォーム検証に関する簡単な説明
  • iview による複数フォームの同時検証の概要

<<:  JavaScript キャンバス テキスト クロック

>>:  jQueryはアコーディオン効果を実装します

推薦する

MySQL で group by を使用すると常にエラー 1055 が発生します (推奨)

MySQL で group by を使用すると常にエラー 1055 が発生するため、原因を確認する...

CSS3実践手法のまとめ(推奨)

1. 丸い境界線: CSSコードコンテンツをクリップボードにコピー境界線の半径: 4px ; 2....

Linux 環境の Apache サーバーでセカンダリドメイン名を設定する方法の詳細な説明

この記事では、Linux 環境の Apache サーバーでセカンダリ ドメイン名を構成する方法につい...

ES6 Promiseの使い方の詳細な説明

目次約束とは何ですか?拒否の使用法キャッチの使い方すべての使用法レースの使用約束とは何ですか? Pr...

Centos7.4 環境に lamp-php7.0 をインストールするチュートリアル

この記事では、Centos7.4 環境に lamp-php7.0 をインストールする方法について説明...

HTML の色に関する参考資料

HTML では、色は 2 つの方法で表現されます。 1 つは、青の場合は blue のように色の名前...

MySQL データのバックアップと復元のサンプル コード

1. データのバックアップ1. mysqldumpコマンドを使用してバックアップするmysqldum...

スネークゲームを作るための Pygame コード

目次使用されるPygame関数スクリーンの作成ヘビの作成ヘビを動かすゲームオーバーの処理食事を増やす...

html リンク タグ タイトル属性 改行 マウス ホバー プロンプト コンテンツ 改行効果

オブジェクト上にマウスを移動したときにコンテンツ(タイトル属性の内容)を折り返す方法、HTML タイ...

Vue フォーム入力バインディング v-model

目次1.vモデル2. プロパティとイベントのバインディング3. フォーム要素のバインディング3.1 ...

sql_mode を変更する際の MySQL エラーの解決方法

目次ERR 1067による殺人事件2番目の問題の原因はsql_modeです3. sql_modeを設...

Webpackプラグインを書いてnpmに公開するための80行のコード

1. はじめに最近、 Webpackの原理を勉強しています。これまでは Webpack の設定方法し...

js の hasOwnProperty のプロパティとインスタンスの使用法の詳細な説明

1. js は hasOwnProperty が不正に占有されることから保護しません。オブジェクトに...

Linux\Nginx 環境での仮想ドメイン名の設定とテスト検証

Nginx 仮想ドメイン名設定を使用すると、ドメイン名を購入せずに特定のドメイン名を介してローカル ...