如何使用密码验证确认密码并在每个字符处显示错误消息?

How to validate confirm password with password and show error message at every character?

这是我的码笔linkhttps://codepen.io/santoshch/pen/bGgKNWV

 <label class="form__group is-required">
    <span class="form__label">Password</span>
    <input
      class="form__input" type="password" name="form-password"
      v-model="password" @input="$v.password.$touch"
    >
    <p v-if="$v.password.$dirty">
      <span class="form__alert" v-if="!$v.password.required">Required.</span>
      <span class="form__alert" v-if="!$v.password.minLength">
        {{$v.password.$params.minLength.min}} letters at least.
      </span>
    </p>
  </label>
  <!-- Repeat Password -->
  <label class="form__group is-required">
    <span class="form__label">Repeat<br>password</span>
    <input
      class="form__input" type="password" name="form-repeat-password"
      v-model="repeatPassword" @input="$v.repeatPassword.$touch"
    >
    <p v-if="$v.repeatPassword.$dirty">
      <span class="form__alert" v-if="!$v.repeatPassword.required">Required.</span>
      <span class="form__alert" v-if="!$v.repeatPassword.sameAsPassword">
        Must be identical.
      </span>
    </p>
  </label>
得到了 Vuetify 的参考, How to validate password field with every character in Vuejs?
export default {
    data() {
        return {
        confirmPasswordRules: [
           (value) => !!value || 'type confirm password',
           (value) =>
           value === this.password ||
           'The password confirmation does not match.',
        ],
}
:rules="confirmPasswordRules"

Codepen 中提供的 Ya 代码运行良好。但还需要为 confirmPassword 文件添加一项功能。即,在 confirmpassword 字段中,我需要检查密码字段中的每个字符,然后我需要显示我们输入错误的字符。

首先从 HTML 中删除 :rules,然后只使用 vuelidate。从数据对象中删除 属性 confirmPasswordRules。因为他们什么都没做,只是在浪费 space.

<span class="form__label">
  Repeat<br />
  password
</span>

现在比较你的两个密码时,如果你想逐个字符地检查,你会想要得到你现有密码字符串的子字符串。例如,假设密码是 test1234,如果用户开始在您的重复密码字段中输入 tes,您将密码的子字符串匹配相同的长度,这样您就不会比较 "test1234" == "tes",取而代之的是你要比较的子字符串 "tes"=="tes"。我们通过调用 .substring(start, end) 来做到这一点。我们的起点将始终为 0,而我们的终点将是 repeatPassword 的当前长度,因此我们将获得从起点到用户重复输入密码的那一点的字符串。

要使用 Vuelidate 做到这一点,我们需要创建一个 returns 布尔值的自定义函数。所以我们创建内联函数:

(value) => value === this.password.substring(0, value.length+1)

但是,由于 vuelidate 的工作方式 this will be inaccessible。所以我们需要再传递一个参数给包含 Vue 实例的函数。我们可以通过更改我们的函数以期望两个变量来做到这一点,一个包含对象的当前值,另一个包含 Vue 实例。然后我们将用 Vue 实例的变量替换 this

(value,vm) => value === vm.password.substring(0, value.length+1)

我们会将这个函数放在您的 validations 代码中,在 repeatPassword 下。这将使我们的 repeatPassword 对象看起来像这样:

repeatPassword: {
  required: required,
  sameAsPassword: (value, vm) =>
      value === vm.password.substring(0, value.length+1),
},

这里是完整的codesandbox