vue点击事件

简介: 可以用v-on指令监听DOM事件,并在触发时运行一些js代码。举个简单的例子:实现每次点击按钮counter加1的效果

一、Vue中的事件处理


可以用v-on指令监听DOM事件,并在触发时运行一些js代码。

举个简单的例子:实现每次点击按钮counter加1的效果

<div id="app">
  <p>{{counter}}</p>
  <button v-on:click="counter++">点击+1</button>
</div>
<script>
  Vue.config.productionTip = false;
  new Vue({
    el: "#app",
    data: {
      counter: 1,
    },
  });
</script>
</body>

二、事件处理方法


许多事件处理逻辑会更复杂,所以直接把js代码写在v-on指令中是不可行的,因此v-on还可以接收一个需要调用的方法名称。

实现步骤:

  • 在标签v-on指令后定义方法名
  • 在methods对象中定义方法

示例:

<div id="app">
  <p>{{name}}</p>
  <button v-on:click="showName">显示名称</button>
</div>
<script>
  Vue.config.productionTip = false; // 阻止 vue 在启动时生成生产提示。
  new Vue({
    el: "#app",
    data: {
      name: "zhangsan",
    },
    methods: {
      showName(event) {
        // this在方法里指向当前Vue实例
        console.log(this.name);
        // event是原生DOM事件
        if(event){
          console.log(event.target.tagName)
        }
      },
    },
  });
</script>

内联处理器中的方法

除了直接绑定到一个方法,也可以在内联js语句中调用方法

<div id="app">
  <button v-on:click="say('hi')">Say hi</button>
  <button v-on:click="say('what')">Say what</button>
</div>
<script>
new Vue({
  el: '#app',
  methods: {
    say: function (message) {
      alert(message)
    }
  }
})
</script>

有时也需要在内联语句处理器中访问原始的DOM事件。可以用特殊变量$event把它传入方法:

<button v-on:click="warn('Form cannot be submitted yet.', $event)">
  Submit
</button>
<script>
new Vue({
  el: '#app',
  methods: {
    warn: function (message, event) {
      // 现在我们可以访问原生事件对象
      if (event) {
        event.preventDefault()
      }
      alert(message)
    }
  }
})
</script>

总结:事件的基本使用


使用v-on:xxx或@xxx绑定事件,其中xxx是事件名

事件的回调需要配置在methods对象中,最终会在vm上

methods中配置的函数,不要用箭头函数!否则this指向的是window对象,就不是vm了

methods中配置的函数,都是被Vue所管理的函数,this的指向是vm或组件实例对象。在编写事件代理的时候,用e.currentTarget引用绑定事件代理的元素,e.target引用事件目标元素。

@click="demo"或@click="demo($event)"效果一致,但后者可以传参


【vue框架升级了写法:】

总结:事件的基本使用
使用v-on:xxx或@xxx绑定事件,其中xxx是事件名
事件的回调需要配置在methods对象中,最终会在vm上
methods中配置的函数,不要用箭头函数!否则this指向的是window对象,就不是vm了
methods中配置的函数,都是被Vue所管理的函数,this的指向是vm或组件实例对象。在编写事件代理的时候,用e.currentTarget引用绑定事件代理的元素,e.target引用事件目标元素。
@click="demo"或@click="demo($event)"效果一致,但后者可以传参
【vue框架升级了写法:】
<body>
    <div id="app">
      <button v-on:click="showInfo">点击显示详细信息(不传参)</button>
      <button @click="showInfo1(1,$event)">点击可传入参数</button>
    </div>
    <script>
      Vue.config.productionTip = false; // 阻止 vue 在启动时生成生产提示。
      new Vue({
        el: "#app",
        data: {
          name: "zhangsan",
        },
        methods: {
          showInfo(e) {
            console.log(this.name, e.target.innerText);
          },
          showInfo1(number, e) {
            console.log(number, e.target.innerText);
          },
        },
      });
