Vue事件修饰符

简介: Vue事件修饰符

在事件处理程序中调用 event.preventDefault() 或 event.stopPropagation() 是非常常见的需求。尽管我们可以在方法中轻松实现这点 但更好的方式是:方法只有纯粹的数据逻辑,而不是去处理 DOM 事件细节。为了解决这个问题,Vue.js 为 v-on 提供了事件修饰符。

prevent 修饰符【常用

prevent 修饰符用于阻止默认事件。与 event.preventDefault() 效果相同。

阻止默认事件:某些标签带有默认的事件,例如 a 标签默认跳转页面、submit 属性默认提交并刷新页面。如果不想触发这些默认的事件,就需要阻止默认事件了。

<div id="APP">
  <a href="http://www.baidu.com" @click.prevent="info">百度一下</a>
</div>
const vm = new Vue({
  el: "#APP",
  methods:{
    info(){
      console.log("显示信息");
    },
  },
});

:如果没有 prevent 修饰符,点击后会跳转到百度。而现在点击后不会跳转页面。

stop 修饰符常用】:

stop 修饰符用于阻止事件冒泡。与 event.stopPropagation() 效果相同。

阻止事件冒泡:当一个元素执行某个事件的时候,这个事件会一直向上传播,如果它的父元素也有相同的事件,也会被触发执行。如果不想让事件向上传播,就需要阻止事件冒泡了。

<div id="APP">
  <div @click="info1">
    <p @click.stop="info2">阻止事件冒泡</p>
  </div>
</div>
const vm = new Vue({
  el: "#APP",
  methods:{
    info1(){
      console.log("我是DIV标签");
    },
    info2(){
      console.log("我是P标签");
    },
  },
});

:如果没有 stop 修饰符,点击后两个事件都会触发。而现在只有 info2 触发执行了。

once 修饰符常用】:

once 修饰符用于只让事件触发一次。

<div id="APP">
  <button @click.once="info">只会触发一次</button>
</div>
const vm = new Vue({
  el: "#APP",
  methods:{
    info(){
      console.log("我只出来一次哦");
    },
  },
});

:只有第一次点击按钮会触发事件,事件只执行一次。

capture 修饰符:用于让事件以捕获模式触发

.box{
  width: 100px;
  height: 100px;
  padding: 20px;
  background-color: aqua;
}
.box p{
  width: 60px;
  height: 60px;
  background-color: red;
}
<div id="APP">
  <div class="box" @click.capture="info1">
    我是div标签
    <p @click="info2">我是p标签</p>
  </div>
</div>
const vm = new Vue({
  el: "#APP",
  methods:{
    info1(){
      console.log("外");
    },
    info2(){
      console.log("内");
    },
  },
});

:如果没有 capture 修饰符,事件默认冒泡阶段触发,会先执行内,后执行外。而现在 info1 事件在捕获阶段触发,会先执行外,后执行内。

self 修饰符:用于指定事件不会被事件冒泡或事件捕获触发,只有操作当前元素才会触发

<div id="APP">
  <div class="box" @click.self="info">
    内容
    <button @click="info">按钮</button>
  </div>
</div>
const vm = new Vue({
  el: "#APP",
  methods:{
    info(e){
      console.log(e.target);
    },
  },
});

:如果没有 self 修饰符,点击按钮时,事件会向上传播,导致 div 上的事件也会被触发。而现在点击按钮不会触发 div 上的事件,只有点击内容才能执行 div 上的事件。

passive 修饰符:常用于 scroll 事件,可以使内容立即滚动,不需要等待事件执行完毕。

.list{
  width: 200px;
  height: 200px;
  background-color: aqua;
  overflow-y: scroll;
}
.list li{
  height: 100px;
}
<div id="APP">
  <ul class="list" @scroll.passive="demo">
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
  </ul>
</div>
const vm = new Vue({
  el: "#APP",
  methods:{
    demo(){
      for(let i = 0; i < 10000; i++){
        console.log(i);
      }
      console.log("执行完毕!");
    },
  },
});

