序章

フォーム検証は、フォームフィールド検証とも呼ばれ、ユーザーがWebフォームのすべての必須フィールドに入力することを保証します。 フィールドに無効な値がある場合、エラーメッセージが表示され、値がすべてのルールを満たすまでフォームの送信が妨げられます。

テンプレート駆動型検証は、ディレクティブを使用して検証ルールをフォーム要素に直接設定するフォーム検証の一種です。

テンプレート駆動型の検証をVue.jsに実装するには、VeeValidateを使用できます。 VeeValidateは、入力フィールドを検証してエラーを表示できるようにするVue.jsのプラグインです。

これは、このチュートリアルで作成するもののアニメーション画像です。

このチュートリアルの最後に、VeeValidateを使用して入力フィールドを検証する登録フォームがあります。

前提条件

このチュートリアルは、JavaScriptの文字列とオブジェクトの知識があることを前提としています。 Vueにある程度精通していると有益ですが、必須ではありません。 Javascriptの詳細については、Javascriptでコーディングする方法シリーズをご覧ください。

さまざまなクラウドホストライブラリへの参照を含む単一のローカルHTMLファイルの構築に焦点を当てます。 使用可能です @vue/cli Vueプロジェクトを作成し、パッケージマネージャーを使用してインストールする vee-validate; ただし、そのアプローチはこのチュートリアルの範囲外です。

ステップ1—VeeValidateを使用してVue.jsプロジェクトを設定する

Vue.jsフレームワークとVeeValidateライブラリが必要になります。

まず、ターミナルを使用して、という名前の新しいファイルを作成します register.html:

  1. nano register.html

そして、ウェブページの初期コードを追加します。

register.html
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1.0">
  <title>Vue Template Form Validation</title>
</head>
<body>

  <!-- ... -->

</body>
</html>

Vue.jsのブラウザビルドは、 cdnjs. VeeValidateのブラウザビルドは、 jsdelivr. 両方をに追加します <body>register.html ファイル:

register.html
<body>

  <!-- include the Vue.js framework -->
  <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.11/vue.min.js"></script>

  <!-- include the VeeValidate library -->
  <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vee-validate.min.js"></script>

</body>

これらのファイルは、CDN(コンテンツ配信ネットワーク)によって提供されます。 ローカルにダウンロードまたは保存するものはありません。

これで、Vue.jsとVeeValidateの最新の安定したバージョン(この記事の執筆時点)を使用する準備ができたWebページができました。

BootstrapとFontAwesomeの追加

スタイリングを確立するには、Bootstrapを使用できます。 図像を追加するには、 FontAwesomeを利用することもできます。

BootstrapおよびFontAwesomeのブラウザビルドは、 BootstrapCDN. 両方をに追加します <head>register.html ファイル:

register.html
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1.0">
  <title>Vue Template Form Validation</title>

  <!-- include the Bootsrap framework -->
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">

  <!-- include Font Awesome -->
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" integrity="sha384-wvfXpqpZZVQGK6TAh5PVlGOfQNHSoD2xbE+QkPxCAFlNEevoEH3Sl0sibVcOQVnN" crossorigin="anonymous">
</head>

この時点で、Vue、VeeValidate、Bootstrap、およびFontAwesomeがあります。 次に、検証するフォームを作成します。

フォームマークアップの作成

このサンプルフォームは、ユーザーから5つの情報を求めます。 あなたが必要になります name, email, username, password、 と password_confirmation.

まず、フォームの初期マークアップをフォームに追加します <body>register.html 前のファイル <script> タグ:

register.html
<body>
  <div class="container my-3">
    <div class="row justify-content-around">
      <div class="col-6 rounded shadow">
        <h1 class="py-3">Sign up once and watch any of our free demos.</h1>
        <div id="signup-form">
          <form>

          <!-- ... form fields ... -->

          </form>
        </div>
      </div>
    </div>
  </div>

  <!-- ... library script tags ... -->
</body>

このコードは空を確立します <form> レイアウトと外観にいくつかのBootstrapユーティリティを使用します。

次に、フォームフィールドをに追加します <form>. のフィールドから始めます name:

