《Vue零基础入门教程》第十一课:事件绑定指令

往期内容

《Vue零基础入门教程》第一课:Vue简介

《Vue零基础入门教程》第二课:搭建开发环境

《Vue零基础入门教程》第三课:起步案例

《Vue零基础入门教程》第四课:应用实例

《Vue零基础入门教程》第五课:挂载

《Vue零基础入门教程》第六课:基本选项

《Vue零基础入门教程》第八课:模板语法

《Vue零基础入门教程》第九课:插值语法细节

《Vue零基础入门教程》第十课:属性绑定指令

1) 什么是事件绑定

将JS事件和对应的处理函数绑定

2) 语法

html 复制代码
v-on:事件名="函数名"
// 简写
@事件名="函数名"

示例

给一个按钮绑定点击事件

template部分

html 复制代码
<button @click="handleClick">点击</button>

js部分

javascript 复制代码
methods: {
  handleClick() {
    alert('hello')
  }
}
  • methods中定义的函数会挂载到vm实例对象上
  • methods中定义的普通函数内部this指向vm
  • methods中, 不推荐使用箭头函数

3) 是否加括号

  • 不加括号(70%): 直接写函数名称, 可以在回调函数中, 直接拿到事件对象event
  • 加括号(20%): 加括号主要为了传参, 在回调函数中, 拿到参数
  • 加括号(10%): 有时, 除了拿到参数外, 还需要原生的事件对象, 通过$event传递

示例

html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="../node_modules/vue/dist/vue.global.js"></script>
  </head>
  <body>
    <div id="app">
      <!-- 访问vm实例上的属性 -->

      <!-- 70%: 在指令表达式中不加(). 就可以通过默认参数获取事件对象 -->
      <button @click="handleClick">点击了{{count}}次</button>

      <!-- 20%: 加() 目的是为了传参数 -->
      <button @click="handleClick(100)">点击了{{count}}次</button>

      <!-- 10%: 加() 在参数的最后, 通过$event也可以将事件对象传递 -->
      <button @click="handleClick(100, $event)">点击了{{count}}次</button>
    </div>

    <script>
      const { createApp } = Vue

      const vm = createApp({
        data() {
          return {
            count: 0,
          }
        },
        methods: {
          // 在methods中定义的就是事件回调函数, 默认情况可以接收事件对象 做为参数
          handleClick(a, b) {
            console.log(a, b)
            // 事件回调. 当点击事件触发, 会被调用
            this.count++
          },
        },
      }).mount('#app')

      // const div = document.querySelector('#app')
      // div.addEventListener('click', function (e) {
      //   console.log(e)
      // })
    </script>
  </body>
</html>

4) 事件修饰符

在绑定事件的时候, 可以添加事件修饰符, 常用的事件修饰符如下:

●.prevent: 阻止默认行为

●.stop: 阻止冒泡

●.once: 事件只会触发一次

示例

prevent示例

html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="../node_modules/vue/dist/vue.global.js"></script>
  </head>
  <body>
    <div id="app">
      <a @click.prevent="" href="http://www.baidu.com">baidu</a>
    </div>

    <script>
      const { createApp } = Vue

      const vm = createApp({}).mount('#app')

      // 原生js方式
      // document.querySelector('a').addEventListener('click', function (e) {
      //   // 调用事件对象的preventDefault方法, 阻止默认行为
      //   // 对于a元素而言, 默认行为就是跳转页面
      //   e.preventDefault()
      // })
    </script>
  </body>
</html>

stop示例

html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="../node_modules/vue/dist/vue.global.js"></script>
  </head>
  <body>
    <div id="app">
      <ul @click="handleUl">
        <!-- 
          1. `.stop` 阻止事件向上冒泡
          2. 事件修饰符可以连用
         -->
        <li @click.stop="handleLi">1</li>
        <li>2</li>
        <li>3</li>
      </ul>
    </div>

    <script>
      const { createApp } = Vue

      const vm = createApp({
        methods: {
          handleUl() {
            console.log('ul被点击了...')
          },
          handleLi() {
            console.log('li被点击了...')
          },
        },
      }).mount('#app')
    </script>
  </body>
</html>

5) 按键修饰符

主要针对 键盘事件

常用按键修饰符

  • .enter: 回车键
  • .up: 上
  • .down: 下
  • .left: 左
  • .right: 右

系统功能键

  • .ctrl
  • .alt
  • .shift

示例

html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="../node_modules/vue/dist/vue.global.js"></script>
  </head>
  <body>
    <div id="app">
      <input type="text" @keyup.enter="submit" />
    </div>

    <script>
      const { createApp } = Vue

      const vm = createApp({
        methods: {
          submit() {
            console.log('输入了数据, 按下回车键')
          },
        },
      }).mount('#app')
    </script>
  </body>
</html>

指令语法的完整示意图:

https://cn.vuejs.org/guide/essentials/template-syntax#directives

相关推荐
ZC跨境爬虫7 小时前
跟着 MDN 学 HTML day_9:(信件语义标记)
前端·css·笔记·ui·html
前端老石人7 小时前
HTML 字符引用完全指南
开发语言·前端·html
matlab_xiaowang7 小时前
Redux 入门:JavaScript 可预测状态管理库
开发语言·javascript·其他·ecmascript
幼儿园技术家7 小时前
前端如何设计权限系统(RBAC / ABAC)?
前端
前端摸鱼匠9 小时前
Vue 3 的v-bind合并行为:讲解v-bind与普通属性合并的规则
前端·javascript·vue.js·前端框架·ecmascript
REDcker9 小时前
浏览器端Web程序性能分析与优化实战 DevTools指标与工程清单
开发语言·前端·javascript·vue·ecmascript·php·js
donecoding11 小时前
一个 sudo 引发的血案:npm 全局包权限错乱彻底修复
前端·node.js·前端工程化
风骏时光牛马11 小时前
Raku正则匹配与数据批量处理实操案例
前端
nbwenren11 小时前
2026实测:Gemini 3 镜像站视觉能力实践——拍照原型图,一键生成 HTML+CSS 代码
前端·css·html
Lee川11 小时前
Prisma 实战指南:像搭积木一样设计古诗词数据库
前端·数据库·后端