vee-validate 3 的有效格式是什么?

Which is valid format for vee-validate 3?

在@vue/cli 4.0.5 应用程序中,我安装了 "vee-validate": "^3.0.11" 并且遇到问题,因为试图设置通用 电子邮件字段的验证规则:

<validation-provider rules="required|email" v-slot="{ errors }">
<input
        type='email'
        v-model="form.email"
        name="email"
        id="email"
        class="form-control editable_field" placeholder="Email Address"
>
<span>{{ errors[0] }}</span>
</validation-provider>

   ...
<script>
    import {ValidationProvider, extend} from 'vee-validate'
    import {required, email} from 'vee-validate'
    extend('required', value => !!value);
    extend('email', value => !!value);

验证根本没有,没有错误消息或控制台错误...

怎么了?

修改 #2 :

查看文档和实例 https://codesandbox.io/s/jdqzk 我尝试制作带有验证和 出现错误:

vue.runtime.esm.js?2b0e:619 [Vue warn]: Error in v-on handler: "TypeError: handleSubmit is not a function"

发现于 ---> 在 src/views/auth/Login.vue

我的 src/views/auth/Login.vue :

<template>
   <div class="page_content_container">

      <div class="page_content_content col-xs-12 col-sm-10 col-md-6 mx-auto">

         <ValidationObserver v-slot="{ handleSubmit }">
            <form class="login" v-on:submit.prevent="handleSubmit(authenticate)">
               <div class="card">

                  <div class="card-body card-block">

                     <div class="block_2columns_md m-3"> <!-- email -->

                        <div class="key_values_rows_label_13 m-0 p-0">
                           <label class="col-form-label" for="email">Email:</label>
                        </div>
                        <div class="key_values_rows_value_13 m-0 p-0">
                           <div class="col-12">
                              <div class="input-group">
                                 <div class="input-group-addon">
                                    <i :class="'i_link '+getHeaderIcon('email')"></i>
                                 </div>
                                 <ValidationProvider
                                       rules="required"
                                       immediate
                                       v-slot="{ errors }"
                                 >
                                    <input
                                          v-model="form.email"
                                          name="email"
                                          id="email"
                                          class="form-control editable_field" placeholder="Email Address"
                                    >
                                 </ValidationProvider>
                              </div>
                           </div>
                        </div>

                     </div> <!-- <div class="block_2columns_md m-0"> email -->

                     <div class="block_2columns_md m-3"> <!-- password -->

                        <div class="key_values_rows_label_13 m-0 p-0">
                           <label class="col-form-label" for="password">Password:</label>
                        </div>
                        <div class="key_values_rows_value_13 m-0 p-0">
                           <div class="col-12">
                              <div class="input-group">
                                 <div class="input-group-addon">
                                    <i :class="'i_link '+getHeaderIcon('password')"></i>
                                 </div>
                                 <input type="password" v-model="form.password" id="password" name="password" class="form-control editable_field"
                                        placeholder="Password"
                                 >
                              </div>
                           </div>
                        </div>

                     </div> <!-- <div class="block_2columns_md m-0"> password -->

                  </div> <!-- <div class="card-body card-block"> -->

                  <div class="card-footer m-0 p-0">
                     <div class="form-row m-1" style="justify-content: flex-end;">
                        <button type="reset" class="btn btn-danger btn-sm m-2">
                           <i :class="'i_link '+getHeaderIcon('cancel')"></i>Home
                        </button>
                        <button type="submit" class="btn btn-success btn-sm m-2 ml-4 mr-4">
                           <i :class="'i_link '+getHeaderIcon('save')"></i>Submit
                        </button>
                     </div>
                  </div>

               </div> <!-- <div class="card"> -->

            </form>
         </ValidationObserver>

      </div> <!-- page_content_content -->

   </div> <!-- page_content_container -->
</template>

