前端Vue日常工作中--Vue事件修饰符

前端Vue日常工作中–Vue事件修饰符

文章目录

  • 前端Vue日常工作中--Vue事件修饰符
      • 1.`.stop`: 阻止事件冒泡
      • 2.`.prevent`: 阻止事件的默认行为
      • 3.`.capture`: 使用事件捕获模式
      • 4.`.self`: 元素本身触发时才触发回调
      • 5.`.once`: 事件只触发一次
      • 6.`.passive`:提示浏览器不想阻止事件的默认行为,用于提高性能
      • 7.`.native`: 监听组件根元素的原生事件。
      • 8.`.keyCode`/`.key`: 限制处理事件的 keyCode 或 key。
      • 9.`.left`/`.right`/`.middle`: 仅当点击鼠标左/右/中键时触发。
      • 10.`.stop.prevent`: 同时阻止事件冒泡和默认行为。
      • 11.`.sync`: 在子组件中更新一个由父组件传递的 prop
      • 12.`.exact`: 按键组合的触发条件。

1..stop: 阻止事件冒泡

修饰符用于阻止事件冒泡,即防止事件从子组件冒泡到父组件,相当于调用 event.stopPropagation()


<el-button @click.stop="handleClick">Click meel-button>
<template>
  <div @click="handleParentClick">
    
    <el-button @click.stop="handleButtonClick">Click meel-button>
  div>
template>

<script>
export default {
  methods: {
    handleButtonClick() {
      console.log('按钮点击');
    },
    handleParentClick() {
      console.log('父组件点击');
    },
  },
};
script>

当点击按钮时,@click.stop 修饰符会阻止点击事件冒泡到父元素,因此不会触发 handleParentClick 方法。如果去掉 .stop 修饰符,点击按钮时会触发父元素的点击事件。

2..prevent: 阻止事件的默认行为

修饰符用于阻止事件的默认行为,即防止事件触发默认的浏览器行为,相当于调用 event.preventDefault()


<el-form @submit.prevent="handleSubmit">el-form>
<template>
  <div>
    
    <el-form @submit.prevent="handleSubmit">
      <el-button type="primary" native-type="submit">Submitel-button>
    el-form>
  div>
template>

<script>
export default {
  methods: {
    handleSubmit() {
      console.log('表单提交');
      // 阻止表单的默认提交行为
      // 通过 @submit.prevent 已经阻止了默认行为,所以这里不需要再调用 event.preventDefault()
    },
  },
};
script>

@submit.prevent 修饰符会阻止表单提交的默认行为,即页面不会因为表单提交而刷新。这是通过调用 event.preventDefault() 来实现的。.prevent 修饰符提供了一种简洁的方式,避免在方法中手动调用 event.preventDefault()

3..capture: 使用事件捕获模式

添加事件监听器时使用事件捕获模式。可以将事件监听器添加到事件捕获阶段,而不是默认的事件冒泡阶段。


<el-button @click.capture="handleCapture">Click meel-button>
<template>
  <div>
    
    <el-button @click.capture="handleCaptureClick">Click meel-button>
  div>
template>

<script>
export default {
  methods: {
    handleCaptureClick() {
      console.log('按钮捕获事件');
    },
  },
};
script>

@click.capture 修饰符将事件监听器添加到按钮的点击事件的捕获阶段。这意味着事件处理函数 handleCaptureClick 会在按钮的点击事件传播到目标元素之前被触发。在实际应用中,通常情况下我们使用的是事件冒泡阶段,而不是事件捕获阶段。.capture 修饰符在特定场景下使用,可以用于处理特殊需求。

4..self: 元素本身触发时才触发回调

只当事件是从侦听器绑定的元素本身触发时才触发回调。用于确保事件只有在绑定事件的元素本身触发时才会触发回调,而不是在其子元素触发时。


<el-button @click.self="handleClick">Click meel-button>
<template>
  <div @click.self="handleClickOutside">
    <el-button @click="handleButtonClick">Click meel-button>
  div>
template>

<script>
export default {
  methods: {
    handleButtonClick() {
      console.log('按钮点击');
    },
    handleClickOutside() {
      console.log('外部点击');
    },
  },
};
script>

@click.self 修饰符确保只有在点击 div 元素本身时,才会触发 handleClickOutside 方法,而不是在点击按钮时触发。如果去掉 .self 修饰符,点击按钮时也会触发 handleClickOutside 方法,因为按钮是 div 的子元素。

5..once: 事件只触发一次

修饰符用于确保事件只触发一次。一旦事件被触发后,事件监听器将被自动移除。


<el-button @click.once="handleClick">Click me onceel-button>
<template>
  <div>
    
    <el-button @click.once="handleClickOnce">Click me onceel-button>
  div>
template>

<script>
export default {
  methods: {
    handleClickOnce() {
      console.log('触发一次');
    },
  },
};
script>