</script>
</body>

三、事件修饰符


在事件处理程序中调用event.preventDefault()或event.stopPropagation()是非常常见的需求。尽管我们可以在方法中轻松实现这点,但更好的方式是:方法只有纯粹的数据逻辑,而不是去处理DOM事件细节。

为了解决这个问题,Vue.js为v-on提供了事件修饰符。修饰符是由点开头的指令后缀来表示的。

.stop

阻止单击事件冒泡(常用)

<!-- 阻止单击事件继续传播 -->
<a v-on:click.stop="doThis"></a>

.prevent

阻止事件默认行为(常用)

<!-- 提交事件不再重载页面 -->
<form v-on:submit.prevent="onSubmit"></form>
<!-- 修饰符可以串联 -->
<a v-on:click.stop.prevent="doThat"></a>
<!-- 只有修饰符 -->
<form v-on:submit.prevent></form>

.once

事件只触发一次(常用)

<!-- 点击事件将只会触发一次 -->
<a v-on:click.once="doThis"></a>

注:不像其它只能对原生的 DOM 事件起作用的修饰符,.once 修饰符还能被用到自定义的组件事件上

.capture

使用事件的捕获模式

<!-- 添加事件监听器时使用事件捕获模式 -->
<!-- 即内部元素触发的事件先在此处理,然后才交由内部元素进行处理 -->
<div v-on:click.capture="doThis">
  1
  <p v-on:click="showInfo">2</p>
</div>
<!--当我们点击p标签时,会先执行doThis,再执行showInfo-->

.self

只有event.target是当前操作的元素时才能触发事件

<!-- 只有 event.target 是当前操作的元素时才会触发函数 -->
<!-- 当我们点击p标签的时候,不会触发div标签的执行,只有点击div才会触发div的执行 -->
<div v-on:click.self="doThis" id="app">
    1
    <p v-on:click="showInfo">2</p>
  </div>
  <script>
    const vm = new Vue({
      el: "#app",
      methods: {
        doThis() {
          console.log(1);
        },
        showInfo() {
          console.log(2);
        },
      },
    });
</script>

使用修饰符时,顺序很重要;相应的代码会以同样的顺序产生。因此,用 v-on:click.prevent.self 会阻止所有的点击,而 v-on:click.self.prevent 只会阻止对元素自身的点击。

.passive

事件的默认行为立即执行,移动端项目常用

<!-- 滚动事件的默认行为 (即滚动行为) 将会立即触发 -->
<!-- 而不会等待 `onScroll` 完成  -->
<div v-on:scroll.passive="onScroll">...</div>

四、按键修饰符


在监听键盘事件时,Vue允许为v-on添加按键修饰符

1、vue中常用的按键别名如下:

.enter

"回车"键

<!-- 只有在 `key` 是 `Enter` 时调用 `vm.showInfo()` -->
<input v-on:keyup.enter="showInfo">

delete

"删除"和"退格"键

<input v-on:keyup.delete="showInfo">

.esc

"退出"键

<input v-on:keyup.esc="showInfo">

space

"空格"键

<input v-on:keyup.space="showInfo">

.tab

(特殊)会把按键从当前位置切走,必须配合keydown去使用

<input v-on:keydown.tab="showInfo">

.up

"上"键

<input v-on:keyup.up="showInfo">

.down

"下"键

<input v-on:keyup.down="showInfo">

.left

"左"键

<input v-on:keyup.left="showInfo">

.right

"右"键‍

<input v-on:keyup.right="showInfo">

2、Vue未提供别名的按键,可以使用按键原始的key值绑定,但注意要转为kebab-case(短横线命名)比如:大写锁定键(CapsLock)

<input v-on:keyup.caps-lock="showInfo">

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

配合keyup使用:按下修饰键的同时,再按下其他键,随后释放其他键,事件才会被触发(比如ctrl,按下ctrl再按y,释放y后才会触发事件)