<script>
    import {bus} from '../../../src/main'
    import appMixin from '@/appMixin'

    import {ValidationObserver, ValidationProvider, localize, extend} from 'vee-validate'
    import en from 'vee-validate/dist/locale/en.json';
    import * as rules from 'vee-validate/dist/rules';

    localize('en', en);

    extend('required', {
        validate(value) {
            return {
                required: true,
                valid: ['', null, undefined].indexOf(value) === -1
            };
        },
        computesRequired: true
    });

    export default {
        name: 'loginPage',

        components: {
            ValidationObserver, ValidationProvider
        },

        data() {
            return {
                form: {
                    email: '',
                    password: ''
                },
                error: null,
                site_name: process.env.VUE_APP_SITE_NAME
            }
        },

        mixins: [appMixin],

        methods: {
            authenticate() {
                alert('authenticate::' + (-3))

                console.log('authenticate  this.form::')
                console.log(this.form)

                this.$store.dispatch('login', this.form)
                    .then(() => this.$router.push('/'))
                    .catch(err => console.log(err))
            }
        }, // methods: {

        computed: {
            authError() {
                return this.$store.getters.authError
            }
        } // computed: {
    }

</script>

我预计 handleSubmit 是在 vee-validate 库中定义的... 在示例中,我没有看到它是附加导入的。 我尝试创建自己的 handleSubmit 方法,但还是出错了...

如何解决?

修改#3:

我现在升级到 3.1 和我的 /package.json :

{
  "name": "ctasks",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint"
  },
  "dependencies": {
    "axios": "^0.19.0",
    "core-js": "^3.3.2",
    "font-awesome": "^4.7.0",
    "moment": "^2.24.0",
    "moment-timezone": "^0.5.27",
    "vee-validate": "^3.1.0",
    "vue": "^2.6.10",
    "vue-focus": "^2.1.0",
    "vue-js-modal": "^1.3.31",
    "vue-notification": "^1.3.20",
    "vue-router": "^3.1.3",
    "vue-select": "^3.2.0",
    "vue2-filters": "^0.8.0",
    "vuex": "^3.0.1"
  },
  "devDependencies": {
    "@vue/cli-plugin-babel": "^4.0.0",
    "@vue/cli-plugin-router": "^4.0.0",
    "@vue/cli-plugin-vuex": "^4.0.0",
    "@vue/cli-service": "^4.0.0",
    "bootstrap": "^4.3.1",
    "jquery": "^3.4.1",
    "node-sass": "^4.12.0",
    "popper.js": "^1.16.0",
    "sass-loader": "^8.0.0",
    "vue-template-compiler": "^2.6.10"
  }
}

run npm install  

我根据 https://codesandbox.io/s/rsmwq 示例重新制作了我的页面,其中 loginData 定义为表单数据 var:

