Vee-Validate自定义日期验证

bpp*_*bpp 3 vue.js vee-validate

我想知道是否可以使用vee-validate插件编写自定义日期验证,而结束日期不能少于开始日期?我看上去高低不平,没有地方可以找到确切的答案。

如果没有办法实现,那么我可以不用它,但是,现在我在模板中为开始日期实现的是:

<input type="text" id="startDate" name="startDate" class="form-control" v-model="startDate" v-validate="'required|date_format:DD-MM-YYYY'" :class="{'input': true, 'is-danger': errors.has('startDate') }">
    <label class="mb-0" for="startDate">Start Date</label>
        <span v-show="errors.has('startdate')" class="text-danger"><center>{{ errors.first('startdate') }}</center></span>
Run Code Online (Sandbox Code Playgroud)

我的脚本如下所示:

    export default {
    name: 'App',
    data: () => ({
        task: '',
        startDate: '',
        startTime: '',
        endDate: '',
        endTime: '',
        description: 'test'
    }),
    methods: {
        validateBeforeSubmit() {
            this.$validator.validateAll().then((result) => {
                if (result) {
                // eslint-disable-next-line
                alert('Form Submitted!');
                return;
                }

                alert('Correct them errors!');
            });
        }
    }

};
Run Code Online (Sandbox Code Playgroud)

但是没有显示任何验证。我想我的脚本中缺少某些内容,但是我不确定如何在其中实现日期。任何帮助将不胜感激。

Sov*_*ina 9

首先,它是也许有些错字的错误,但在你的模板使用startDatestartdate小写。

然后,为回答您的问题,可以定义一个自定义验证器,并与vee-validate进行日期比较。

由于您选择的日期格式“ DD-MM-YYYY”不是有效的javascript日期格式,因此需要将字符串日期改写为有效格式以使其起作用。

Vue.use(VeeValidate)

new Vue({
  el: "#app",
  data() {
    return {
      startDate: '',
      endDate: '',
    }
  },
  created() {
    let self = this
    this.$validator.extend('earlier', {
      getMessage(field, val) {
        return 'must be earlier than startDate'
      },
      validate(value, field) {
        let startParts = self.startDate.split('-')
        let endParts = value.split('-')
        let start = new Date(startParts[2], startParts[1] -1, startParts[0]) // month is 0-based
        let end = new Date(endParts[2], endParts[1] -1, endParts[0])

        return end > start
      }
    })
  },
  methods: {
    validateBeforeSubmit() {
      this.$validator.validateAll().then((result) => {
        if (result) {
          alert('Form Submitted!');
          return;
        }
        alert('Correct them errors!');
      });
    }
  }
})
Run Code Online (Sandbox Code Playgroud)
.is-danger, .text-danger {
  color: red;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://unpkg.com/vee-validate@2.0.0-rc.19/dist/vee-validate.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.16/vue.min.js"></script>
<div id="app">
  <div>
    <input type="text" name="startDate" v-model="startDate"v-validate="'required|date_format:DD-MM-YYYY'" :class="{'input': true, 'is-danger': errors.has('startDate') }">
    <label class="mb-0" for="startDate">Start Date</label>
    <span v-show="errors.has('startDate')" class="text-danger">{{ errors.first('startDate') }}</span>
  </div>
  <div>
    <input type="text" name="endDate" v-model="endDate" v-validate="'required|date_format:DD-MM-YYYY|earlier'" :class="{'input': true, 'is-danger': errors.has('endDate') }">
    <label class="mb-0" for="endDate">End Date</label>
    <span v-show="errors.has('endDate')" class="text-danger">{{ errors.first('endDate') }}</span>  
  </div>

  <button @click="validateBeforeSubmit">Save</button>
</div>
Run Code Online (Sandbox Code Playgroud)

注意:我将自定义验证器放在示例创建的挂钩中,但是您可以将其放在您要在projet中使用的任何文件中。只需按照文档建议正确导入即可。