04-ES6语法、事件监听和条件判断

本文介绍了ES6中的let与const关键字,它们带来的块级作用域特性,以及在变量管理和事件处理中的应用,包括v-if/v-else-if/v-else在条件渲染中的使用和Vue中的事件绑定技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、ES6语法

var和let

在ES6之前,我们不管是变量还是常量都使用var来定义,这种设计很不合理,存在很大的缺陷,因为它没有块级作用域的概念,什么是块级作用域呢?就是一个变量它可以作用的范围,没有块级作用域会产生什么后果呢?我们来看下面的代码:

<body>
  <button>点击</button>
  <button>点击</button>
  <button>点击</button>
  <button>点击</button>
  <button>点击</button>
  <script>
    if (true){
      var a=10;
    }
    console.log(a);//10  变量定义在if里面,可是外面依旧可以访问

    var btns=document.getElementsByTagName("button");
    for (var i=0;i<btns.length;i++){
      btns[i].addEventListener("click",function () {
        console.log("第"+i+"个按钮被点击");//不管点击哪一个都是“第5个按钮被点击”
      })
    }
  </script>
</body>

从上面可以看到,我们在if块内定义的变量a在块外部依旧可以被访问到;还有for循环给按钮添加点击事件,不管点击哪一个按钮,都是输出“第5个按钮被点击”,这显然不是我们所希望的。那么这是为什么呢?因为没有块级作用域的话,使用var定义的变量将可以在任何地方使用,没有范围限制,从你定义它开始,你就可以在任何地方对它进行修改,也就是说,在上面的for循环中,我们每一次进行的i++操作,其实都是在对同一个i变量操作,当我们触发点击事件时,输出的i也是同一个。那么我们现在进行修改,将var变为let

var btns=document.getElementsByTagName("button");
    for (let i=0;i<btns.length;i++){
      btns[i].addEventListener("click",function () {
        console.log("第"+i+"个按钮被点击");//不管点击哪一个都是“第5个按钮被点击”
      })
    }

输出结果:

第0个按钮被点击

第1个按钮被点击

第2个按钮被点击

第3个按钮被点击

第4个按钮被点击

let是我们的ES6的语法,用于定义变量,并且它是有块级作用域的,所以不会发生那样的状况。

const

当我们希望所修饰的标识符无法被再次进行赋值的时候,我们可以使用const

  <script>
    const a='aa';
    //a='bb';  无法对const修饰的标识符再次赋值

   // const b; 必须给const修饰的标识符赋值

    //const指向的对象不能修改,但是对象的属性是可以修改的
    const obj={
      name: 'zs',
      age: 23
    }
    obj.name='ls';
    obj.age=23;
  </script>

字面量增强写法

  <script>
    const name='zs';
    const age=23;
    //ES5写法
    const obj={
      name: name,
      age: age
    }
    console.log(obj);
    //ES6写法
    const obj2={
      name,
      age
    }
    console.log(obj2);
  </script>

在这里插入图片描述

函数增强写法

<script>
    //ES5写法
    const obj={
      eat: function () {
        console.log("obj吃饭");
      }
    }
    //ES6写法
    const obj2={
      eat(){
        console.log("obj2吃饭");
      }
    }

    obj.eat();
    obj2.eat();
  </script>

在这里插入图片描述

10、事件监听

我们知道,现在的网站开发经常需要处理和用户的交互,比如用户点击、拖拽或者键盘敲入等,我们需要去监听这些事件,并作出反应,在vue中,我们通过

v-on指令来监听事件。

v-on的基本使用

<body>
  <div id="app">
    {{counter}}
<!--    <button v-on:click="counter++">+</button>-->
<!--    <button v-on:click="counter&#45;&#45;">-</button>-->
<!--    <button v-on:click="increment">+</button>-->
<!--    <button v-on:click="decrement">-</button>-->
    <button @click="increment">+</button>
    <button @click="decrement">-</button>
  </div>
  <script src="../js/vue.js"></script>
  <script>
    const app = new Vue({
      el: "#app",
      data: {
        counter: 0
      },
      methods: {
        //函数增强写法
        increment() {
          this.counter++;
        },
        decrement() {
          this.counter--;
        }
      }
    })
  </script>
</body>

v-on的参数问题

有的时候,我们希望在触发事件时传递一些参数给调用的方法。

<body>
  <div id="app">
    <!--方法没有参数,调用时可以省略括号-->
    <button @click="btn1Click">按钮1</button>
    <!--如果方法需要一个参数:
      1、不传入参数的话,不会报错,形参为undefined
      2、如果省略小括号的话,那么默认会将浏览器
      生成的event事件对象作为参数传入
    -->
<!--    <button @Click="btn2Click(123)">按钮2</button>-->
<!--    <button @Click="btn2Click()">按钮2</button>-->
    <button @Click="btn2Click">按钮2</button>

    <!--如果方法需要一个参数,同时也需要event事件对象:
      1、如果省略小括号,会将浏览器生成的event事件对象传给第一个参数
      2、如果想传入字符串,不能省略引号,因为会被vue实例当作变量处理
      3、如果想将event事件对象传入的话,不能直接使用`event`,需要使用`$event`
    -->