@click.once 修饰符确保 handleClickOnce 方法只会在第一次点击按钮时被触发,之后再点击按钮不会再触发该方法。这在一些需要确保事件只执行一次的场景中很有用,例如执行一次性的初始化逻辑。

.once (自定义事件): 在2.1.8+版本中,.once 修饰符也可以用于自定义事件

  
  <my-component @custom-event.once="handleCustomEvent">my-component>
<template>
  <div>
    
    <el-button @custom-event.once="handleCustomEvent">Trigger Custom Eventel-button>
  div>
template>

<script>
export default {
  methods: {
    handleCustomEvent() {
      console.log('自定义事件触发一次');
      // 处理自定义事件的逻辑
    },
  },
};
script>

@custom-event.once 修饰符确保 handleCustomEvent 方法只在第一次触发 custom-event 事件时被执行,之后再次触发 custom-event 事件时将不再执行。这种方式可以用于确保某个特定的自定义事件只执行一次,适用于一次性的操作或初始化逻辑。

6..passive:提示浏览器不想阻止事件的默认行为,用于提高性能

提示浏览器你不想阻止事件的默认行为。 修饰符用于提示浏览器不需要等待事件处理函数执行完毕才继续进行默认行为。这在优化性能时可以提供一些帮助。请注意,.passive 修饰符通常用于处理滚动等高频触发的事件。


<el-container @scroll.passive="handleScroll">...el-container>
<template>
  <div>
    
    <el-container @scroll.passive="handleScroll">...el-container>
  div>
template>

<script>
export default {
  methods: {
    handleScroll() {
      console.log('正在滚动容器');
      // 这里执行滚动时的逻辑
    },
  },
};
script>

@scroll.passive 修饰符提示浏览器在滚动时不需要等待 handleScroll 方法执行完毕才进行默认的滚动操作。这有助于提高滚动性能,特别是在需要频繁触发滚动事件的情况下。

.passive 修饰符的使用场景通常限于高频触发的事件,并且不应该在可能会阻止默认行为的情况下使用。

7..native: 监听组件根元素的原生事件。

修饰符用于在组件根元素上监听原生事件。这对于在使用 Vue.js 组件时,需要监听组件根元素的原生事件时非常有用。


<el-dialog @click.native="handleDialogClick">el-dialog>
<template>
  <div>
    
    <el-dialog @click.native="handleDialogClick">
      <span>Click mespan>
    el-dialog>
  div>
template>

<script>
export default {
  methods: {
    handleDialogClick() {
      console.log('已单击对话框根元素');
      // 这里执行点击对话框根元素时的逻辑
    },
  },
};
script>

@click.native 修饰符使得 handleDialogClick 方法能够监听对话框组件根元素的原生点击事件。通常情况下,Vue.js 组件会封装一些功能,并且在组件内部处理一些事件,但有时候我们可能需要直接监听组件根元素上的原生事件,这时 .native 修饰符就派上用场了。

8..keyCode/.key: 限制处理事件的 keyCode 或 key。

.keyCode 修饰符用于限制处理事件的 keyCode,而.key 修饰符用于限制处理事件的键值。请注意,.keyCode 在 Vue.js 2.1.8+ 版本中已被废弃,推荐使用 .key 修饰符。


<el-input @keyup.enter="handleEnter">el-input>
<template>
  <div>
    
    <el-input @keyup.enter="handleEnterKey">el-input>
    
    
    <el-button @click.key="handleAKey">Click me with A keyel-button>
  div>
template>

<script>
export default {
  methods: {
    handleEnterKey() {
      console.log('按下回车键');
      // 处理按下回车键时的逻辑
    },
    handleAKey() {
      console.log('按下 A 键');
      // 处理按下 A 键时的逻辑
    },
  },
};
script>

@keyup.enter 修饰符确保 handleEnterKey 方法只在按下回车键时触发。而 @click.key="handleAKey" 修饰符确保 handleAKey 方法只在按下 A 键时触发。这种方式可以用于限制处理特定键盘按键的情况,适用于需要根据键盘输入执行不同逻辑的场景。

9..left/.right/.middle: 仅当点击鼠标左/右/中键时触发。

.left.right.middle 修饰符用于限制处理鼠标点击事件时的鼠标按钮。.left 表示左键,.right 表示右键,.middle 表示中键。


<el-button @mousedown.left="handleLeftClick">Left Clickel-button>
<template>
  <div>
    
    <el-button @mousedown.left="handleLeftClick">Left Clickel-button>

    
    <el-button @mousedown.right="handleRightClick">Right Clickel-button>

    
    <el-button @mousedown.middle="handleMiddleClick">Middle Clickel-button>
  div>
template>

<script>
export default {
  methods: {
    handleLeftClick() {
      console.log('鼠标左键点击');
    },
    handleRightClick() {
      console.log('鼠标右键点击');
    },
    handleMiddleClick() {
      console.log('鼠标中键点击');
    },
  },
};
script>

