vue学习路线(8.事件处理)

一.事件的基本原理

事件的基本使用:

  • 1.使用 v-on:xxx 或者 @XXX 绑定事件,其中xxx是事件名;
  • 2.事件的回调需要配置在methods对象中,最终会在vm上;
  • 3.methods中配置的函数,不要用箭头函数,否则this就不是vm了;
  • 4.methods中配置的函数,都是被vue所管理的函数,this的指向是vm 或 组件实例对象;
  • 5.@click="demo" 和 @click="demo($event)" 效果一致,但后者可以传参;

示例代码:

xml 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title></title>
    <!-- 引入开发版vue -->
    <script src="../js/vue.js"></script>
  </head>
  <body>
    <!-- 准备好一个容器 -->
    <div id="app">
      <h1>欢迎来到{{year}}年</h1>
      <!-- <button v-on:click="showInfo">提示信息</button> -->
      <!-- 语法糖:v-on:xxx 简写为 @XXX  -->
      <button @click="showInfo1">提示信息(不传参)</button>
      <button @click="showInfo2(66,$event)">提示信息(传参)</button>
    </div>
    <script type="text/javascript">
      //创建vue实例
      const vm = new Vue({
        el: "#app",
        data() {
          return {
            year: 2025,
          };
        },
        methods: {
          showInfo1(event) {
            console.log(event);
            console.log(this == vm); //此处的this是vm(vue实例对象)
            console.log(this.year);
          },
          showInfo2(value, event) {
            console.log(value, event);
          },
        },
      });
    </script>
  </body>
</html>

二.事件的修饰符

vue中的事件修饰符:

  • 1.prevent:阻止默认事件(常用);
  • 2.stop:阻止事件冒泡(常用);
  • 3.once:事件只触发一次(常用)
  • 4.capture:使用事件的捕获模式
  • 5.self: 只有event.target是当前操作的元素时才触发事件;
  • 6.passive:事件的默认行为立即执行,无需等待事件回调执行完毕;

示例代码:

xml 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title></title>
    <!-- 引入开发版vue -->
    <script src="../js/vue.js"></script>
  </head>
  <style>
    * {
      margin-top: 20px;
    }
    .box {
      border: 1px solid red;
    }
    .title {
      color: grey;
    }
    ul {
      height: 90px;
      overflow: auto;
      border: 1px solid red;
    }
  </style>
  <body>
    <div id="app">
      <div class="title">阻止默认事件:</div>
      <a :href="url" @click.prevent="showInfo1">百度官网</a>

      <div class="title">阻止事件冒泡:</div>
      <div @click="showInfo1">
        <button @click.stop="showInfo1">百度官网</button>
      </div>

      <div class="title">事件只触发一次:</div>
      <button @click.once="showInfo1">百度官网</button>

      <div class="title">使用事件的捕获模式:</div>
      <!-- 正常情况下,先捕获在冒泡,冒泡阶段执行点击事件,捕获是从外往里,冒泡是从里往外,所以输出是=> 2 1
       加上修饰符capture后,捕获阶段执行点击事件,所以输出是=> 1 2
       -->
      <div @click.capture="showMsg(1)" class="box">
        div1
        <div @click="showMsg(2)" class="box">div2</div>
      </div>

      <div class="title">只有event.target是当前操作的元素时才触发事件:</div>
      <div @click.self="showInfo2">
        <button @click="showInfo2">百度官网</button>
      </div>

      <div class="title">事件的默认行为立即执行,无需等待事件回调执行完毕:</div>
      <ul @wheel.passive="demo()">
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
      </ul>
    </div>
    <script type="text/javascript">
      const vm = new Vue({
        el: "#app",
        data() {
          return {
            year: 2025,
            url: "https://www.baidu.com/",
          };
        },
        methods: {
          showInfo1() {
            alert(this.year);
          },
          showMsg(v) {
            console.log(v);
          },
          showInfo2(e) {
            console.log(e.target);
          },
          demo() {
            for (let i = 0; i < 100000; i++) {
              console.log("@");
            }
          },
        },
      });
    </script>
  </body>