register.html
<form>

  <div class="form-group">
    <label for="name">Your Name</label>
    <div class="input-group">
      <span class="input-group-prepend"><span class="input-group-text"><i class="fa fa-user" aria-hidden="true"></i></span></span>
      <input type="text" id="name" name="name" placeholder="Name" class="form-control" />
    </div>
  </div>

</form>

このコードは <label> 為に name、FontAwesomeアイコン fa-user、 と <input> 為に name.

あなたはに同様の追加を行うことができます <form> その他の情報については—email, username, password、 と password_confirmation:

register.html
<form>

  <!-- ... name ... -->

  <div class="form-group">
    <label for="email">Your Email</label>
    <div class="input-group">
      <span class="input-group-prepend"><span class="input-group-text"><i class="fa fa-envelope" aria-hidden="true"></i></span></span>
      <input type="email" id="email" name="email" placeholder="[email protected]" class="form-control" />
    </div>
  </div>

  <div class="form-group">
    <label for="username">Username</label>
    <div class="input-group">
      <span class="input-group-prepend"><span class="input-group-text"><i class="fa fa-users" aria-hidden="true"></i></span></span>
      <input type="text" id="username" name="username" placeholder="Enter your username" class="form-control" />
    </div>
  </div>

  <div class="form-group">
    <label for="password">Password</label>
    <div class="input-group">
      <span class="input-group-prepend"><span class="input-group-text"><i class="fa fa-lock" aria-hidden="true"></i></span></span>
      <input type="password" id="password" name="password" placeholder="Enter a password" class="form-control" />
    </div>
  </div>

  <div class="form-group">
    <label for="password_confirmation">Confirm Password</label>
    <div class="input-group">
      <span class="input-group-prepend"><span class="input-group-text"><i class="fa fa-lock" aria-hidden="true"></i></span></span>
      <input type="password" id="password_confirmation" name="password_confirmation" placeholder="Re-type password" class="form-control" />
    </div>
  </div>

</form>

このコードは作成します <label>s、Font Awesomeアイコン、および <input>s。 各入力には固有のものがあります idname.

登録用のボタンを追加して、 <form>:

register.html
<form>

  <!-- ... form fields ... -->

  <div class="form-group">
    <button type="submit" class="btn btn-block btn-lg btn-primary">Register</button>
  </div>

</form>

このコードは、ブートストラップスタイルを使用して大きな送信ボタンを作成します。

開くことができます register.html アプリの進行状況を確認するには、Webブラウザで。

ステップ2—Vueインスタンスの作成とマウント

次に、Vueインスタンスを作成し、 #signup-form.

新しいを追加します <script> の最後にあるタグ <body> 定義します signupForm:

register.html
<body>
  <!-- ... form ... -->
  <!-- ... library script tags ... -->

  <script>
    const signupForm = new Vue({
      el: '#signup-form'
    });
  </script>
</body>

プロパティをに追加します data 物体:

register.html
<body>
  <!-- ... form ... -->
  <!-- ... library script tags ... -->

  <script>
    const signupForm = new Vue({
      el: '#signup-form',
      data: {
        name: '',
        email: '',
        username: '',
        password: '',
        password_confirmation: ''
      }
    });
  </script>
</body>

次に、プロパティを参照します v-model 各フィールドで。

のために name フィールドに、以下を追加します。

register.html
<input type="text" id="name" name="name" placeholder="Name" class="form-control" v-model="name" />

のために email フィールドに、以下を追加します。

register.html
<input type="email" id="email" name="email" placeholder="[email protected]" class="form-control" v-model="email" />

のために username フィールドに、以下を追加します。

register.html
<input type="text" id="username" name="username" placeholder="Enter your username" class="form-control" v-model="username" />

のために password フィールドに、以下を追加します。

register.html
<input type="password" id="password" name="password" placeholder="Enter a password" class="form-control" v-model="password" />

最後に、 password_confirmation フィールドに、以下を追加します。

register.html
<input type="password" id="password_confirmation" name="password_confirmation" placeholder="Re-type password" class="form-control" v-model="password_confirmation" />

この時点で、次のモデルを含むVueインスタンスがあります。 name, email, username, password、 と password_confirmation.

ステップ3—追加 ValidationObserverValdiationProvider

次に、登録する必要があります ValidationObserverValidationProvider.

両方を新しいものに追加できます <script> の最後にタグを付ける <body>:

