vue之v-on与v-if

1、事件监听

1.1、v-on的基本使用

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="../../js/vue.js"></script>
</head>

<body>
  <div id="app">
    <h2>{{message}}</h2>
    <!--第一种:处理普通的操作-->
    <!--
      <button v-on:click="message++">+</button>
      <button v-on:click="message--">-</button>
     -->

    <!--第二种:可以处理复杂的操作-->
    <!--
      <button v-on:click="add">+</button>
      <button v-on:click="sub">-</button>
    -->

    <!--第三种:语法糖写法-->
    <button @click="add">+</button>
    <button @click="sub">-</button>
  </div>

  <script>
    let vm = new Vue({
      el: '#app',
      data: {
        message: '0'
      },
      methods: {
        add() {
          return this.message++;
        },
        sub() {
          return this.message--;
        }
      }
    });
  </script>
</body>
</html>

在这里插入图片描述

1.2、v-on传参问题

  • 在不需要传参时,可以省略括号,需要传参时,在括号内传参。
    <div id="app">
      <!--1、不需要传入方法时,可以省略括号-->
      <button @click="btn1click">按钮一:有()</button><br/><br/>
      <button @click="btn1click">按钮一:无()</button><br/><br/>
      <!--2、需要传入参数时,传入数字时不加单引号也会直接解析成number类型
      传入符合规范的名字,但没有加单引号时vue会解析为变量去data找,找不到则报错
      -->
        <!--传入普通值时,显示普通值,传入this,则当前(el)dom对象-->
      <button @click="btn2click('abc')">按钮二:传参</button><br/><br/>
      <!--不传值,但显示括号不会报错,需要传的值为undefined-->
      <button @click="btn2click()">按钮二:不传参,有括号</button><br/><br/>
      <!--不传值,也不显示括号,vue默认会将浏览器生成的event事件作为参数传入-->
      <button @click="btn2click">按钮二:不传参,无括号</button><br/><br/>
      <!--3、既传入event事件,又传入普通参数-->
      <!--什么都不填,则默认第一个传入event对象,第二个传入undefined-->
      <button @click="btn3click">按钮三:无括号</button><br/><br/>
      <!--传入$event则表示传入的传入为event事件对象-->
      <button @click="btn3click('abc',$event)">按钮三:有括号</button>
    </div>
  
    <script>
      let vm = new Vue({
        el: '#app',
        data: {
          message:  ''
        },
        methods: {
          btn1click(){
            console.log("点击了btn1");
          },
          btn2click(name){
              console.log("btn2传入的参数值为:",name);
          },
          btn3click(name,event){
              console.log("btn3传入的参数值为:",name,event);
          }
        }
      });
    </script>

第一种情况:

在这里插入图片描述
第二种情况:
在这里插入图片描述
第三种情况:
在这里插入图片描述

1.3、v-on修饰符

  <div id="app">
    <div @click.stop="btnDIV">
      <!-- .stop阻止冒泡操作,就是内部元素在点击时,外部元素存在点击事件时也会触发 -->
      <button @click.stop="btnButton">点我</button>
      <!--压制原有元素的作用,如压制a标签使其提交表单-->
      <a class="a_submit" href="#" @click.prevent="aButton">点我</a>
      <!--压制默认行为,使其不让表单提交-->
      <form @submit.prevent></form>
      <!--串联操作-->
      <button @click.stop.prevent></button>
      <!--键修饰符,监听enter键,还可以使用按键的代码进行监听(像ASCII码)-->
      <input @keyup.stop.enter="enterInput"/>
      <!--只有第一次点击起作用,后面的无效-->
      <button @click.once="buttonOnce"></button>
    </div>
  </div>

  <script>
    let vm = new Vue({
      el: '#app',
      data: {
        message: ''
      },
      methods: {
        btnButton() {
          console.log("btnButton");
        }, btnDIV() {
          console.log("btnDIV");
        }, aButton() {
          $(this).submit();
        },enterInput(){
          console.log("enterInput");
        },buttonOnce(){
          console.log("buttonOnce");
          
        }
      }
    });
  </script>

在这里插入图片描述

.native:是组件可以操作,未加组件不是不能实现点击等事件。
在这里插入图片描述

2、条件判断

2.1、v-if的使用

