使用计算属性 Vue 2 的条件类绑定

Posted

技术标签:

【中文标题】使用计算属性 Vue 2 的条件类绑定【英文标题】:Conditional class binding using computed prop Vue 2 【发布时间】:2020-02-07 13:47:50 【问题描述】:

我想提供一些表单视觉验证提示,所以我尝试使用类绑定来做到这一点。如果我使用三元内联,它并不能真正满足我对应该发生的情况的要求,但是当我尝试使用计算属性时,它会使所有其他组件消失。

如果我尝试这样做:v-bind:class="[(!validation.hasError('form.fullName'))?'has-success':'has-danger noValid']"

它只触发一次动画和类,然后它们就停留在那里。如果验证出现错误,我想在每次用户单击我的提交按钮时触发 noValid 动画。

顺便说一句,我正在使用 simple-vue-validator。

这是 Godforsaken 组件,我使用 Creative Tim 的 vue now-ui-kit 模板作为基础,并从那里自定义我的方式。这是他们的表单组输入组件,docs here

<fg-input
  class="input-lg"
  :label="validation.firstError('form.fullName')"
  placeholder="Full Name..."
  v-model="form.fullName"
  addon-left-icon="now-ui-icons users_circle-08"
  v-bind:class=" visualValidation "
></fg-input>

按钮组件:bootstrap-vue,因为他们自定义的按钮并不能真正满足我的目的

<b-button type="submit" block pill variant="info" @click="submit">Submit Form</b-button>

我的计算:noValid 是抖动动画类,has-success 和 has-danger 只是改变了它们的外观。

computed: 
    visualValidation: function() 
      const successClass = "has-success";
      const errorBoi = "has-danger";
      const shakeBoi = "noValid";
      if (validation.firstError("form.fullName")) 
        return errorBoi + " " + shakeBoi;
       else if (!validation.hasError("form.fullName")) 
        return successClass;
      
    
  

我认为我返回的变量将作为类绑定到 form.fullName 模型,但它没有做任何事情,更好的是,它使我的所有其他组件都没有呈现。

我应该在这里做什么?我刚开始学习 Vue.js,所以我不太明白这里发生了什么。

从这里编辑:

我将逻辑重写到我的类绑定中,只需使用方法在单击组件时删除类。

这是更新的组件:

<fg-input
              class="input-lg"
              :label="validation.firstError('form.email')"
              placeholder="Email Here..."
              v-model="form.email"
              addon-left-icon="now-ui-icons ui-1_email-85"
              v-bind:class=" 'has-success' : isSuccEmail, 'has-danger' : isFailEmail, 'noValid': validNoEmail "
              @click="removeShake()"
            ></fg-input>

数据:

isSuccEmail: false,
isFailEmail: false,
validNoEmail: false

方法:

removeShake: function() 
      let vm = this;
      vm.validNoName = false;
      vm.validNoEmail = false;
      console.log(vm.validNoEmail);
      console.log(vm.validNoName);
    ,

但是,目前存在一个错误,即验证器不单独验证。它使课程成功通过电子邮件发送,即使它是成功的全名。

    valEmail: function() 
      let vm = this;

      vm.$validate("form.email").then(function(success) 
        if (success) 
          vm.isFailEmail = false;
          vm.isSuccEmail = true;
         else if (!success) 
          vm.isSuccEmail = false;
          vm.isFailEmail = true;
          vm.validNoEmail = true;
         else 
          alert("Fatal Error");
        
      );
    ,
    valName: function() 
      let vm = this;

      vm.$validate("form.fullName").then(function(success) 
        if (success) 
          vm.isFailName = false;
          vm.isSuccName = true;
         else if (!success) 
          vm.isSuccName = false;
          vm.isFailName = true;
          vm.validNoName = true;
          console.log(vm);
         else 
          alert("Fatal Error");
        
      );
    

$validate 是 simple-vue-validator 的一个函数,the docs。

提交函数就是调用上面那两个函数。

我认为这是由于 promise 调用,有没有办法在没有 promise 的情况下调用 $validate()?

【问题讨论】:

【参考方案1】:

这里有一些问题。

首先,虽然模板不要求您使用this.,但您仍然需要在您的 JS 代码中使用它。您应该会在控制台中看到错误,甚至可能在编译时看到错误,具体取决于您配置 linting 的方式。

if (validation.firstError("form.fullName")) 

validation 是什么?我认为应该是this.validation。同样,再往下几行。

你的下一个问题在这里:

v-bind:class=" visualValidation "

这里的大括号是创建一个对象字面量,所以它等价于:

v-bind:class=" visualValidation: visualValidation "

这将有条件地将字符串 'visualValidation' 添加为 class ,这不是您想要的。摆脱大括号:

v-bind:class="visualValidation"

【讨论】:

抱歉,忘记编辑了,所以整个方法有点复杂,并不能真正满足我的目的。我想为点击提交时的验证错误创建一个抖动动画,就是这样。我去更改逻辑以使用类绑定,单击组件时删除类。瞧。但是现在我认为使用promise引起了一个错误,我会将更新的代码放入编辑中。

以上是关于使用计算属性 Vue 2 的条件类绑定的主要内容,如果未能解决你的问题,请参考以下文章

Vue 计算属性和监视属性详解细节 class类绑定和style样式绑定

Vue保姆级入门教程

关于vue的计算属性以及双向绑定的原理理解(vue2.x)以及vue3.0

Vue计算属性及样式绑定

Vue的指令系统计算属性和表单输入绑定

Vue计算属性及样式绑定