register.html
<body>
  <!-- ... form ... -->
  <!-- ... library script tags ... -->

  <script>
    Vue.component('validation-observer', VeeValidate.ValidationObserver);

    Vue.component('validation-provider', VeeValidate.ValidationProvider);
  </script>

  <!-- ... vue instance script tag ... -->
</body>

今、あなたは使用することができます <validation-observer> 全体を包む <form>. そして、あなたは使用することができます <validation-provider> フィールドをラップするには:

register.html
<validation-observer>

  <form>

    <div class="form-group">
      <validation-provider>
        <label for="name">Your Name</label>
        <div class="input-group">
          <span class="input-group-prepend"><span class="input-group-text"><i class="fa fa-user" aria-hidden="true"></i></span></span>
          <input type="text" id="name" name="name" placeholder="Name" class="form-control" v-model="name" />
        </div>
      </validation-provider>
    </div>

    <div class="form-group">
      <validation-provider>
        <label for="email">Your Email</label>
        <div class="input-group">
          <span class="input-group-prepend"><span class="input-group-text"><i class="fa fa-envelope" aria-hidden="true"></i></span></span>
          <input type="email" id="email" name="email" placeholder="[email protected]" class="form-control" v-model="email" />
        </div>
      </validation-provider>
    </div>

    <div class="form-group">
      <validation-provider>
        <label for="username">Username</label>
        <div class="input-group">
          <span class="input-group-prepend"><span class="input-group-text"><i class="fa fa-users" aria-hidden="true"></i></span></span>
          <input type="text" id="username" name="username" placeholder="Enter your username" class="form-control" v-model="username" />
        </div>
      </validation-provider>
    </div>

    <div class="form-group">
      <validation-provider>
        <label for="password">Password</label>
        <div class="input-group">
          <span class="input-group-prepend"><span class="input-group-text"><i class="fa fa-lock" aria-hidden="true"></i></span></span>
          <input type="password" id="password" name="password" placeholder="Enter a password" class="form-control" v-model="password" />
        </div>
      </validation-provider>
    </div>

    <div class="form-group">
      <validation-provider>
        <label for="password_confirmation">Confirm Password</label>
        <div class="input-group">
          <span class="input-group-prepend"><span class="input-group-text"><i class="fa fa-lock" aria-hidden="true"></i></span></span>
          <input type="password" id="password_confirmation" name="password_confirmation" placeholder="Re-type password" class="form-control" v-model="password_confirmation" />
        </div>
      </validation-provider>
    </div>

    <div class="form-group">
      <button type="submit" class="btn btn-block btn-lg btn-primary">Register</button>
    </div>

  </form>

</validation-observer>

これで、で作成されたフォームができました <validation-observer><valdiation-provider>.

ステップ4—VeeValidateルールの使用

VeeValidateルールは、1つ以上のフィールドに入力できるものに制限または条件を設定します。 検証が必要なフィールドを含むレコードを更新すると、検証ルールがチェックされます。 ルールに違反すると、トラップ可能なエラーが発生します。

たとえば、 required バリデーター:

<validation-provider rules="required">

パイプ文字で区切られた複数の検証に合格できます(|).

たとえば、 required そしてその email バリデーター:

<validation-provider rules="required|email">

または、オブジェクトを渡して柔軟性を高めることもできます。

<validation-provider :rules="{ required: true, email: true, regex: /[0-9]+/ }">

これで、入力が変更されるたびに、バリデーターは検証のリストを左から右に実行し、入力が検証に失敗するたびにエラーヘルパーオブジェクトにデータを入力します。

このチュートリアルを書いている時点で、VeeValidateにはフォーム検証用の 30のルールがあり、独自のルールを作成するオプションがあります。

ルールの適用

次に、インポートする必要があります VeeValidateRules.

あなたはそれを新しいものに追加することができます <script> の最後にタグを付ける <body>register.html ファイル:

register.html
<body>
  <!-- ... form ... -->
  <!-- ... library script tags ... -->

  <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/rules.umd.js"></script>

  <!-- ... vue instance tags ... -->
</body>

次に、ルールをループして、すべてを使用可能にすることができます。

