延迟Vuelidate验证,直到从远程API获取数据

ejk8hzay  于 2023-08-07  发布在  Vue.js
关注(0)|答案(2)|浏览(139)

我已经将Vuelidate添加到我的Quasar 2应用程序中,并在输入字段上进行了非常简单的required验证。验证本身工作正常,但这里是我的问题:
组件的onMounted函数从API获取一些数据。此数据用于初始填充表单。但是,对于时间加载,输入字段的计算结果为invalid。只有数据到达后,输入字段才有效。
是否可以在API调用完成后才开始验证?
请参阅Codesandbox上的以下示例,该示例通过添加5秒的超时来“模拟”加载过程:
https://codesandbox.io/s/condescending-fast-h7ld0c?file=/src/pages/Index.vue

ie3xauqp

ie3xauqp1#

这是一个异步验证的案例。
我也有类似的需求:在我的情况下,从一个下拉列表中选择一个值将触发一个HTTP请求,以动态填充另一个下拉列表中的选项。我的验证条件是,第二个下拉列表中的选定值需要匹配其动态选项之一。
在您的例子中,您应该使用helpers.withAsync()来告诉Vuelidate在应用验证之前等待后端调用的结果。这个助手在你的异步验证器函数 * 返回一个验证结果 * 的情况下非常直观,即用户输入一个值,然后向某个端点发出一个返回truefalse的请求。
在您的情况下,它不太直观,因为您正在等待的异步操作返回的是一个值 *,您需要对 * 应用验证,而不是验证本身的结果。
下面是我创建的一个CodeSandbox来探索这个场景。你会想看看案例2和案例3。
具体来说,在案例3中,我模拟了一个对后端的调用,以获取新的下拉选项。案例3中应用的验证器方法称为asyncIncludes(),这就是事情变得有点棘手的地方。
因为我的验证依赖于后端调用,但后端调用本身并不返回验证结果,所以我将mockFetch()返回的promise存储在一个变量中,并指示Vuelidate监视该绑定,并在其值更改时重新触发验证。
为了在Vuelidate验证器中观察React值,库需要在helpers.withParams()中 Package 验证器函数。这就自动需要将验证器编写为高阶函数,它接受一个参数作为参数(在本例中为promise)并返回一个验证器函数。
然后,在helpers.withParams()中,我提供了一个封装在helpers.withAsync()中的异步验证器,以在应用验证之前等待传递给asyncIncludes的promise的结果。
其结果是,每当相应的HTTP调用被触发时,产生的promise都存储在Vuelidate监视的变量中,Vuelidate重新触发验证器。碰巧验证器是异步的,在评估验证条件并返回结果之前,它将等待promise解析。
Vuelidate提供的$error属性是一个表示.$invalid.$dirty.$pending的便利属性。异步验证器更新$pending,Vuelidate将在$pending为true时挂起$error状态(即当你的async操作发生时)。
希望这对你有帮助!

eoigrqb6

eoigrqb62#

我更改了v-model属性以使用Vuelidate的属性,另外,使用$error属性代替$invalid

<q-input
  v-model="v$.title.$model"
  :error="v$.title.$error"
/>

字符串
这似乎是可行的,也就是说,字段最初是有效的,直到数据被提取。如果用户随后清除该字段,则该字段将变为无效。
https://codesandbox.io/s/prod-forest-7u0916?file=/src/pages/Index.vue

相关问题