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はアコーディオン効果を実装します

推薦する

Tencent Cloudでhive3.1.2を構築する方法を教えます

環境の準備操作を開始する前に、hadoop バージョンがインストールされていることを確認してください...

Linux カーネル デバイス ドライバー カーネル時間管理に関する注意事項

/****************** * Linux カーネルの時間管理 ***********...

JS初心者が配列を処理するための実践的な方法のまとめ

join() メソッド: 指定された区切り文字を使用して配列内のすべての要素を文字列に接続します。例...

Centos 7 mysql-8.0.19-1.el7.x86_64.rpm-bundle.tar の簡単な分析

Baiduクラウドディスク:リンク: https://pan.baidu.com/s/1hv5rUW...

HTMLで特殊記号を表示する(特殊文字対応表付き)

問題の再現HTML を使用して編集する場合、特殊記号によってエラーが表示されることが多く、極端な場合...

Linux での MySQL 5.1 および 5.7 のインストール チュートリアル

以下のコンテンツのオペレーティング システムは次のとおりです: Centos 6.7 yum で M...

CentOS に MySQL 8.0 をインストールして設定するための詳細な手順

序文CentOS に MySQL をインストールして設定する手順は次のとおりです。文章yumソースか...

MySQL GROUP_CONCAT 制限の解決

効果: GROUP_CONCAT関数は、フィールド値を文字列に連結することができます。デフォルトの区...

Docker プライベート サーバー イメージを定期的にクリーンアップする方法

CI を利用してリリース用の Docker イメージをビルドすることで、全員のバージョンリリース効率...

DockerコンテナのIPアドレスを取得する方法の詳細な説明

1.コンテナに入った後 /etc/hosts を cat するコンテナ自体の IP アドレスと (-...

なぜ IE6 が最も多くの人に使用されているのでしょうか?

まず第一に、私はウェブデザイナーです。具体的には、私は XHTML フロントエンド デザイナーです。...

デザイナーと開発者に役立つ 9 つの超実用的な CSS のヒント

Web デザイナーの頭の中には、仕事に関連する多くの知識が詰まっている必要があります。 CSS は、...

IE10以下のimgタグ問題の解決方法

問題を見つける以前、簡単なデモを書いたのですが、IE10以下では動作しないことがわかりました。ここに...

HTMLの水平線注釈とコードコメントの使い方をマスターするだけです

水平線<hr /> タグを使用して、現在の位置に水平の分割線を描画します。例: XML/...

ページコードの変更の効率を向上させ、HTML言語のコア知識を習得します。

ウェブサイトを構築するとき、HTML 言語は重要ではないと思われるかもしれませんが、実際には、基本的...