register.html
<body>
  <!-- ... form ... -->
  <!-- ... library script tags ... -->

  <script>
    Object.keys(VeeValidateRules).forEach(rule => {
      VeeValidate.extend(rule, VeeValidateRules[rule]);
    });
  </script>

  <!-- ... vue instance tags ... -->
</body>

そして適用する required すべての入力のルール:

register.html
<validation-provider rules="required">

複数のルールを適用する

為に email、有効な電子メールアドレスにもルールを適用します。

register.html
<validation-provider rules="required|email">

為に password また、最小長のルールを適用します 6 文字:

register.html
<validation-provider rules="required|min:6">

今、あなたは持っています required, email、 と min フィールドのルール。

クロスフィールド検証の適用

為に password_confirmation の値と一致する必要があります password 有効であるために。 これを達成するために、あなたは頼りになります ValidationObserver、これにより password_confirmation 知っておくべき password.

追加します vidpassword フィールド、そう password_confirmed ターゲットがあります:

register.html
<validation-provider rules="required|min:6" vid="password">

追加します confirmed のルール password_confirmation フィールド、そう password_confirmed その値をの値と比較します password:

register.html
<validation-provider rules="required|confirmed:password">

今、あなたは持っています required, email, min、 と confirmed フィールドのルール。

カスタムルールの追加

VeeValidateを使用すると、カスタム検証ルールとメッセージを次のように記述できます。 extendvalidate.

ユーザーが制限された単語で登録できないようにするルールを追加します。 この例では、ユーザーが単語を使用することを制限します admin, password、 と administrator:

register.html
<body>
  <!-- ... form ... -->
  <!-- ... library script tags ... -->

  <script>
    // Declare an array of usernames that are invalid.
    const restricted_usernames = [
      'admin',
      'password',
      'administrator'
    ];

    // Extend the custom rule.
    VeeValidate.extend('checkuser', {
      name: 'Restricted Usernames',
      validate: value => {
        return restricted_usernames.includes(value.toLowerCase()) ? false : !! value
      },
      message: 'That {_field_} is unavailable.',
    });
  </script>

  <!-- ... vue instance tags ... -->
</body>

カスタムルールをに追加します username 分野:

register.html
<validation-provider rules="required|checkuser">

今、あなたは持っています required, email, min, confirmed、 と checkuser フィールドのルール。 ルールがすべて確立され、エラーメッセージの表示を開始できるようになりました。

ステップ5—VeeValidateエラーとフラグへのアクセス

VeeValidateには errors 利用可能。 VeeValidateには、状態情報用の複数のフラグもあります。 Vueを使用してこれらにアクセスできます v-slot.

Vueも使用します v-show VeeValidateエラーメッセージを表示し、Bootstrapを使用するには invalid-feedback エラーをスタイリングするためのクラス。

さらに、VeeValidateフラグを使用して dirty, valid、 と invalid Vueと組み合わせて v-bind:class とブートストラップの is-validis-invalid フィールドをスタイリングするためのクラス:

