Vue 事件修饰符(Event Modifiers)

Vue 中的事件修饰符(Event Modifiers)修改事件触发方法运行的方式,并帮助我们以更高效、更直接的方式处理事件。

事件修饰符与 Vue v-on 指令一起使用,例如:

  • 阻止HTML表单的默认提交行为(v-on:submit.proid
  • 确保事件在页面加载后只能运行一次(v-on:click.once
  • 指定要用作事件以运行方法的键盘键(v-on:keyup.enter

如何修改 v-on 指令

事件修饰符用于更详细地定义如何对事件作出反应。

我们使用事件修饰符,首先将标记连接到事件,就像我们以前看到的那样:

  1. <button v-on:click="createAlert">Create alert</button>

现在,为了更具体地定义按钮点击事件在页面加载后只触发一次,我们可以添加 .one 修饰符,如下所示:

  1. <button v-on:click.once="createAlert">Create alert</button>

下面是一个带有 .one 修饰符的实例:

实例

在 <button> 标记上使用 .once 修饰符仅在第一次发生 'click' 事件时运行该方法。

  1. <div id="app">
  2. <p>Click the button to create an alert:</p>
  3. <button v-on:click.once="creteAlert">Create Alert</button>
  4. </div>
  5. <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
  6. <script>
  7. const app = Vue.createApp({
  8. methods: {
  9. createAlert() {
  10. alert("Alert created from button click")
  11. }
  12. }
  13. })
  14. app.mount('#app')
  15. </script>
注意:也可以在方法内部处理事件,而不是使用事件修饰符,但事件修饰符使其更容易。

不同的 v-on 修饰符

事件修饰符用于不同的情况。当我们监听键盘事件、鼠标点击事件时,我们可以使用事件修饰符,甚至可以将事件修饰符组合使用。

事件修饰符 .one 可以在键盘和鼠标单击事件之后使用。


键盘键事件修饰符

我们有三种不同的键盘事件类型 keydown, keypress, 和 keyup

对于每种键盘事件类型,我们可以指定在键盘事件发生后要监听的键。 我们有 .space, .enter, .w.up 等等。

您可以将键盘事件写入网页,或使用 console.log(event.key) 写入控制台,以自己查找某个键的值:

实例

keydown 键盘事件触发 'getKey' 方法,事件对象中的值 'key' 将写入控制台和网页。

  1. <input v-on:keydown="getKey">
  2. <p> {{ keyValue }} </p>
  1. data() {
  2. return {
  3. keyValue = ''
  4. }
  5. },
  6. methods: {
  7. getKey(evt) {
  8. this.keyValue = evt.key
  9. console.log(evt.key)
  10. }
  11. }

我们还可以选择将事件限制为仅当鼠标单击或按键与系统修改键 .alt, .ctrl, .shift.meta 组合时发生。系统修改键 .meta 表示 Windows 计算机上的 Windows 键,或苹果计算机上的命令键。

键修饰符详情
.[Vue key alias]Vue 中最常见的键都有自己的别名:
  • .enter
  • .tab
  • .delete
  • .esc
  • .space
  • .up
  • .down
  • .left
  • .right
.[letter]指定按键时出现的字母。比如: 使用 .s 键修饰符监听 'S' 键。
.[system modifier key].alt, .ctrl, .shift 或者 .meta. 这些键可以与其他键组合使用,也可以与鼠标单击组合使用。
实例

当用户在 <textarea> 标记中写入 's' 时,使用 .s 修饰符可以创建警示框。

  1. <div id="app">
  2. <p>Try pressing the 's' key:</p>
  3. <textarea v-on:keyup.s="createAlert"></textarea>
  4. </div>
  5. <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
  6. <script>
  7. const app = Vue.createApp({
  8. methods: {
  9. createAlert() {
  10. alert("You pressed the 'S' key!")
  11. }
  12. }
  13. })
  14. app.mount('#app')
  15. </script>

组合键盘事件修饰符

事件修饰符也可以相互组合使用,因此要调用的方法必须同时发生多个事件。

实例

当在 <textarea> 标记内同时按下 's' 和 'ctrl' 时,可以组合使用 .s.ctrl 修饰符来创建警示框。

  1. <div id="app">
  2. <p>Try pressing the 's' key:</p>
  3. <textarea v-on:keydown.ctrl.s="createAlert"></textarea>
  4. </div>
  5. <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
  6. <script>
  7. const app = Vue.createApp({
  8. methods: {
  9. createAlert() {
  10. alert("You pressed the 'S' and 'Ctrl' keys, in combination!")
  11. }
  12. }
  13. })
  14. app.mount('#app')
  15. </script>

鼠标按钮修饰符

要对鼠标单击做出反应,我们可以编写 v-on:click,但要指定单击的鼠标按钮,我们可以使用 .left, .center.right 修饰符。

触控板用户:你可能需要用两根手指点击,或者在电脑上触控板的右下侧点击才能创建右键点击。
实例

当用户右键单击 <div> 元素时,更改背景颜色:

  1. <div id="app">
  2. <div v-on:click.right="changeColor"
  3. v-bind:style="{backgroundColor:'hsl('+bgColor+',80%,80%)'}">
  4. <p>Press right mouse button here.</p>
  5. </div>
  6. </div>
  7. <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
  8. <script>
  9. const app = Vue.createApp({
  10. data() {
  11. return {
  12. bgColor: 0
  13. }
  14. },
  15. methods: {
  16. changeColor() {
  17. this.bgColor+=50
  18. }
  19. }
  20. })
  21. app.mount('#app')
  22. </script>

鼠标按钮事件也可以与系统修饰符键结合使用。

实例

当用户右键单击 <div> 元素并结合 'ctrl' 键时,更改背景颜色:

  1. <div id="app">
  2. <div v-on:click.right.ctrl="changeColor"
  3. v-bind:style="{backgroundColor:'hsl('+bgColor+',80%,80%)'}">
  4. <p>Press right mouse button here.</p>
  5. </div>
  6. </div>
  7. <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
  8. <script>
  9. const app = Vue.createApp({
  10. data() {
  11. return {
  12. bgColor: 0
  13. }
  14. },
  15. methods: {
  16. changeColor() {
  17. this.bgColor+=50
  18. }
  19. }
  20. })
  21. app.mount('#app')
  22. </script>

除了 .right 修饰符之外,还可以使用事件修饰符 .prevent,以防止我们右键单击时出现默认的下拉菜单。

实例

右键单击以更改 <div> 元素的背景色时,将阻止出现下拉菜单:

  1. <div id="app">
  2. <div v-on:click.right.prevent="changeColor"
  3. v-bind:style="{backgroundColor:'hsl('+bgColor+',80%,80%)'}">
  4. <p>Press right mouse button here.</p>
  5. </div>
  6. </div>
  7. <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
  8. <script>
  9. const app = Vue.createApp({
  10. data() {
  11. return {
  12. bgColor: 0
  13. }
  14. },
  15. methods: {
  16. changeColor() {
  17. this.bgColor+=50
  18. }
  19. }
  20. })
  21. app.mount('#app')
  22. </script>
通过在方法中使用 event.preventDefault(),可以防止右键单击后出现下拉菜单,但使用 .prevent 修饰符,代码变得更可读,更易于维护。您还可以将鼠标左键单击与其他修饰符结合使用,如 click.left.shift
实例

按住 'shift' 键盘键并在 <img> 标记上按下鼠标左键可以更改图像。

  1. <div id="app">
  2. <p>Hold 'Shift' key and press left mouse button:</p>
  3. <img v-on:click.left.shift="changeImg" v-bind:src="imgUrl">
  4. </div>
  5. <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
  6. <script>
  7. const app = Vue.createApp({
  8. data() {
  9. return {
  10. imgUrlIndex: 0,
  11. imgUrl: 'img_tiger_square.jpeg',
  12. imgages: [
  13. 'img_tiger_square.jpeg',
  14. 'img_moose_square.jpeg',
  15. 'img_kangaroo_square.jpeg'
  16. ]
  17. }
  18. },
  19. methods: {
  20. changeImg() {
  21. this.imgUrlIndex++
  22. if(this.imgUrlIndex>=3){
  23. this.imgUrlIndex=0
  24. }
  25. this.imgUrl = this.images[this.imgUrlIndex]
  26. }
  27. }
  28. })
  29. app.mount('#app')
  30. </script>