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

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

1..stop: 阻止事件冒泡

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

html 复制代码
<!-- 防止点击事件冒泡到父元素 -->
<el-button @click.stop="handleClick">Click me</el-button>
html 复制代码
<template>
  <div @click="handleParentClick">
    <!-- 点击按钮时阻止事件冒泡 -->
    <el-button @click.stop="handleButtonClick">Click me</el-button>
  </div>
</template>

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

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

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

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

html 复制代码
<!-- 阻止表单提交的默认行为 -->
<el-form @submit.prevent="handleSubmit"></el-form>
html 复制代码
<template>
  <div>
    <!-- 阻止表单提交的默认行为 -->
    <el-form @submit.prevent="handleSubmit">
      <el-button type="primary" native-type="submit">Submit</el-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: 使用事件捕获模式

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

html 复制代码
<!-- 在捕获阶段处理点击事件 -->
<el-button @click.capture="handleCapture">Click me</el-button>
html 复制代码
<template>
  <div>
    <!-- 在捕获阶段处理按钮的点击事件 -->
    <el-button @click.capture="handleCaptureClick">Click me</el-button>
  </div>
</template>

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

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

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

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

html 复制代码
<!-- 只处理按钮本身的点击事件,而不是其子元素的点击事件 -->
<el-button @click.self="handleClick">Click me</el-button>
html 复制代码
<template>
  <div @click.self="handleClickOutside">
    <el-button @click="handleButtonClick">Click me</el-button>
  </div>
</template>

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

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

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

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

html 复制代码
<!-- 只允许按钮点击一次 -->
<el-button @click.once="handleClick">Click me once</el-button>
html 复制代码
<template>
  <div>
    <!-- 点击按钮时事件只会触发一次 -->
    <el-button @click.once="handleClickOnce">Click me once</el-button>
  </div>
</template>

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

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

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

html 复制代码
  <!-- 自定义事件只触发一次 -->
  <my-component @custom-event.once="handleCustomEvent"></my-component>
html 复制代码
<template>
  <div>
    <!-- 自定义事件只触发一次 -->
    <el-button @custom-event.once="handleCustomEvent">Trigger Custom Event</el-button>
  </div>
</template>

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

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

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

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

html 复制代码
<!-- 使用.passive优化滚动性能 -->
<el-container @scroll.passive="handleScroll">...</el-container>
html 复制代码
<template>
  <div>
    <!-- 使用.passive优化滚动性能 -->
    <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 组件时,需要监听组件根元素的原生事件时非常有用。

html 复制代码
<!-- 监听组件根元素的原生点击事件 -->
<el-dialog @click.native="handleDialogClick"></el-dialog>
html 复制代码
<template>
  <div>
    <!-- 监听对话框的原生点击事件 -->
    <el-dialog @click.native="handleDialogClick">
      <span>Click me</span>
    </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 修饰符。

html 复制代码
<!-- 按下回车键触发事件 -->
<el-input @keyup.enter="handleEnter"></el-input>
html 复制代码
<template>
  <div>
    <!-- 按下回车键触发事件 -->
    <el-input @keyup.enter="handleEnterKey"></el-input>
    
    <!-- 按下 A 键触发事件 -->
    <el-button @click.key="handleAKey">Click me with A key</el-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 表示中键。

html 复制代码
<!-- 仅处理鼠标左键点击事件 -->
<el-button @mousedown.left="handleLeftClick">Left Click</el-button>
html 复制代码
<template>
  <div>
    <!-- 仅处理鼠标左键点击事件 -->
    <el-button @mousedown.left="handleLeftClick">Left Click</el-button>

    <!-- 仅处理鼠标右键点击事件 -->
    <el-button @mousedown.right="handleRightClick">Right Click</el-button>

    <!-- 仅处理鼠标中键点击事件 -->
    <el-button @mousedown.middle="handleMiddleClick">Middle Click</el-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()

html 复制代码
<!-- 阻止按钮点击事件的冒泡和默认行为 -->
<el-button @click.stop.prevent="handleButtonClick">Click me</el-button>
html 复制代码
<template>
  <div>
    <!-- 阻止按钮点击事件的冒泡和默认行为 -->
    <el-button @click.stop.prevent="handleButtonClick">Click me</el-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 的值时,父组件的相应数据也会被更新。

html 复制代码
<!-- 阻止事件冒泡和默认行为 -->
<child :foo.sync="bar"></child>
<!--在子组件中,可以通过 `this.$emit('update:foo', newValue)` 来通知父组件更新。-->
html 复制代码
<template>
  <div>
    <!-- 父组件中的数据,通过 .sync 更新 -->
    <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 修饰符后,要求按键的顺序与修饰符的顺序一致。

html 复制代码
 <!-- 需要同时按下 Alt 和 A 键 -->
 <el-button @click.ctrl.exact="handleCtrlClick">Ctrl + Click</el-button>
html 复制代码
<template>
  <div>
    <!-- 只有在按下 Ctrl 键时触发事件 -->
    <el-button @click.ctrl.exact="handleCtrlClick">Click with Ctrl</el-button>

    <!-- 只有在按下 Shift 键时触发事件 -->
    <el-button @click.shift.exact="handleShiftClick">Click with Shift</el-button>

    <!-- 同时按下 Ctrl 和 Shift 键时触发事件 -->
    <el-button @click.ctrl.shift.exact="handleCtrlShiftClick">Click with Ctrl and Shift</el-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 修饰符也可以用于鼠标按钮的点击事件。

html 复制代码
  <!-- 需要同时按下左键和右键 -->
  <el-button @click.left.exact="handleLeftAndRightClick">Left and Right Click</el-button>
html 复制代码
 <template>
   <div>
     <!-- 只有在左键点击时触发事件 -->
     <el-button @mousedown.left.exact="handleLeftClick">Left Click</el-button>
 
     <!-- 只有在右键点击时触发事件 -->
     <el-button @mousedown.right.exact="handleRightClick">Right Click</el-button>
 
     <!-- 同时按下左键和右键时触发事件 -->
     <el-button @mousedown.left.right.exact="handleLeftAndRightClick">Left and Right Click</el-button>
   </div>
 </template>
 
 <script>
 export default {
   methods: {
     handleLeftClick() {
       console.log('左键点击时触发事件');
     },
     handleRightClick() {
       console.log('右键点击时触发事件');
     },
     handleLeftAndRightClick() {
       console.log('按下左键和右键时触发事件');
     },
   },
 };
 </script>
 

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

相关推荐
用户21411832636023 分钟前
首发!即梦 4.0 接口开发全攻略:AI 辅助零代码实现,开源 + Docker 部署,小白也能上手
前端
gnip2 小时前
链式调用和延迟执行
前端·javascript
SoaringHeart2 小时前
Flutter组件封装:页面点击事件拦截
前端·flutter
杨天天.2 小时前
小程序原生实现音频播放器,下一首上一首切换,拖动进度条等功能
前端·javascript·小程序·音视频
Dragon Wu2 小时前
React state在setInterval里未获取最新值的问题
前端·javascript·react.js·前端框架
Jinuss2 小时前
Vue3源码reactivity响应式篇之watch实现
前端·vue3
YU大宗师2 小时前
React面试题
前端·javascript·react.js
木兮xg2 小时前
react基础篇
前端·react.js·前端框架
ssshooter3 小时前
你知道怎么用 pnpm 临时给某个库打补丁吗?
前端·面试·npm
IT利刃出鞘3 小时前
HTML--最简的二级菜单页面
前端·html