我已经将Vuelidate添加到我的Quasar 2应用程序中,并在输入字段上进行了非常简单的required
验证。验证本身工作正常,但这里是我的问题:
组件的onMounted
函数从API获取一些数据。此数据用于初始填充表单。但是,对于时间加载,输入字段的计算结果为invalid
。只有数据到达后,输入字段才有效。
是否可以在API调用完成后才开始验证?
请参阅Codesandbox上的以下示例,该示例通过添加5秒的超时来“模拟”加载过程:
https://codesandbox.io/s/condescending-fast-h7ld0c?file=/src/pages/Index.vue
2条答案
按热度按时间ie3xauqp1#
这是一个异步验证的案例。
我也有类似的需求:在我的情况下,从一个下拉列表中选择一个值将触发一个HTTP请求,以动态填充另一个下拉列表中的选项。我的验证条件是,第二个下拉列表中的选定值需要匹配其动态选项之一。
在您的例子中,您应该使用
helpers.withAsync()
来告诉Vuelidate在应用验证之前等待后端调用的结果。这个助手在你的异步验证器函数 * 返回一个验证结果 * 的情况下非常直观,即用户输入一个值,然后向某个端点发出一个返回true
或false
的请求。在您的情况下,它不太直观,因为您正在等待的异步操作返回的是一个值 *,您需要对 * 应用验证,而不是验证本身的结果。
下面是我创建的一个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操作发生时)。希望这对你有帮助!
eoigrqb62#
我更改了
v-model
属性以使用Vuelidate的属性,另外,使用$error
属性代替$invalid
。字符串
这似乎是可行的,也就是说,字段最初是有效的,直到数据被提取。如果用户随后清除该字段,则该字段将变为无效。
https://codesandbox.io/s/prod-forest-7u0916?file=/src/pages/Index.vue