Vue js vee проверять подтверждение пароля всегда ложно

Я пытаюсь использовать vee validate для проверки пароля с помощью этого кода.

<div>
    <input type="password"
           placeholder="Password"
           v-model="password"
           v-validate="'required|min:6|max:35|confirmed'"
           name="password" />
</div>
<div>
    <span>{{ errors.first('password') }}</span>
</div>
<div>
    <input type="password"
           placeholder="Confirm password"
           v-model="confirmPassword"
           v-validate="'required|target:password'"
           name="confirm_password" />
</div>
<div>
    <span>{{ errors.first('confirm_password') }}</span>
</div>

Но он всегда говорит: Подтверждение пароля не совпадает. Что пошло не так в моем коде?


person Pathum Kalhan    schedule 10.07.2018    source источник


Ответы (2)


Ваш ввод пароля должен содержать ref="password" - так vee-validate находит цель:

<input v-validate="'required'" ... ref="password"> (Спасибо, Райли).

подтверждено: {target} - ввод должен иметь то же значение, что и целевой ввод, указанный {target} в качестве имени целевого поля.

Кроме того, есть ошибка синтаксиса Vee Validate, измените target: на confirmed:

v-validate="'required|target:password'"

должно быть

v-validate="'required|confirmed:password'"

Взгляните на базовый пример ниже, он проверит две вещи:

  • Есть ли во втором поле ввода какое-либо входное значение?
  • Если да, совпадает ли второе входное значение с первым входным значением?

var app = new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue!'
  }
})
body {
  background: #20262E;
  padding: 15px;
  font-family: Helvetica;
}

#app {
  width: 60%;
  background: #fff;
  border-radius: 10px;
  padding: 15px;
  margin: auto;
}
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vee-validate/2.1.1/vee-validate.js"></script>
<script>
  Vue.use(VeeValidate);
</script>


<div id="app">

  <form id="demo">

    <!-- INPUTS -->
    <div class="input-group">
      <h4 id="header"> Enter Password</h4>

      <div class="input-fields">
        <input v-validate="'required'" name="password" type="password" placeholder="Password" ref="password">

        <input v-validate="'required|confirmed:password'" name="password_confirmation" type="password" placeholder="Password, Again" data-vv-as="password">
      </div>
    </div>

    <!-- ERRORS -->
    <div class="alert alert-danger" v-show="errors.any()">
      <div v-if="errors.has('password')">
        {{ errors.first('password') }}
      </div>
      <div v-if="errors.has('password_confirmation')">
        {{ errors.first('password_confirmation') }}
      </div>
    </div>

  </form>
</div>

Дополнительная литература: https://baianat.github.io/vee-validate/guide/rules.html#confirmed

person Bennett Dams    schedule 10.07.2018
comment
Кроме того, ваш ввод пароля должен иметь ref="password", так как vee-validate находит цель - person Ryley; 10.07.2018
comment
@Ryley Обновил мой ответ. - person Bennett Dams; 10.07.2018
comment
Большое спасибо. очень полезный ответ. знак равно - person Pathum Kalhan; 11.07.2018
comment
v-validate может найти цель по имени - person atilkan; 05.11.2018
comment
@BennettDams большое спасибо. Это мне помогло. Не могли бы вы жирным шрифтом указать ссылку, пожалуйста, это было действительно важно в моем случае. Отдельное спасибо ryley guy - ты мой мужчина !. - person Rohit Gupta; 09.01.2019
comment
Могу я попросить вас взглянуть на вопрос, связанный с VeeValidate, здесь: stackoverflow.com/questions/59488066/? - person Istiaque Ahmed; 28.12.2019

У меня работает следующий код: https://logaretm.github.io/vee-validate/advanced/cross-field-validation.html#targeting-other-fields.

<template>
  <ValidationObserver>
    <ValidationProvider rules="required|password:@confirm" v-slot="{ errors }">
      <input type="password" v-model="password" />
      <span>{{ errors[0] }}</span>
    </ValidationProvider>

    <ValidationProvider name="confirm" rules="required" v-slot="{ errors }">
      <input type="password" v-model="confirmation" />
      <span>{{ errors[0] }}</span>
    </ValidationProvider>
  </ValidationObserver>
</template>

<script>
import { extend } from 'vee-validate';

extend('password', {
  params: ['target'],
  validate(value, { target }) {
    return value === target;
  },
  message: 'Password confirmation does not match'
});

export default {
  data: () => ({
    password: '',
    confirmation: ''
  })
};
</script>
person sailfish009    schedule 11.04.2020
comment
Это работает Спасибо за дополнительную информацию https://logaretm.github.io/vee-validate/advanced/cross-field-validation.html#targeting-other-fields - person Mohamed Raza; 19.01.2021