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

推薦する

DockerはCMDまたはENTRYPOINTコマンドを使用して複数のサービスを同時に起動します

要件: Celery は Django に導入されています。Django プロジェクトを開始するとき...

Linux ホスト上で複数の MySQL データベースを起動する方法

今日は、Linux ホスト上で 4 つの MySQL データベースを起動する方法について説明します。...

Dockerでローカルマシン(ホストマシン)にアクセスする方法

質問Docker でローカル データベースにアクセスするにはどうすればよいでしょうか? 127.0....

zabbix 4.04 の詳細なインストール チュートリアル (CentOS 7.6 ベース)

1. インストール前の準備: 1.1 JDKをインストールするopenjdkをアンインストールする...

ブートストラップテーブルの使い方のまとめ

この記事では、bootstrapテーブルの使い方を参考までに紹介します。具体的な内容は次のとおりです...

フロントエンドフレームワーク Vue における親子コンポーネントデータの双方向バインディングの実装

目次1. 親コンポーネントと子コンポーネント間の一方向の値転送1. 親から子への値の受け渡し2. 子...

DockerでRabbitMqの共通クラスタとミラークラスタを構築する詳細な操作

目次1. RabbitMqの動作環境を構築する1.検索を通じてrabbitmqイメージを照会する2....

TypeScript の関数

目次1. 関数の定義1.1 JavaScript の関数1.2 TypeScriptの関数2. オプ...

MySQL では SQL ステートメントはどのように実行されますか?

目次1. MySQLアーキテクチャの分析1.1 コネクタ1.2 クエリキャッシュ1.3 アナライザー...

MySQL でのサブクエリの基本的な使用法

目次1. サブクエリの定義2. サブクエリの分類1. スカラーサブクエリ: 2. MySQLサブクエ...

Centos7のシステム言語を簡体字中国語に変更する方法

例示するシステムを自分でインストールする場合は、通常、システム言語をカスタマイズできます。ただし、ク...

純粋な CSS を使用して脈動するローダー効果のソースコードを作成する

効果プレビュー右側の「クリックしてプレビュー」ボタンを押すと現在のページでプレビューが表示され、リン...

Vueの監視プロパティの詳細な説明

目次Vue モニターのプロパティリスナープロパティとは何ですか?リスニングプロパティと計算プロパティ...

docker.service 起動エラーの詳細なトラブルシューティング

エラーを報告するには次のコマンドを実行しますsystemctl dockerを再起動しますエラーメッ...

Web 標準アプリケーション: Tencent QQ ホームページの再設計

Tencent QQのホームページがリニューアルされ、Webフロントエンド開発がますます注目を集めて...