<template>
    <div class="page_content_container">

        <div class="page_content_content col-xs-12 col-sm-10 col-md-6 mx-auto">

            <ValidationObserver ref="form">
                <form class="login" @submit.prevent="handleSubmit(onSubmit)">
                    <div class="card">

                        <div class="card-body card-block">

                            <div class="block_2columns_md m-3"> <!-- email -->

                                <div class="key_values_rows_label_13 m-0 p-0">
                                    <label class="col-form-label" for="email">Email:</label>
                                </div>
                                <div class="key_values_rows_value_13 m-0 p-0">
                                    <div class="col-12">
                                        <div class="input-group">
                                            <div class="input-group-addon">
                                                <i :class="'i_link '+getHeaderIcon('email')"></i>
                                            </div>
                                            <ValidationProvider
                                                    rules="required"
                                                    immediate
                                                    v-slot="{ errors }"
                                            >
                                                <input
                                                        v-model="loginData.email"
                                                        name="email"
                                                        id="email"
                                                        class="form-control editable_field" placeholder="Email Address"
                                                >
                                            </ValidationProvider>
                                        </div>
                                    </div>
                                </div>

                            </div> <!-- <div class="block_2columns_md m-0"> email -->

                            <div class="block_2columns_md m-3"> <!-- password -->

                                <div class="key_values_rows_label_13 m-0 p-0">
                                    <label class="col-form-label" for="password">Password:</label>
                                </div>
                                <div class="key_values_rows_value_13 m-0 p-0">
                                    <div class="col-12">
                                        <div class="input-group">
                                            <div class="input-group-addon">
                                                <i :class="'i_link '+getHeaderIcon('password')"></i>
                                            </div>
                                            <input type="password" v-model="loginData.password" id="password" name="password" class="form-control editable_field"
                                                   placeholder="Password"
                                            >
                                        </div>
                                    </div>
                                </div>

                            </div> <!-- <div class="block_2columns_md m-0"> password -->

                        </div> <!-- <div class="card-body card-block"> -->

                        <div class="card-footer m-0 p-0">
                            <div class="form-row m-1" style="justify-content: flex-end;">
                                <button type="reset" class="btn btn-danger btn-sm m-2">
                                    <i :class="'i_link '+getHeaderIcon('cancel')"></i>Home
                                </button>
                                <button type="submit" class="btn btn-success btn-sm m-2 ml-4 mr-4">
                                    <i :class="'i_link '+getHeaderIcon('save')"></i>Submit
                                </button>
                            </div>
                        </div>

                    </div> <!-- <div class="card"> -->

                </form>
            </ValidationObserver>

        </div> <!-- page_content_content -->

    </div> <!-- page_content_container -->
</template>

<script>
    import {bus} from '../../../src/main'
    import appMixin from '@/appMixin'

    import {ValidationObserver, ValidationProvider, localize, extend} from 'vee-validate'
    import en from 'vee-validate/dist/locale/en.json';
    import * as rules from 'vee-validate/dist/rules';

    localize('en', en);

    extend('required', {
        validate(value) {
            return {
                required: true,
                valid: ['', null, undefined].indexOf(value) === -1
            };
        },
        computesRequired: true
    });

    export default {
        name: 'loginPage',

        components: {
            ValidationObserver, ValidationProvider
        },

        data() {
            return {
                loginData: {
                    email: '',
                    password: ''
                },
                error: null,
                site_name: process.env.VUE_APP_SITE_NAME
            }
        },

        mixins: [appMixin],


        methods: {
            onSubmit() {

                    this.$refs.form.validate().then(success => {
                        if (!success) {
                            return;
                        }

                        alert('Form has been submitted!');

                        this.firstName = this.lastName = this.email = '';

                        this.$nextTick(() => {
                            this.$refs.form.reset();
                        });
                    });
            } // onSubmit

        }, // methods: {

        computed: {
            authError() {
                return this.$store.getters.authError
            }
        } // computed: {
    }

</script>

但是点击提交按钮我仍然遇到错误:

vue.runtime.esm.js?2b0e:619 [Vue warn]: Property or method "handleSubmit" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property. See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.

我没有看到我的代码有什么问题?

谢谢!

您应该阅读有关必填字段的指南,引用自文档:

vee-validate doesn't validate optional fields when they are empty. Which makes sense, if the user didn't input any value in an optional field, it is valid. Until they've entered a non-empty value, rules won't be run.

Required fields

谢谢@Ryley! 我将表格重新制作为:

<ValidationObserver ref="form" v-slot="{handleSubmit}">
...
   <ValidationProvider
      name="Password"
      rules="required"
      v-slot="{ errors }"
   > 
      <div class="input-group">
         <div class="input-group-addon">
            <i :class="'i_link '+getHeaderIcon('users')"></i>
         </div>
         <input
              type='text'
              v-model="form.name"
              name="name"
              id="name"
              class="form-control editable_field" placeholder="Username"
         >
      </div>
       <div class="validation_error">{{ errors[0] }}</div>
   </ValidationProvider>

验证工作正常!