forms - Vuelidate 未正确验证表单数据

标签 forms vue.js vuejs2 vue-component vuelidate

我有一个 Vue 组件,其中包含一个安装了 Vuelidate 表单验证插件的表单,我想使用 Axios 进行 API 调用,以检查数据库中是否已获取用户名。如果确实使用了用户名,则还没有实际显示任何内容的功能,但 Vuelidate 对象 $v 仍应具有反应性,并根据我的 Axios API 更新其 username 属性打电话。

加入.vue

<template>
<form id="join">
<input
          name="username"
          placeholder="Username"
          v-model.lazy="username"
          @blur="$v.username.$touch()"
          type="text"
          autocomplete="off"
        />
... (submit button and other irrelevant stuff) ...
</form>
</template>
<script>
import { required } from 'vuelidate/lib/validators'
import Api from '@/services/Api'
export default {
  data() {
    return {
      username: ''
    }
  },
  validations: {
    username: {
      required,
      isUnique(username) {
        if (username === '') return true

        return Api()
          .get('/validate', {
            params: { field: 'username', value: username }
          })
          .then(res => {
            console.log(res.data)
            return res.data.status
          })
          .catch(error => {
            console.error(error)
          })
      }
    }
  }
}
</script>

Axios 调用从 API 获取正确的 JSON 响应,该响应显示在 Chrome DevTools 中(状态 200 OK):

/validate?field=用户名&值=测试(用户名可用)

{"status":true}

/validate?field=username&value=Admin(用户名已使用)

{"status":false}

预期结果和问题:

isUn​​ique() 应进行 API 调用,并在获得响应后返回 truefalse 值,具体取决于是否用户名是否已被占用(res.data.status)。然后,$v 的属性应该根据要验证的表单进行相应更改。

响应已正确记录在 Javascript 控制台中。但是,即使控制台记录 { status: true },$v.username 始终无效 ($v.username.$invalid: true)。

此外,似乎 Axios .then Promise 无法正确解析,或者 Vuelidate 未收到解析值,因为 $pending 仍然存在验证输入字段并记录响应后设置为 true。

在更改输入字段的值之前,$pending 设置为 false。

控制台或构建我的 Vue 应用程序时没有错误。如何让 Vuelidate 等待响应,然后实际让 isUn​​ique() 返回正确的 bool 值?

最佳答案

我可以通过将 async 添加到 isUn​​ique() 方法来解决此问题。

关于forms - Vuelidate 未正确验证表单数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55344944/

相关文章:

javascript - 在 HTML 表单提交上从 MySQL DB 创建唯一的 URL/页面

image - vue-advanced-cropper 图像裁剪尺寸比原始尺寸大

javascript - 使用方法获取数组以使用 V-for 循环进行迭代,但没有显示任何内容

javascript - 选择表单(下拉菜单)上的 Cakephp onChange 事件

java - HTML 表单提交带有多个双引号的值

php - 尝试在单个文本字段中显示由多个单词组成的 mysql 数据

javascript - 在 vuejs 的方法中为选择赋值?

javascript - vue.js + Android 键盘 - 模型上缺少最后输入的单词

azure - 根据 Auth0 在本地对 Vue 2 Azure 静态 Web 应用程序进行身份验证

javascript - 如何将数据传递给vue router router-view?