<!-- 此方法按下ctrl再按(x,y,q等)其他键,释放其他键后才会触发事件 -->
<input v-on:keyup.ctrl="showInfo">
<!-- 此方法按下ctrl再按y键,释放y键后才会触发事件 -->
<input v-on:keyup.ctrl.y="showInfo">

配合keydown使用:正常触发事件。

4、Vue.config.keyCodes.自定义键名 = 键码,可以去定制按键别名(不推荐)

Vue.config.keyCodes.huiche = 13;
<input v-on:keyup.huiche="showInfo">


相关文章
|
2月前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
294 2
|
1月前
|
缓存 JavaScript
vue中的keep-alive问题(2)
vue中的keep-alive问题(2)
276 137
|
5月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
761 0
|
5月前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能
|
4月前
|
人工智能 JSON JavaScript
VTJ.PRO 首发 MasterGo 设计智能识别引擎,秒级生成 Vue 代码
VTJ.PRO发布「AI MasterGo设计稿识别引擎」,成为全球首个支持解析MasterGo原生JSON文件并自动生成Vue组件的AI工具。通过双引擎架构,实现设计到代码全流程自动化,效率提升300%,助力企业降本增效,引领“设计即生产”新时代。
402 1
|
4月前
|
JavaScript 安全
在 Vue 中,如何在回调函数中正确使用 this?
在 Vue 中,如何在回调函数中正确使用 this?
257 0
|
5月前
|
JavaScript 前端开发 开发者
Vue 自定义进度条组件封装及使用方法详解
这是一篇关于自定义进度条组件的使用指南和开发文档。文章详细介绍了如何在Vue项目中引入、注册并使用该组件,包括基础与高级示例。组件支持分段配置(如颜色、文本)、动画效果及超出进度提示等功能。同时提供了完整的代码实现,支持全局注册,并提出了优化建议,如主题支持、响应式设计等,帮助开发者更灵活地集成和定制进度条组件。资源链接已提供,适合前端开发者参考学习。
464 17
|
5月前
|
JavaScript 前端开发 UED
Vue 表情包输入组件实现代码及详细开发流程解析
这是一篇关于 Vue 表情包输入组件的使用方法与封装指南的文章。通过安装依赖、全局注册和局部使用,可以快速集成表情包功能到 Vue 项目中。文章还详细介绍了组件的封装实现、高级配置(如自定义表情列表、主题定制、动画效果和懒加载)以及完整集成示例。开发者可根据需求扩展功能,例如 GIF 搜索或自定义表情上传,提升用户体验。资源链接提供进一步学习材料。
271 1
|
5月前
|
存储 JavaScript 前端开发
如何高效实现 vue 文件批量下载及相关操作技巧
在Vue项目中,实现文件批量下载是常见需求。例如文档管理系统或图片库应用中,用户可能需要一次性下载多个文件。本文介绍了三种技术方案:1) 使用`file-saver`和`jszip`插件在前端打包文件为ZIP并下载;2) 借助后端接口完成文件压缩与传输;3) 使用`StreamSaver`解决大文件下载问题。同时,通过在线教育平台的实例详细说明了前后端的具体实现步骤,帮助开发者根据项目需求选择合适方案。
491 0
|
5月前
|
JavaScript 前端开发 UED
Vue 项目中如何自定义实用的进度条组件
本文介绍了如何使用Vue.js创建一个灵活多样的自定义进度条组件。该组件可接受进度段数据数组作为输入,动态渲染进度段,支持动画效果和内容展示。当进度超出总长时,超出部分将以红色填充。文章详细描述了组件的设计目标、实现步骤(包括props定义、宽度计算、模板渲染、动画处理及超出部分的显示),并提供了使用示例。通过此组件,开发者可根据项目需求灵活展示进度情况,优化用户体验。资源地址:[https://pan.quark.cn/s/35324205c62b](https://pan.quark.cn/s/35324205c62b)。
242 0