:推荐给 scroll 事件添加 passive 修饰符,它能够提升移动端的性能。避免等待事件执行完毕后才能触发内容滚动。

使用多个修饰符:

<div id="APP">
  <a href="http://www.baidu.com" @click.prevent.once="demo">百度一下</a>
</div>
const vm = new Vue({
  el: "#APP",
  methods:{
    demo(){
      console.log("阻止默认事件并且只执行一次");
    },
  },
});

:可以同时使用多个修饰符。当第一次点击时会执行事件并且阻止默认事件,第二次点击就会触发 a 标签跳转页面。也就是说它现在只会阻止一次默认事件。

:使用多个修饰符时,顺序很重要。相应的代码会以同样的顺序产生。另外不要把 passive 和 prevent 一起使用,因为 prevent 将会被忽略,同时浏览器可能会向你展示一个警告。

按键修饰符:

<div id="APP">
  <p>enter 修饰符</p>
  <input type="text" placeholder="按回车键提交内容" @keyup.enter="info">
  <p>delete 修饰符</p>
  <input type="text" placeholder="按删除键或退格键提交内容" @keyup.delete="info">
  <p>esc 修饰符</p>
  <input type="text" placeholder="按退出键提交内容" @keyup.esc="info">
  <p>space 修饰符</p>
  <input type="text" placeholder="按空格键提交内容" @keyup.space="info">
  <p>tab 修饰符【特殊,必须配合 keydown 去使用】</p>
  <input type="text" placeholder="按换行键提交内容" @keydown.tab="info">
  <p>up 修饰符</p>
  <input type="text" placeholder="按上键提交内容" @keyup.up="info">
  <p>down 修饰符</p>
  <input type="text" placeholder="按下键提交内容" @keyup.down="info">
  <p>left 修饰符</p>
  <input type="text" placeholder="按左键提交内容" @keyup.left="info">
  <p>right 修饰符</p>
  <input type="text" placeholder="按左键提交内容" @keyup.right="info">
  <p>w 修饰符</p>
  <input type="text" placeholder="按 w 键提交内容" @keyup.w="info">
  <p>......</p>
</div>
const vm = new Vue({
  el: "#APP",
  methods:{
    info(e){
      alert(e.target.value);
    },
  },
});

:大部分按键都可以使用,只有个别多单词按键需要改为短横线命名。例如:PrintScreen 按键需要改为 print-screen 才能使用(键盘上的 PrtSc 键)。

系统修饰键:

<div id="APP">
  <p>ctrl 修饰符</p>
  <input type="text" placeholder="按ctrl键提交内容" @keydown.ctrl="info">
  <p>alt 修饰符</p>
  <input type="text" placeholder="按alt键提交内容" @keydown.alt="info">
  <p>shift 修饰符</p>
  <input type="text" placeholder="按shift键提交内容" @keydown.shift="info">
  <p>meta 修饰符</p>
  <input type="text" placeholder="按系统键提交内容" @keydown.meta="info">
</div>
const vm = new Vue({
  el: "#APP",
  methods:{
    info(e){
      alert(e.target.value);
    },
  },
});

:系统修饰键比较特殊,配合 keydown 使用可以正常触发。配合 keyup 使用时,需要在按下修饰键的同时,再按下其它键,随后释放其它键,事件才能被触发。

系统修饰键配合使用:多个按键修饰符同样可以组合使用

<div id="APP">
  <p>ctrl + a 修饰符</p>
  <input type="text" placeholder="按 ctrl + a 键提交内容" @keydown.ctrl.a="info">
</div>
const vm = new Vue({
  el: "#APP",
  methods:{
    info(e){
      alert(e.target.value);
    },
  },
});

按键修饰符也可以配合事件使用。

<div id="APP">
  <p>ctrl + 点击 修饰符</p>
  <input type="text" placeholder="按住ctrl键点击提交内容" @click.ctrl="info">
</div>
const vm = new Vue({
  el: "#APP",
  methods:{
    info(e){
      alert(e.target.value);
    },
  },
});

:现在只有按住 ctrl 键再点击输入框才能触发事件。

鼠标修饰键:

