Vue-学习笔记-06 v-if详解

一、Vue中的v-if 和 v-show

v-if、v-else-if、v-else
这三个指令与JavaScript的条件语句if、else、else if类似。
Vue的条件指令可以根据表达式的值在DOM中渲染销毁元素组件
v-if的原理:
v-if后面的条件为false时,对应的元素以及其子元素不会渲染。
也就是根本没有不会有对应的标签出现在DOM中。

1.1 v-if 决定是否渲染 基本使用:

<body>
  <div id='app'>
      <h2 v-if="true">{{message}}</h2>
      <h2 v-if="false">{{message}}</h2>
  </div>
  
  <script src='../js/vue.js'></script>
  <script>
    let vm = new Vue({
      el:'#app',
      data:{
        message:'test'
      },
    })
  </script>
</body>

注意看DOM树里边根本就没有第二个h2标签!
在这里插入图片描述

1.2 v-show 决定是否显示

<body>
  <div id='app'>
      <h2 v-show="true">{{message}}</h2>
      <h2 v-show="false">{{message}}</h2>
  </div>
  
  <script src='../js/vue.js'></script>
  <script>
    let vm = new Vue({
      el:'#app',
      data:{
        message:'test',
        isShow:true
      },
    })
  </script>
</body>

效果:
在这里插入图片描述
这里注意看,第二个元素还是被渲染到DOM树里边了的,只是被设置为不显示。
这就是v-if 和v-show的最大区别。

1.3 v-if 和 v-show的区别

v-if 如果条件不满足,会直接不进行渲染。
v-show 无论如何都渲染,只是不满足条件是,会增加行内元素 display:none

注意,v-show 不支持 元素,也不支持 v-else。

那么如何选择呢?

一般来说,v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销。因此,如果需要非常频繁地切换,则使用 v-show 较好;如果在运行时条件很少改变,则使用 v-if 较好。

1.4 v-if 根据成绩返回评价

注意:在写v-else-if 的时候不用再这样写了:
<h2 v-else-if="score>=70 && score < 80">良好</h2>
这是没有必要的,因为上边已经判断过了。

<style>
  *{
    margin: 0;
    padding: 0;
    box-sizing: border-box;
  }
  [v-cloak]{
    display: none;
  }
  input{
    display: block;
    width: 100vw;
  }
</style>
<body>
  <div id='app' v-cloak>
      <input type="range" v-model='score' >
      <h2 v-if="score>=80">优秀</h2>
      <h2 v-else-if="score>=70">良好</h2>
      <h2 v-else-if="score>=60">合格</h2>
      <h2 v-else>不合格</h2>
  </div>
  
  <script src='../js/vue.js'></script>
  <script>
    let vm = new Vue({
      el:'#app',
      data:{
        score:95
      },
    })
  </script>
</body>

效果:
在这里插入图片描述
不过我们不建议这么做,因为这样会使我们的DOM树结构看起来很乱,参杂了一些逻辑运算,我们可以把它放到计算属性里边进行处理。
改进过后:

  <style>
    *{
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }
    [v-cloak]{
      display: none;
    }
    input{
      display: block;
      width: 100vw;
    }
  </style>
</head>
<body>
  <div id='app' v-cloak>
      <h2>{{result}}</h2>
  </div>
  <script src='../js/vue.js'></script>
  <script>
    let vm = new Vue({
      el:'#app',
      data:{
        score:95
      },
      computed: {
      	// es6的对象增强写法  等同于 result:function(){...}
        result(){
          let showMessage = "";
          if(this.score>=80){
            showMessage = "优秀";
          }else if(this.score>=70){
            showMessage = "良好";
          }else if(this.score>=60){
            showMessage = "合格";
          }else{
            showMessage = "不合格";
          }
          return showMessage
        }
      },
    })
  </script>
</body>

效果:
在这里插入图片描述

二、小案例 点击切换登录的类型