@mousedown.left 修饰符确保 handleLeftClick 方法只在鼠标左键点击时触发,而 @mousedown.right@mousedown.middle 分别确保只在鼠标右键和中键点击时触发相应的方法。这样可以根据鼠标点击的按钮执行不同的逻辑。

10..stop.prevent: 同时阻止事件冒泡和默认行为。

.stop.prevent 修饰符同时阻止事件冒泡和默认行为,即相当于调用 event.stopPropagation()event.preventDefault()


<el-button @click.stop.prevent="handleButtonClick">Click meel-button>
<template>
  <div>
    
    <el-button @click.stop.prevent="handleButtonClick">Click meel-button>
  div>
template>

<script>
export default {
  methods: {
    handleButtonClick() {
      console.log('鼠标点击');
      // 这里执行点击按钮时的逻辑
    },
  },
};
script>

@click.stop.prevent 修饰符确保 handleButtonClick 方法既阻止了按钮点击事件的冒泡,也阻止了默认行为(例如,防止按钮点击导致表单提交)。.stop.prevent 修饰符提供了一种简便的方式,同时阻止事件冒泡和默认行为,避免在方法中手动调用 event.stopPropagation()event.preventDefault()

11..sync: 在子组件中更新一个由父组件传递的 prop

修饰符用于在子组件中更新一个由父组件传递的 prop,以简化语法。当子组件更新了 prop 的值时,父组件的相应数据也会被更新。


<child :foo.sync="bar">child>

<template>
  <div>
    
    <el-input :value.sync="parentData">el-input>

    
    <child-component :data.sync="parentData">child-component>
  div>
template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent,
  },
  data() {
    return {
      parentData: 'Initial value',
    };
  },
};
script>

父组件中的 parentData 通过 :value.sync 传递给了 el-input 组件,并且同样通过 :data.sync 传递给了 child-component 子组件。在子组件中,可以直接修改 data 的值,这会同时更新父组件中的 parentData。这使得在子组件中更新父组件的数据变得更加简便。请注意,.sync 修饰符只是一种语法糖,实际上它是通过 :prop@update:prop 这两个属性进行双向绑定实现的。

12..exact: 按键组合的触发条件。

修饰符用于控制由 exact 修饰的按键组合的触发条件。在通常情况下,Vue.js 会检查按键组合的顺序,但使用 .exact 修饰符后,要求按键的顺序与修饰符的顺序一致。

 
 <el-button @click.ctrl.exact="handleCtrlClick">Ctrl + Clickel-button>
<template>
  <div>
    
    <el-button @click.ctrl.exact="handleCtrlClick">Click with Ctrlel-button>

    
    <el-button @click.shift.exact="handleShiftClick">Click with Shiftel-button>

    
    <el-button @click.ctrl.shift.exact="handleCtrlShiftClick">Click with Ctrl and Shiftel-button>
  div>
template>

<script>
export default {
  methods: {
    handleCtrlClick() {
      console.log('按下 Ctrl 键时触发事件');
    },
    handleShiftClick() {
      console.log('按下 Shift 键时触发事件');
    },
    handleCtrlShiftClick() {
      console.log('按下 Ctrl 和 Shift 键时触发事件');
    },
  },
};
script>

通过使用 .exact 修饰符,确保事件只有在按下指定的按键组合时才会触发。如果不使用 .exact,那么在同时按下 Ctrl 和 Shift 键的情况下,同时按下其他键也会触发事件。.exact 修饰符确保只有在指定的按键组合下才会触发事件。@click.ctrl.exact 修饰符要求同时按下 Ctrl 键和 A 键时才会触发 handleCtrlClick 方法。如果按键的顺序不一致,例如先按下 A 键再按下 Ctrl 键,事件将不会触发。.exact 修饰符对于需要确保按键的顺序的场景非常有用。

.exact (2.5.0+版本): .exact 修饰符也可以用于鼠标按钮的点击事件。

  
  <el-button @click.left.exact="handleLeftAndRightClick">Left and Right Clickel-button>
 <template>
   <div>
     
     <el-button @mousedown.left.exact="handleLeftClick">Left Clickel-button>
 
     
     <el-button @mousedown.right.exact="handleRightClick">Right Clickel-button>
 
     
     <el-button @mousedown.left.right.exact="handleLeftAndRightClick">Left and Right Clickel-button>
   div>
 template>
 
 <script>
 export default {
   methods: {
     handleLeftClick() {
       console.log('左键点击时触发事件');
     },
     handleRightClick() {
       console.log('右键点击时触发事件');
     },
     handleLeftAndRightClick() {
       console.log('按下左键和右键时触发事件');
     },
   },
 };
 script>
 

通过使用 .exact 修饰符,确保事件只有在按下指定的鼠标按钮组合时才会触发。如果不使用 .exact,那么在同时按下左键和右键的情况下,同时按下其他鼠标按钮也会触发事件。.exact 修饰符确保只有在指定的鼠标按钮组合下才会触发事件。

你可能感兴趣的:(Vue日常总结,vue.js,前端,javascript)