【接地气】真正一口气讲清楚了Vue事件修饰符.once、.prevent、.stop、.capture、.self、.passive、.exac、.native的作用

简介: 【接地气】真正一口气讲清楚了Vue事件修饰符.once、.prevent、.stop、.capture、.self、.passive、.exac、.native的作用

代码直接拷贝运行一下子就明白了原理啦~~

<template>
  <div class="sg-body">
    <!-- 2.1.4 新增 .once -->
    <h1>.once</h1>
    <a href="#" @click.once="alert"
      >用了“ @click.once”,点击只会执行一次弹窗提示</a
    >
    <hr />
    <h1>.prevent</h1>
    <a href="http://www.shuzhiqiang.com" @click.prevent="alert"
      >用了“@click.prevent”,点击只会弹窗提示,而不会跳转链接到www.shuzhiqiang.com</a
    >
    <hr />
    <!-- .once和.prevent顺序可交换 -->
    <a href="http://www.shuzhiqiang.com" @click.prevent.once="alert"
      >用了“@click.prevent.once”,第一次弹窗提示,第二次及其以后就跳转链接到www.shuzhiqiang.com</a
    >
    <hr />
    <h1>.stop</h1>
    <div class="out" @click="a1">
      a1
      <div class="in red" @click="a2">
        a2
        <div class="in orange" @click="a3">
          a3
          <div class="in yellow" @click="a4">
            a4
            <button @click.stop="a5">
              点击按钮事件不会向外部传播(a5.stop)
            </button>
          </div>
        </div>
      </div>
    </div>
    <hr />
    <h1>.capture</h1>
    <div class="out" @click.capture="a1">
      a1.capture↓
      <div class="in red" @click.capture="a2">
        a2.capture↓
        <div class="in orange" @click.capture="a3">
          a3.capture↓
          <div class="in yellow" @click.capture="a4">
            a4.capture↓
            <button @click="a5">
              点击按钮事件会从外向内传播(如果某个父级元素的click事件不加.capture就会按由内到外顺序最后执行)
            </button>
          </div>
        </div>
      </div>
    </div>
    <hr />
    <h1>.self</h1>
    <div class="out" @click="a1">
      a1←
      <div class="in red" @click="a2">
        a2←
        <div class="in orange" @click.self="a3">
          a3.self
          <div class="in yellow" @click="a4">
            a4←
            <button @click="a5">
              点击按钮事件不会传播给a3.self,只有点击了a3自己才会执行他自己的事件
            </button>
          </div>
        </div>
      </div>
    </div>
    <hr />
    <!-- 2.3.0 新增 .passive -->
    <h1>.passive</h1>
    <!-- 滚动事件的默认行为 (即滚动行为) 将会立即触发, 而不会等待 `onScroll` 完成 , 这其中包含 `event.preventDefault()` 的情况 -->
    <div @scroll.passive="scroll" style="height: 100px; overflow-y: auto">
      <h3>
        超长度的文字内容测试只是为了判断字段对应的文字最大长度是否有限制,以防止文字长度过长出现布局混乱,div被撑开,导致页面显示错位,UI破坏,以及其他的报错情况发生。超長度的文字內容測試只是為了判斷字段對應的文字最大長度是否有限制,以防止文字長度過長出現佈局混亂,div被撐開,導致頁面顯示錯位,UI破壞,以及其他的報錯情況發生。Ultra-length
        text content test is only to determine whether the maximum length of the
        text corresponding to the field to determine the length of the text to
        prevent the layout of the chaos, div was distraction, resulting in page
        dislocation, UI damage, and other error occurred.
      </h3>
    </div>
    <hr />
    <!-- 
 为了在必要的情况下支持旧浏览器,Vue 提供了绝大多数常用的按键码的别名:
.enter
.tab
.delete (捕获“删除”和“退格”键)
.esc
.space
.up
.down
.left
.right
有一些按键 (.esc 以及所有的方向键) 在 IE9 中有不同的 key 值, 如果你想支持 IE9,这些内置的别名应该是首选。
你还可以通过全局 config.keyCodes 对象自定义按键修饰符别名:
// 可以使用 `v-on:keyup.f1`
Vue.config.keyCodes.f1 = 112
     -->
    <input @keyup.enter="alert" value="按回车键有弹窗" />
    <input
      @keydown.alt.67="$event.target.value = ''"
      value="按下Alt + C清空内容"
      size="30"
    />
    <input
      @keyup.alt.67="$event.target.value = ''"
      value="按下Alt + C并弹起清空内容"
      size="30"
    />
    <hr />
    <button @click.ctrl="alert">只要按住了Ctrl+鼠标单击此处触发弹窗提示</button>
    <!-- 2.5.0 新增 .exact(.excat和.page-down、.click顺序可调换)-->
    <h1>.exac</h1>
    <input
      @keyup.page-down.exact="alert"
      value="当且仅当只按PageDown键才会有弹窗"
      size="40"
    />
    <button @click.ctrl.exact="alert">
      当且仅当只按住Ctrl+鼠标单击此处才能触发弹窗提示
    </button>
    <button @click.left.shift.exact="alert">
      当且仅当只按住Shiftl+鼠标左键此处才能触发弹窗提示
    </button>
    <button @click.ctrl.right.exact="alert">
      当且仅当只按住Ctrl+鼠标右键此处才能触发弹窗提示
    </button>
    <button @click.alt.middle.exact="alert">
      当且仅当只按住Alt+鼠标滑轮此处才能触发弹窗提示
    </button>
    <hr />
  </div>
</template>
<script>
export default {
  methods: {
    a1() {
      console.log("a1");
    },
    a2() {
      console.log("a2");
    },
    a3() {
      console.log("a3");
    },
    a4() {
      console.log("a4");
    },
    a5() {
      console.log("a5");
    },
    alert() {
      alert("触发了点击!");
    },
    scroll() {
      console.log("触发了滚动!");
    },
  },
};
</script>
 <style lang="scss" scoped>
.sg-body {
  > h1 {
    margin-left: 10px;
    border-radius: 88px;
    display: table;
    padding: 5px 10px;
    background: linear-gradient(180deg, #648cff 0%, #4172fa 100%);
    box-shadow: 0 3px 4px 0 rgba(44, 71, 146, 0.32), inset 0 -2px 0 0 #3262e6;
    color: white;
  }
  .out {
    margin: 10px 0;
    display: inline-block;
    box-shadow: 0 10px 30px lightgray;
    box-sizing: border-box;
    border: 1px solid gray;
    padding: 20px;
    .in {
      padding: 20px;
      display: inline-block;
      &.red {
        background: red;
      }
      &.orange {
        background: orange;
      }
      &.yellow {
        background: yellow;
      }
    }
  }
}
</style>

el-input 无法触发@keyup.enter 解决方法@keyup.enter.native=事件名

官网的解释:你可能想在某个组件的根元素上监听一个原生事件。可以使用 v-on 的修饰符 .native

通俗点讲:就是在父组件中给子组件绑定一个原生的事件,就将子组件变成了普通的HTML标签,不加'. native'事件是无法触发的。可以理解为该修饰符的作用就是把一个vue组件转化为一个普通的HTML标签,并且该修饰符对普通HTML标签是没有任何作用的。


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