</html>

三.键盘事件

vue中的事件修饰符:

  • 1.vue中常用的按键别名:

    回车 => enter

    删除 => delete(捕获删除和退格键)

    退出 => esc

    空格 => space

    换行 => tab

    上 => up

    下 => down

    左 => left

    右 => right

  • 2.vue未提供别名的按键,可以使用按键原始的key值去绑定,但注意要转为caps-lock(短横线命名);

  • 3.系统修饰符(用法特殊):ctrl alt shift meta

    1)配合keyup使用,按下修饰键的同时,再按下其他键,随后释放其他键,事件才被触发。

    2)配合keydown使用,正常触发事件。

  • 4.也可以使用keyCode去指定具体的按键(不推荐);

  • 5.Vue.config.keyCodes自定义键名=键码,可以去定制按键别名;

示例代码:

xml 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title></title>
    <!-- 引入开发版vue -->
    <script src="../js/vue.js"></script>
  </head>
  <body>
    <!-- 准备好一个容器 -->
    <div id="app">
      <input placeholder="按下回车提示输入" @keyup.enter="showInfo1" />
      <input placeholder="按下删除提示输入" @keyup.delete="showInfo1" />
      <input placeholder="按下CapsLock提示输入" @keyup.caps-lock="showInfo1" />
      <input placeholder="系统修饰符alt" @keyup.alt="showInfo1" />
      <input placeholder="系统修饰符alt" @keydown.alt="showInfo1" />
      <input placeholder="按下回车提示输入" @keyup.13="showInfo1" />
      <input placeholder="按下回车提示输入" @keyup.huiche="showInfo1" />
    </div>
    <script type="text/javascript">
      Vue.config.keyCodes.huiche = 13; //定义了一个别名按键
      //创建vue实例
      const vm = new Vue({
        el: "#app",
        data() {
          return {};
        },
        methods: {
          showInfo1(event) {
            // console.log(event.target.value);
            console.log(event.key, event.keyCode);
          },
        },
      });
    </script>
  </body>
</html>

四.使用技巧

vue中的事件修饰符:

  • 1.修饰符可以连续写(即阻止冒泡又阻止默认事件)
xml 复制代码
      <div @click="showInfo1">
        <!-- 修饰符可以连续写(即阻止冒泡又阻止默认事件) -->
        <a href="https://www.baidu.com/" @click.stop.prevent="showInfo1">百度官网</a>
      </div>
  • 2.可以指定两个键同时按下触发
xml 复制代码
<!-- 同时按下ctrl+y提示 -->
 <input placeholder="按下ctrl+y提示" @keyup.ctrl.y="showInfo1" />
相关推荐
独立开阀者_FwtCoder2 分钟前
11 个 JavaScript 杀手脚本,用于自动执行日常任务
前端·javascript·github
ak啊7 分钟前
深入浅出:计算机网络中的数据封装与解封装之旅
前端·后端
汪子熙17 分钟前
深入理解 // eslint-disable-next-line no-eval 注释的作用与应用
前端·javascript·面试
Dignity_呱25 分钟前
Vue性能优化:从加载提速到运行时优化
前端·vue.js·面试
William Dawson38 分钟前
【从前端到后端导入excel文件实现批量导入-笔记模仿芋道源码的《系统管理-用户管理-导入-批量导入》】
java·前端·笔记·elementui·typescript·excel
Navicat中国1 小时前
Edge Databases:赋能分布式计算环境
前端·数据库·edge·sqlite
【本人】1 小时前
Vue3中Axios的使用-附完整代码
vue.js·前端框架
天天摸鱼的java工程师1 小时前
凌晨四点,掘金签到 bug 现场抓包,开发同学速来认领!
服务器·前端·后端
橙某人1 小时前
🤖Agent进化论:从Copilot到主驾驶,MCP如何成为AI的"万能接口"?
前端·mcp