<body>
  <div id='app'>
      <span v-if="isUser">
        <!-- <label>账号登录: <input type="text" id="user" placeholder="请输入账号"></label> -->

        <label for="user">账号登录: </label>
        <input type="text" id="user" placeholder="请输入账号">
      </span>
      <span v-else>
        <!-- <label>邮箱登录: <input type="text" id="email" placeholder="请输入邮箱"></label> -->

        <label for="email">邮箱登录:</label>
        <input type="text" id="email" placeholder="请输入邮箱">
      </span>
      <button @click="isUser = !isUser"> 切换类型</button>
  </div>
  
  <script src='../js/vue.js'></script>
  <script>
    let vm = new Vue({
      el:'#app',
      data:{
        isUser:true
      },
    })
  </script>
</body>

效果:
在这里插入图片描述
这里牵扯到一个问题,input框中的内容为什么没有清空?
这是Vue的虚拟DOM的原因,它会在渲染的时候做出相应的处理,如果这次渲染的内容和标签 对比上次,如果没有绝对性的改变的话,它会对我们的标签进行复用,这就导致了,我们原来input里边的内容还存在的情况。
怎么解决这个问题呢?其实很简单,只需要给我们不希望进行复用的标签加上key就可以了,加上key它会把key作为一个标识,如果两个标签的key不相同,则不能服用,如果相同,则可以复用。

<body>
  <div id='app'>
      <span v-if="isUser">
        <!-- <label>账号登录: <input type="text" id="user" placeholder="请输入账号"></label> -->

        <label for="user">账号登录: </label>
        <input type="text" id="user" placeholder="请输入账号" key="username">
      </span>
      <span v-else>
        <!-- <label>邮箱登录: <input type="text" id="email" placeholder="请输入邮箱"></label> -->

        <label for="email">邮箱登录:</label>
        <input type="text" id="email" placeholder="请输入邮箱" key="emial">
      </span>
      <button @click="isUser = !isUser"> 切换类型</button>
  </div>
  
  <script src='../js/vue.js'></script>
  <script>
    let vm = new Vue({
      el:'#app',
      data:{
        isUser:true
      },
    })
  </script>
</body>

效果:
在这里插入图片描述
当然,解决的办法还有很多,比如使用隐式的label也可以达到同样的效果。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
`vue-property-decorator` 是一个用于在 Vue 中使用装饰器语法的库,它提供了一些装饰器来简化 Vue 组件的开发过程。这些装饰器可以用于定义组件的属性、方法、计算属性、生命周期钩子等。 以下是一些常用的装饰器和它们的用法: - `@Component(options?: ComponentOptions)`:将一个类声明为一个 Vue 组件。可以传入一个可选的 `ComponentOptions` 对象来配置组件选项,例如 `template`、`props`、`computed` 等。 - `@Prop(options?: (Vue.PropOptions | Vue.Constructor[] | Vue.Constructor)[] | Vue.PropOptions)`:定义一个组件的 prop 属性。可以传入一个可选的 `PropOptions` 对象来配置 prop 的类型、默认值等。 - `@Watch(path: string, options?: WatchOptions)`:监听一个属性或表达式的变化,并在变化时执行相应的方法。可以传入一个可选的 `WatchOptions` 对象来配置监听选项,例如 `deep`、`immediate` 等。 - `@Emit(event?: string)`:将一个方法标记为触发事件的方法,并指定要触发的事件名。可以传入一个可选的事件名,默认为方法名。 - `@Ref(refKey?: string)`:获取子组件或 DOM 元素的引用,并将其赋值给指定的属性。可以传入一个可选的引用键,默认为属性名。 - `@Inject(key?: string | symbol)`:注入一个父组件提供的属性或方法。可以传入一个可选的注入键,默认为属性名。 - `@Provide(key?: string | symbol)`:在组件中提供属性或方法,以供子组件注入使用。可以传入一个可选的提供键,默认为属性名。 - `@Model(event?: string, options?: (PropOptions | Constructor[] | Constructor)[] | PropOptions)`:将一个 prop 属性设置为组件的 v-model。可以指定要触发的事件名和 prop 的配置选项。 这些装饰器可以与 `vue-class-component` 一起使用,帮助我们更清晰、简洁地定义 Vue 组件,并提供更好的类型支持和可读性。 希望这些笔记对你有所帮助!如有任何疑问,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

优雅哥cc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值