【问题标题】:Vue setting 2 conditions with v-ifVue用v-if设置2个条件
【发布时间】:2019-03-20 03:49:12
【问题描述】:

我在练习 Vue 时遇到问题,是否可以使用 v-if 设置 2 个条件?我的意思是这是我的代码:

所以基本上可以使用 && 设置两个条件还是应该以不同的方式完成?

更新的完整代码:

我尝试了 3 种方法,内部模板、方法和计算方法,它们都只检查一个条件

在你们的帮助下,我对它进行了一些修改,现在它可以工作了!非常感谢大家的帮助,但最后一件事,在控制台日志中显示:“Uncaught TypeError: _vm.validated is not a function”, 显示验证是否正确无关紧要

<template>
  <div id='add-blog'>
      <h2>Add news Blog Post</h2>
      <form v-if='is_validated'>
          <label>User</label>
          <input type='text' v-model.lazy='user' required />
          <label>Password</label>
          <input type='password' v-model.lazy='password' required />
          <button v-on:click.prevent='validated'>Check me</button>
      </form>
      <div v-else>
          <p>error</p>
    </div>
  </div>
</template>

<script>
export default {
  components: {},
  data() {
    return {
      user: "",
      password: "",
      is_validated: true,
    };
  },
  computed: {
    validated() {
      if (this.user == 'name' &&  this.password == '111') {
          return this.is_validated = false;
      }
    }
  },
};
</script>

【问题讨论】:

  • 嗯,你跑了吗?你所拥有的应该工作。如果我没记错的话,任何有效的javascript表达式都可以进去。
  • 是的,这是可能的,但我建议不要将逻辑放在模板中,而是使用计算属性
  • @Zirek ,您使用哪个 Vue 版本?,因为那假设可以工作您是否尝试过没有 .lazy 的 v-mode
  • @mooga 我正在使用 Vue 2.5.11,问题是它只检查第一个条件但不检查第二个条件
  • @Zirek 你试过!==。关于它的字符串

标签: javascript html vue.js vuejs2 vue-component


【解决方案1】:

我建议将您的逻辑放在脚本部分中,并且只调用模板中的属性和方法:

   <form v-if="validated">
      <label>User</label>
      <input type='text' v-model.lazy='user' required />
      <label>Password</label>
      <input type='password' v-model.lazy='password' required />
  </form>

计算属性 'validated' 将检查提供的输入,如果存在则返回一个布尔值:

     <script>
       export default {
             data() {
                return {
                user:'',
                 password:''
               };
          },
      computed:{
         validated(){return this.user != 'name' && this.password != '111'}
         }
        };
   </script>

new Vue({
  el: '#app',

  data() {
    return {
      user: '',
      password: ''
    }
  },
  computed: {
    validated() {

      if (!this.user && !this.password) {
        return true;
      } else if (this.user !== 'name') {
        if (!this.password) return true
        else if (this.password !== '111') return true
        else return false

      } else if (this.user == 'name') {
        if (!this.password) return true
        else if (this.password !== '111') return true
        else return false
      } else if (this.password !== '111') {
        if (!this.user) return true
        else if (this.user !== 'name') return true
        else return false

      } else if (this.password == '111') {
        if (!this.user) return true
        else if (this.user !== 'name') return true
        else return false
      }
    }
  }
});
<link type="text/css" rel="stylesheet" href="//unpkg.com/bootstrap/dist/css/bootstrap.min.css" />

<!-- Add this after vue.js -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.16/vue.js"></script>



<div id="app" class="container">
  <div v-if="validated">
    <form>
      <label>User</label>
      <input type='text' v-model.lazy='user' required />
      <label>Password</label>
      <input type='password' v-model.lazy='password' required />

    </form>
  </div>
  <div v-else>
    <p>Error !</p>
  </div>
</div>

【讨论】:

    【解决方案2】:

    您当然可以在 v-if 语句中编写复杂的表达式。根据官方文档关于expressions和vue中的指令

    指令属性值应为单个 JavaScript 表达

    对于我在您的示例中看到的情况,您的单个文件组件可能与正确的结构不匹配。如果你看一下单文件组件guide

    您会看到您的组件需要一个标签,并且您应该在内部使用您最喜欢的模板语言编写模板。如果您将条件放在计算属性中,它也会更干净。如果我们将所有这些都考虑在内,您可以使用与此类似的代码来实现您的目标:

    <template>
     <div>
       <form v-if="showForm">
          <label>User</label>
          <input type='text' v-model.lazy='user' required />
          <label>Password</label>
          <input type='password' v-model.lazy='password' required />
       </form>
       <div v-else>
         <p></p>
       </div>
     </div><!-- it's a good practice to have only one root element -->
    </template>
    
    <script>
    export default {
      data() {
        return {
            user:'',
            password:''
        };
      },
      computed: {
       showForm () {
         return user != 'name' && password != '111';
       }
      }
    };
    </script>
    

    【讨论】:

    • 问题是,它只检查一个条件,所以如果我在用户区 'name' 中写入,它会显示第二个 div 而无需等待密码,如果我跳过用户并只写 ' 111进入密码区,它也显示第二个没有用户的div,我写在v-if=''里面,或者我使用计算属性都没有关系
    • 我再次检查条件,可能是您使用的表达式可能导致问题。您可以尝试使用双 '=' 符号,以便您的表达式看起来像这个用户!== 'name' && 密码!== '111';
    • 我也试过 != 和 !== ,可惜效果还是一样
    • @Zirek 您所描述的是该 if 语句结构的预期行为。当您在用户区输入'name'时,div会显示,因为密码是空字符串并且''!='111'。所以双方评价为真。如果您希望仅在用户在两个框中输入文本时才显示/隐藏,请使用: user != 'name' && password != '111' && user != '' && password != ''
    【解决方案3】:

    您是否尝试过为完​​整的表格创建flag

    更新

    <template>
      <div id='add-blog'>
          <h2>Add news Blog Post</h2>
          <form v-if='is_validated'>
              <label>User</label>
              <input type='text' v-model.lazy='user' required />
              <label>Password</label>
              <input type='password' v-model.lazy='password' required />
              <button @click='validated()'>Check me</button>
          </form>
          <div v-else>
              <p>error</p>
        </div>
      </div>
    </template>
    
    <script>
    export default {
      components: {},
      data() {
        return {
          user: "",
          password: "",
          is_validated: true,
        };
      },
      methods(): {
        validated() {
          if (this.user == 'name' &&  this.password == '111') {
             this.is_validated = false
          }
        }
      },
    };
    </script>
    

    【讨论】:

    • 应该是计算属性,而不是方法
    • 你的解决方案在我用按钮连接后运行良好:) 谢谢!但你能不能只在我更新代码时检查一下,它显示错误事件验证正在正确运行
    • @Zirek 因为你在 computed 中使用它,你应该在 methods: { } 中使用它
    • @Zirek,欢迎您,不要忘记将其标记为解决方案
    猜你喜欢
    • 2023-03-20
    • 2020-02-25
    • 2018-09-03
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 2018-04-04
    • 1970-01-01
    相关资源
    最近更新 更多