register.html
<validation-observer>

  <form>

    <div class="form-group">
      <validation-provider rules="required|alpha" v-slot="{ dirty, valid, invalid, errors }">
        <label for="name">Your Name</label>
        <div class="input-group">
          <span class="input-group-prepend"><span class="input-group-text"><i class="fa fa-user" aria-hidden="true"></i></span></span>
          <input type="text" id="name" name="name" placeholder="Name" class="form-control" v-model="name" v-bind:class="{ 'is-valid': dirty && valid, 'is-invalid': dirty && invalid }" />
        </div>
        <div class="invalid-feedback d-inline-block" v-show="errors">{{ errors[0] }}</div>
      </validation-provider>
    </div>

    <div class="form-group">
      <validation-provider rules="required|email" v-slot="{ dirty, valid, invalid, errors }">
        <label for="email">Your Email</label>
        <div class="input-group">
          <span class="input-group-prepend"><span class="input-group-text"><i class="fa fa-envelope" aria-hidden="true"></i></span></span>
          <input type="email" id="email" name="email" placeholder="[email protected]" class="form-control" v-model="email" v-bind:class="{ 'is-valid': dirty && valid, 'is-invalid': dirty && invalid }" />
        </div>
        <div class="invalid-feedback d-inline-block" v-show="errors">{{ errors[0] }}</div>
      </validation-provider>
    </div>

    <div class="form-group">
      <validation-provider rules="required|checkuser" v-slot="{ dirty, valid, invalid, errors }">
        <label for="username">Username</label>
        <div class="input-group">
          <span class="input-group-prepend"><span class="input-group-text"><i class="fa fa-users" aria-hidden="true"></i></span></span>
          <input type="text" id="username" name="username" placeholder="Enter your username" class="form-control" v-model="username" v-bind:class="{ 'is-valid': dirty && valid, 'is-invalid': dirty && invalid }" />
        </div>
        <div class="invalid-feedback d-inline-block" v-show="errors">{{ errors[0] }}</div>
      </validation-provider>
    </div>

    <div class="form-group">
      <validation-provider rules="required|min:6" vid="password" v-slot="{ dirty, valid, invalid, errors }">
        <label for="password">Password</label>
        <div class="input-group">
          <span class="input-group-prepend"><span class="input-group-text"><i class="fa fa-lock" aria-hidden="true"></i></span></span>
          <input type="password" id="password" name="password" placeholder="Enter a password" class="form-control" v-model="password" v-bind:class="{ 'is-valid': dirty && valid, 'is-invalid': dirty && invalid }" />
        </div>
        <div class="invalid-feedback d-inline-block" v-show="errors">{{ errors[0] }}</div>
      </validation-provider>
    </div>

    <div class="form-group">
      <validation-provider rules="required|confirmed:password" v-slot="{ dirty, valid, invalid, errors }">
        <label for="password_confirmation">Confirm Password</label>
        <div class="input-group">
          <span class="input-group-prepend"><span class="input-group-text"><i class="fa fa-lock" aria-hidden="true"></i></span></span>
          <input type="password" id="password_confirmation" name="password_confirmation" placeholder="Re-type password" class="form-control" v-model="password_confirmation" v-bind:class="{ 'is-valid': dirty && valid, 'is-invalid': dirty && invalid }" />
        </div>
        <div class="invalid-feedback d-inline-block" v-show="errors">{{ errors[0] }}</div>
      </validation-provider>
    </div>

    <div class="form-group">
      <button type="submit" class="btn btn-block btn-lg btn-primary">Register</button>
    </div>

  </form>

</validation-observer>

この時点で、にアクセスできます dirty, valid, invalid、 と errors. 関連するフィールドの下にフィードバックとしてエラーメッセージを表示するロジックを追加しました。 フィールドが相互作用して無効な場合、ブートストラップが適用されます is-invalid クラス。 フィールドが相互作用して有効な場合、ブートストラップが適用されます is-valid クラス。

次のステップでは、フォームの送信を処理します。

ステップ6—フォーム送信の処理

VeeValidateは、 invalid のフラグ ValidationObserverhandleSubmit 関数。 Vueを使用してこれらにアクセスできます v-slot:

register.html
<validation-observer v-slot="{ invalid, handleSubmit }">

Vueのイベント修飾子を使用して、フォームの送信をキャプチャします。 @submit.prevent. VeeValidateも使用します handleSubmit すべてのフィールドが有効になるまでフォームの送信を防ぐには:

register.html
<form @submit.prevent="handleSubmit(onSubmit)">

これは onSubmit これは、 console.log メッセージ:

register.html
<script>
  const signupForm = new Vue({
    el: '#signup-form',
    data: {
      name: '',
      email: '',
      username: '',
      password: '',
      password_confirmation: ''
    },
    methods: {
      onSubmit: function() {
        console.log('Form has been submitted!');
      }
    }
  });
</script>

維持する <button>disabled フィールドが存在する間は情報を送信しないように状態を設定します invalid:

register.html
<button type="submit" class="btn btn-block btn-lg btn-primary" v-bind:disabled="invalid">Register</button>

この時点で、開くことができます register.html Webブラウザーでフォームを操作し、検証をテストします。

結論

このチュートリアルでは、テンプレート駆動型アプローチを使用してフォーム入力を検証する方法を示しました。 VeeValidateを使用すると、既存のルールを使用してフォーム入力を検証し、新しいルールを拡張し、エラーを表示し、フォーム送信を処理できます。

Vue.jsの詳細については、Vue.jsトピックページで演習とプログラミングプロジェクトを確認してください。