Vuelidate复选框验证

Posted

技术标签:

【中文标题】Vuelidate复选框验证【英文标题】:Vuelidate check box validation 【发布时间】:2018-12-14 11:32:42 【问题描述】:

我正在使用 Vue.js,我是新手。我目前正在验证。我曾使用 vuelidate 作为我的验证库。我已经成功完成了表单验证,但是当我不得不检查复选框的验证时出现了问题。

如何检查复选框的验证?另外,我使用 bootstrapvue 来显示复选框。

   <b-col lg="6" md="6" sm="6">
      <label>Bus Route</label>
      <b-form-group>
        <b-form-checkbox v-for="route in busRouteList"
                         v-model.trim="selectedRoute"
                         v-bind:value="route.value"
                         v-bind:unchecked-value="$v.selectedRoute.$touch()">
          route.text</b-form-checkbox>
      </b-form-group>
      <div class="form-group__message" v-if="$v.selectedRoute.error && !$v.selectedRoute.required">
        Field is required
      </div>
    </b-col>

validations: 

      selectedRoute: 
        required
      ,

【问题讨论】:

您可以发布您的数据()吗?你是如何初始化 selectedRoute 的? 【参考方案1】:

这对我有用。 基本上,您需要将其值 'sameAs' 设为布尔值 'true',这意味着复选框已被选中。 所以,即:

privacyCheck: 
  sameAs: sameAs(true)
,

【讨论】:

【参考方案2】:

`

validations: 
    terms: 
        checked: (val) => return val;
    

`

【讨论】:

【参考方案3】:

使用vuelidate-next(支持 Vue 2 和 Vue 3)就像使用 sameAs 内置验证器和 true 作为直接参数一样简单。例如,在 setup 方法中使用时:

const termsAccepted = ref(false)

const v$ = useVuelidate(
   termsAccepted:  sameAs: sameAs(true)  ,
   termsAccepted 
)

return  v$, termsAccepted 

【讨论】:

【参考方案4】:

因为 false 也是有效值,所以你应该尝试使用sameAs

import  sameAs  from 'vuelidate/lib/validators'

terms: 
   sameAs: sameAs( () => true ) 

【讨论】:

差不多,更像:terms: sameAs: val =&gt; val === true . @zenw0lf 您的建议不起作用,因为根据文档:“当作为函数提供时,它接收正在验证的模型作为参数”而不是值。所以它更像terms: sameAs: vueModel =&gt; vueModel.terms === true 无论如何,帖子所有者提供的解决方案是最好的。 @icosmin 阅读关于自定义验证器的部分。有用。我已经使用并测试了该验证器以要求用户接受 ToS 等。vuelidate.js.org/#custom-validators【参考方案5】:

我希望这个小例子能帮助您了解如何验证复选框。 您必须检查输入何时更改。我建议您使用@change。

在模板中

<div class="input">
  <label for="country">Country</label>
  <select id="country" v-model="country">
    <option value="usa">USA</option>
    <option value="india">India</option>
    <option value="uk">UK</option>
    <option value="germany">Germany</option>
  </select>
</div>
<div class="input inline" :class="invalid: $v.terms.$invalid">
  <input type="checkbox" id="terms" v-model="terms" @change="$v.terms.$touch()">
  <label for="terms">Accept Terms of Use</label>
</div>

因此,如果所选国家/地区为德国,则条款将有效。

validations: 
  terms: 
    checked(val) 
      return this.country === "germany" ? true : val;
    
  

当然是国家,术语在 data() 中定义:

country:'',
terms: false

【讨论】:

【参考方案6】:

你应该绑定@change方法:

 <b-form-checkbox v-for="route in busRouteList"
                         v-model.trim="selectedRoute"
                         v-bind:value="route.value"
                         @change="$v.selectedRoute.$touch()">

你可能想使用自定义函数:

selectedRoute: 
  checked (val) 
    return val
  
,

【讨论】:

以上是关于Vuelidate复选框验证的主要内容,如果未能解决你的问题,请参考以下文章

Vuelidate requiredIf 不使用复选框

如何在 vuelidate 中动态设置验证字段

Vuelidate:使用子组件验证表单

为啥 vuelidate 验证器不再对输入更改做出反应?

Vuelidate 未正确验证表单数据

Vuelidate 异步验证结果到循环