<div id="APP">
  <p>left 修饰符</p>
  <input type="text" placeholder="点击鼠标左键提交内容" @click.left="info">
  <p>right 修饰符</p>
  <input type="text" placeholder="点击鼠标右键提交内容" @click.right="info">
  <p>middle 修饰符</p>
  <input type="text" placeholder="点击鼠标滚轮提交内容" @click.middle="info">
</div>
const vm = new Vue({
  el: "#APP",
  methods:{
    info(e){
      alert(e.target.value);
    },
  },
});

exact 修饰符:就是允许你控制由精确的系统修饰符组合触发的事件

<div id="APP">
  <p>按住 ctrl 键再点击触发</p>
  <input type="text" placeholder="ctrl + 点击" @click.ctrl="info">
  <p>只能按住 ctrl 键再点击触发</p>
  <input type="text" placeholder="ctrl + 点击" @click.ctrl.exact="info">
</div>
const vm = new Vue({
  el: "#APP",
  methods:{
    info(e){
      alert(e.target.value);
    },
  },
});

:添加 exact 修饰符后,只能按下指定的按键触发。如果多按或少按任意一个键,都不会执行。例如第二个输入框只能按 ctrl 键再点击,多按一个键也不会执行。

原创作者:吴小糖

创作时间:2023.3.9


相关文章
|
3天前
|
JavaScript 前端开发
如何在 Vue 项目中配置 Tree Shaking?
通过以上针对 Webpack 或 Rollup 的配置方法,就可以在 Vue 项目中有效地启用 Tree Shaking,从而优化项目的打包体积,提高项目的性能和加载速度。在实际配置过程中,需要根据项目的具体情况和需求,对配置进行适当的调整和优化。
|
3天前
|
存储 缓存 JavaScript
在 Vue 中使用 computed 和 watch 时,性能问题探讨
本文探讨了在 Vue.js 中使用 computed 计算属性和 watch 监听器时可能遇到的性能问题,并提供了优化建议,帮助开发者提高应用性能。
|
3天前
|
存储 缓存 JavaScript
如何在大型 Vue 应用中有效地管理计算属性和侦听器
在大型 Vue 应用中,合理管理计算属性和侦听器是优化性能和维护性的关键。本文介绍了如何通过模块化、状态管理和避免冗余计算等方法,有效提升应用的响应性和可维护性。
|
3天前
|
存储 缓存 JavaScript
Vue 中 computed 和 watch 的差异
Vue 中的 `computed` 和 `watch` 都用于处理数据变化,但使用场景不同。`computed` 用于计算属性,依赖于其他数据自动更新;`watch` 用于监听数据变化,执行异步或复杂操作。
|
3天前
|
JavaScript 前端开发 UED
vue学习第二章
欢迎来到我的博客!我是一名自学了2年半前端的大一学生,熟悉JavaScript与Vue,目前正在向全栈方向发展。如果你从我的博客中有所收获,欢迎关注我,我将持续更新更多优质文章。你的支持是我最大的动力!🎉🎉🎉
|
4天前
|
存储 JavaScript 开发者
Vue 组件间通信的最佳实践
本文总结了 Vue.js 中组件间通信的多种方法,包括 props、事件、Vuex 状态管理等,帮助开发者选择最适合项目需求的通信方式,提高开发效率和代码可维护性。
|
3天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。自学前端2年半,熟悉JavaScript与Vue,正向全栈方向发展。博客内容涵盖Vue基础、列表展示及计数器案例等,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
|
4天前
|
存储 JavaScript
Vue 组件间如何通信
Vue组件间通信是指在Vue应用中,不同组件之间传递数据和事件的方法。常用的方式有:props、自定义事件、$emit、$attrs、$refs、provide/inject、Vuex等。掌握这些方法可以实现父子组件、兄弟组件及跨级组件间的高效通信。
|
9天前
|
JavaScript
Vue基础知识总结 4:vue组件化开发
Vue基础知识总结 4:vue组件化开发
|
9天前
|
存储 JavaScript
Vue 状态管理工具vuex
Vue 状态管理工具vuex