<!--    <button @click="btn3Click">按钮3</button>-->
<!--    <button @click="btn3Click(123,'abc')">按钮3</button>-->
    <button @click="btn3Click(123,$event)">按钮3</button>
    <button>按钮4</button>
  </div>
  <script src="../js/vue.js"></script>
  <script>
    const app = new Vue({
      el: "#app",
      methods: {
        btn1Click() {
          console.log("btn1Click");
        },
        btn2Click(aa) {
          console.log("----------",aa);
        },
        btn3Click(aa,event){
          console.log(aa);
          console.log(event);
        }
      }
    })
  </script>
</body>

v-on的修饰符问题

<body>
  <div id="app">
    <!--
        stop修饰符的使用
        事件冒泡:当我们的元素接收到事件的
      时候,会将它所接收到的事件传给它的父元素。
        在下面的示例中,如果我们点击按钮,两个方法都会被调用,
      如果想阻止事件冒泡,可以加上stop修饰符
    -->
    <div @click="divClick">
      aaa
<!--      <button @click="btnClick">按钮</button>-->
      <button @click.stop="btnClick">按钮</button>
    </div>

    <!--prevent修饰符的使用-->
    <!--
      我们知道,html中有一些默认事件,
      比如当我们点击form元素内的submit
      它就会自动提交到服务器,如果我们
      不希望它自动提交,而是调用我们自定义的
      方法的话,可以使用prevent修饰符
    -->
    <form>
      <input type="submit" @click.prevent="subClick" value="提交"/>
    </form>

    <!--
      监听键盘的敲入
      @keyup监听按键抬起,@keydown监听按下
      如果希望监听某个键,比如`enter`
    -->
<!--    <input type="text" @keyup="keyUp"/>-->
    <input type="text" @keyup.enter="keyUp"/>

    <!--
      once修饰符的使用
      如果希望点击事件只触发一次的话
      可以使用once修饰符
    -->
    <button @click.once="onceClick">点我</button>
  </div>
  <script src="../js/vue.js"></script>
  <script>
    const app = new Vue({
      el: "#app",
      methods: {
        divClick() {
          console.log("divClick");
        },
        btnClick() {
          console.log("btnClick");
        },
        subClick() {
          console.log("subClick");
        },
        keyUp() {
          console.log("keyUp");
        },
        onceClick() {
          console.log("onceClick");
        }
      }
    })
  </script>
</body>

11、条件判断

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

通过判断表达式是否为true来决定是否渲染元素

<body>
  <div id="app">
    <h2 v-if="score>=80">优秀</h2>
    <h2 v-else-if="score>=70">良好</h2>
    <h2 v-else="score>=60">及格</h2>
  </div>
  <script src="../js/vue.js"></script>
  <script>
    const app = new Vue({
      el: "#app",
      data: {
        score: 86
      }
    })
  </script>
</body>

切换登录小案例

案例:点击按钮,在账户登录和邮箱登录之间来回切换

<body>
  <div id="app">
    <span v-if="flag">
      <label for="username">用户账号</label>
      <input type="text" id="username" placeholder="用户账号"/>
    </span>
    <span v-else>
      <label for="email">用户邮箱</label>
      <input type="text" id="email" placeholder="用户邮箱"/>
    </span>
    <button @click="change">切换类型</button>
  </div>
  <script src="../js/vue.js"></script>
  <script>
    const app = new Vue({
      el: "#app",
      data: {
        flag: true
      },
      methods: {
        change() {
          this.flag=!this.flag;
        }
      }
    })
  </script>
</body>

注:上面的小案例会有一点小问题,就是当我们使用账户登录时输入文本,点击切换到邮箱登录依旧会保留输入的文本

原因:Vue在渲染DOM的时候,出于性能考虑,会尽可能的复用已存在的元素,而不是创建新的元素,在上面的案例中,会被复用,所以保留了之前输入的文本,如果我们不希望被复用的话,可以给两个加上不同的key,vue在渲染DOM的时候,会判断两个元素的key是否一致,如果不一致则不会进行复用。

<input type="text" id="username" placeholder="用户账号" key="username"/>
 <input type="text" id="email" placeholder="用户邮箱" key="email"/>

v-show是一个指令,和v-if类似,通过表达式的值来决定是否显示某个元素。

<body>
  <div id="app">
    <h2 v-if="isShow" id="aaa">{{message}}</h2>
    <h2 v-show="isShow" id="bbb">{{message}}</h2>
  </div>
  <script src="../js/vue.js"></script>
  <script>
    const app = new Vue({
      el: "#app",
      data: {
        message: "哈哈",
        isShow: true
      }
    })
  </script>
</body>

在这里插入图片描述

当我们通过控制台将isShow的值设为false时,使用v-if的元素直接从DOM中剔除了,而v-show的元素只是将display设为none

下一篇Vue的循环遍历

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值