<div id="app">
    <h2 v-if="isShow">{{message}}</h2>
</div>

<script>
    let vm = new Vue({
        el: '#app',
        data: {
            message:  '为true则显示我',
            isShow: false
        },
        methods: {}
    });
</script>

在这里插入图片描述

2.2、v-if和v-else的使用

    <div id="app">
      <h2 v-if="isShow">{{showContent}}</h2>
      <h2 v-else>{{hideContent}}</h2>
    </div>
  
    <script>
      let vm = new Vue({
        el: '#app',
        data: {
          showContent:  '为true则显示我',
          hideContent:  '为false则显示我',
          isShow: false
        },
        methods: {}
      });
    </script>

在这里插入图片描述

3、v-if和v-else-if和v-else的使用

使用标签:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>条件判断</title>
  <style>
    h2{
      display: inline-block;
    }
  </style>
  <script src="../../js/vue.js"></script>
</head>
<body>
    <div id="app"><h2>您的成绩:</h2>
      <h2 v-if="score>=90">优秀</h2>
      <h2 v-else-if="score>=80">良好</h2>
      <h2 v-else-if="score>=70">一般</h2>
      <h2 v-else-if="score>=60">及格</h2>
      <h2 v-else>差劲</h2>
    </div>
  
    <script>
      let vm = new Vue({
        el: '#app',
        data: {
          score: 90
        },
        methods: {}
      });
    </script>
</body>
</html>

在这里插入图片描述
使用计算属性:

<div id="app">
    <h2>您的成绩:{{result}}</h2>
</div>

<script>
    let vm = new Vue({
        el: '#app',
        data: {
            score: 90
        },
        computed: {
            result() {
                if (this.score >= 90) {
                    return "优秀";
                } else if (this.score >= 80) {
                    return "良好";
                } else if (this.score >= 70) {
                    return "一般";
                } else if (this.score >= 60) {
                    return "及格";
                } else {
                    return "差劲";
                }
            }
        }
    });
</script>

在这里插入图片描述

2.4、实战小案例

2.4.1、实现
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="../../js/vue.js"></script>
</head>
<body>
    <div id="app">
      <span v-if="isUser">
          <label for="username">用户账号:</label>
          <input type="text" placeholder="用户账号" id="username">
      </span>
      <span v-else>
        <label for="email">用户邮箱:</label>
        <input type="text" placeholder="用户邮箱" id="email">
      </span>
        <button @click="isUser = !isUser">切换样式</button>
    </div>
  
    <script>
      let vm = new Vue({
        el: '#app',
          .
          message:  '',
          isUser :true
        },
        methods: {}
      });
    </script>
</body>
</html>

在这里插入图片描述
在这里插入图片描述

8.4.2、小问题
  • 当点击切换样式时,用户输入的数据库不会被清空。

在这里插入图片描述
在这里插入图片描述

原理:

  • vue内部存在一个虚拟DOM,虚拟DOM不会直接把需要加载的html输出,而是先在虚拟DOM中渲染。
  • 如果存在两个相同的标签,并且不会同时显示时(v-if和v-else),它会处于对性能的考虑,对于标签进行复用。
  • vue不会删除标签再重新创建标签,而是将两个标签进行比对,只修改不同的地方(属性),在将不同的数据重新渲染到已存在的标签上,用户的数据vue不会做修改。
  • 虚拟DOM使用patch()函数将数据渲染到视图上。
    在这里插入图片描述
    在这里插入图片描述

解决方案:设置两个不同的key,即可解决用户输入数据不被处理的问题。

  • 使用不同key就不会服复用了。
    在这里插入图片描述

在这里插入图片描述

2.5、v-show

  • 和v-if有同样效果,但是实现的方式不同:
    • v-if:为false直接从DOM中删除,为true再加回来。
    • v-show:为false使用display:none隐藏,为true则删除display:none。
  • 开发选择:
    • 当显示和隐藏切换频繁时,使用v-show。
    • 当显示和隐藏切换不频繁,只有一次时,使用v-if。
<body>
    <div id="app">
      <h2 v-if="isShow">你好</h2>
      <h2 v-show="isShow">你好</h2>
    </div>
  
    <script>
      let vm = new Vue({
        el: '#app',
        data:{
          isShow:true
        }
      });
    </script>
</body>

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值