vue 修饰符?

本文介绍了Vue.js中用于事件监听和输入绑定的各种修饰符,包括如何阻止事件冒泡、防止默认行为、开启捕获模式等,并展示了如何利用这些修饰符优化用户体验。

未来不完美,所以一直要努力

一、vue修饰符 — v-on修饰符

修饰符:

.stop: 阻止事件冒泡

  • .stop- 调用 event.stopPropagation()。
    阻止事件冒泡:
<template>
  <div class="parent" @click="clickParent">
    我是父元素
    <div class="child" @click="clickChild">我是子元素</div>
  </div>
</template>

当点击子元素时,默认行为是先触发子元素点击事件,再触发父元素点击事件。显然,有时候这并不是我们所期待的。我们可使用event.stopPropagation()来阻止事件冒泡。
而在Vue里,则可以使用修饰符进行处理,需要给子组件点击事件添加修饰符,如下:

 <div class="child" @click.stop="clickChild">我是子元素</div>

.prevent: 阻止默认事件

  • .prevent- 调用 event.preventDefault()。
    阻止默认事件:
<template>
  <form v-model="formData" @submit="submitForm">
    姓名
    <input type="text" v-model="name" />
    <br />
    <button>submit</button>
  </form>
</template>

当点击提交按钮时,默认行为是提交表单数据且刷新当前页面。而如果想要阻止默认事件则需要添加event.preventDefault()
而在Vue里则可使用修饰符.prevent即可阻止默认事件,如:

  <form v-model="formData" @submit.prevent="submitForm">

.capture: 开启捕获模式

  • .capture- 添加事件侦听器时使用 capture 模式。
    开启冒泡模式:
<template>
  <div class="parent" @click="clickParent">
    我是父元素
    <div class="child" @click="clickChild">我是子元素</div>
  </div>
</template>

有时我们仅仅是想点击父元素,却因为子元素层级比父元素相对高一些,所以会从子元素冒泡到父元素。但是,这并不是所期望的。在原生JS,开启方式为addEventListener(handleType, cllBack, useCapture),当useCapturetrue时,则代表开启捕获模式。
而在Vue里,则可使用修饰符.capture即可,如下:

<template>
  <div class="parent" @click.capture="clickParent">
    我是父元素
    <div class="child" @click="clickChild">我是子元素</div>
  </div>
</template>

.self: 仅当点击自身才会触发回调

  • .self- 只当事件是从侦听器绑定的元素本身触发时才触发回调。
<template>
  <div class="parent" @click="clickParent">
    我是父元素
    <div class="child" @click="clickChild">我是子元素</div>
  </div>
</template>

正常点击父元素时,有可能是点击了子元素冒泡到父元素;有可能是开启了捕获模式从而后触发子元素事件。但两者均非所期待,为什么点击一个元素会触发两个标签绑定的事件?
在Vue里,可以使用.self来进行限制,如下:

<template>
  <div class="parent" @click.self="clickParent">
    我是父元素
    <div class="child" @click.stop="clickChild">我是子元素</div>
  </div>
</template>

如此,就可仅触发期望的事件。


  • .native- 监听组件根元素的原生事件。
// TODO:

.once: 只触发一次回调

  • .once- 只触发一次回调。
<template>
  <button @click="clickHandle">只有第一次点击会有效果</button>
</template>

上述为正常情况下的事件绑定。有时只希望按钮第一次点击可以生效,后续在点击不希望生效
在Vue中,可以使用.once,修改如下:

<button @click.once="clickHandle">只有第一次点击会有效果</button>

.{keyCode | keyAlias}: 监听特定键从而引发回调

  • .{keyCode | keyAlias}- 只当事件是从特定键触发时才触发回调。
<template>
  <input type="text" @keyup="inputHandle" />
</template>

这是正常情况下的输入事件,可以在inputHandle回调事件的第一个默认参数里获取到keykeyCode、code、key等一些列参数。
如果想监听指定键的事件,在Vue里可以直接使用上述参数里的key进行操作。如下监听A键的按下的事件:

<template>
  <input type="text" @keydown.65="inputHandle" />
</template>

仅在按下字母A键的时候,才会执行该回调


特殊键盘按键监听

Vue官方提供的按键修饰符:

  • .enter // 回车键抬起
  • .tab // tab切换键抬起
  • .delete (捕获“删除”和“退格”键)
  • .esc //退出键抬起
  • .space // 空格键抬起
  • .up // 上
  • .down // 下
  • .left // 左
  • .right // 右
  • .对应键盘码 // 使用键盘码是要注意如果不是以上对应的键盘修饰符,需要创建按键修饰符
<template>
// 回车键监听
  <input type="text" @keydown.enter="inputHandle" /> 
  // tab键监听
  <input type="text" @keydown.tab="inputHandle" />
  // 删除键监听
  <input type="text" @keydown.delete="inputHandle" />
  // esc键监听
  <input type="text" @keydown.esc="inputHandle" />
  // space空格键监听
  <input type="text" @keydown.space="inputHandle" />
  // 上键监听
  <input type="text" @keydown.up="inputHandle" />
  // 下键监听
  <input type="text" @keydown.down="inputHandle" />
  // 左键监听
  <input type="text" @keydown.left="inputHandle" />
  // 右键监听
  <input type="text" @keydown.right="inputHandle" />
</template>

如果想要监听组合件,可直接连缀。如监听 shfit + enter 组合键:

<template>
  <input type="text" @keydown.shift.enter="inputHandle" />
</template>

二、vue修饰符 — v-mode修饰符

  • .lazy- 取代 input 监听 change 事件
  • .number- 输入字符串转为有效的数字
  • .trim- 输入首尾空格过滤

.lazy示例:

<template>
  <input type="text" v-model.lazy="lazyValue" />
</template>

这种情况,在你输入的过程中并不会实时将数据同步至data里,.lazy会在你的输入框失焦时再进行同步数据的操作


.lazy示例:

<template>
  <input type="number" v-model.number="lazyValue" />
</template>

这种情况下,input的type属性限制只能输入number值,但是将其同步至data中时,默认转换为字符串。而.number的作用就是将其同步至data中时依旧保持为number格式


.trim示例:

<template>
  <input type="text" v-model.trim="lazyValue" />
</template>

这种情况下,无论在输入内容的最开始和最后加多少个空格,Vue将其同步至data中时会去掉首尾的所有空格

Vue修饰符是一种简洁的语法糖,用于修改Vue指令的行为,能够让开发者更简洁地处理一些常见场景,在开发过程中更加高效和灵活[^1]。以下是不同类型的Vue修饰符介绍: ### 表单修饰符 - **.lazy**:默认情况下,`v-model` 在每次 `input` 事件触发后将输入框的值与数据进行同步,使用 `.lazy` 修饰符会转变为在 `change` 事件之后进行同步。 ```vue <template> <input v-model.lazy="message"> </template> <script> export default { data() { return { message: '' }; } }; </script> ``` - **.trim**:如果要自动过滤用户输入的首尾空白字符,可以给 `v-model` 添加 `.trim` 修饰符。 ```vue <template> <input v-model.trim="message"> </template> <script> export default { data() { return { message: '' }; } }; </script> ``` - **.number**:如果想让用户输入的值自动转换为数字类型,可以给 `v-model` 添加 `.number` 修饰符。 ```vue <template> <input v-model.number="age" type="number"> </template> <script> export default { data() { return { age: 0 }; } }; </script> ``` ### 事件修饰符 - **.stop**:阻止事件冒泡。 ```vue <template> <div @click="parentClick"> <button @click.stop="childClick">点击我</button> </div> </template> <script> export default { methods: { parentClick() { console.log('父元素点击事件'); }, childClick() { console.log('子元素点击事件'); } } }; </script> ``` - **.prevent**:阻止默认事件。 ```vue <template> <form @submit.prevent="onSubmit"> <input type="submit" value="提交"> </form> </template> <script> export default { methods: { onSubmit() { console.log('表单提交被阻止'); } } }; </script> ``` - **.self**:只当事件是从事件绑定的元素本身触发时才触发回调。 ```vue <template> <div @click.self="divClick"> <button @click="buttonClick">按钮</button> </div> </template> <script> export default { methods: { divClick() { console.log('点击了div本身'); }, buttonClick() { console.log('点击了按钮'); } } }; </script> ``` - **.once**:事件只触发一次。 ```vue <template> <button @click.once="clickOnce">只点击一次</button> </template> <script> export default { methods: { clickOnce() { console.log('按钮只被点击了一次'); } } }; </script> ``` - **.capture**:使用事件捕获模式,即元素自身触发的事件先在此处处理,然后才交由内部元素进行处理。 ```vue <template> <div @click.capture="captureClick"> <button @click="buttonClick">按钮</button> </div> </template> <script> export default { methods: { captureClick() { console.log('捕获模式触发'); }, buttonClick() { console.log('按钮点击'); } } }; </script> ``` - **.passive**:`.passive` 修饰符一般用于滚动事件,用来告诉浏览器你不想阻止事件的默认行为,避免浏览器卡顿。 ```vue <template> <div @scroll.passive="onScroll" style="height: 200px; overflow: auto;"> <!-- 内容 --> </div> </template> <script> export default { methods: { onScroll() { console.log('滚动事件触发'); } } }; </script> ``` - **.native**:用于监听组件根元素的原生事件。 ```vue <template> <MyComponent @click.native="nativeClick"></MyComponent> </template> <script> import MyComponent from './MyComponent.vue'; export default { components: { MyComponent }, methods: { nativeClick() { console.log('原生点击事件触发'); } } }; </script> ``` ### 鼠标按键修饰符 鼠标按键修饰符可以限制事件仅在特定的鼠标按键下触发。 ```vue <template> <button @click.left="leftClick">左键点击</button> <button @click.right="rightClick">右键点击</button> </template> <script> export default { methods: { leftClick() { console.log('左键点击触发'); }, rightClick() { console.log('右键点击触发'); } } }; </script> ``` ### v-bind修饰符 - **.sync**:当一个子组件改变了一个 `props` 的值时,这个变化也会同步到父组件中所绑定。通俗地说,`.sync` 修饰符可以实现子组件与父组件的双向绑定,并且可以实现子组件同步修改父组件的值 [^2][^4]。 ```vue <!-- 父组件 --> <template> <ChildComponent :title.sync="pageTitle" /> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, data() { return { pageTitle: '默认标题' }; } }; </script> <!-- 子组件 --> <template> <button @click="updateTitle">更新标题</button> </template> <script> export default { props: ['title'], methods: { updateTitle() { this.$emit('update:title', '新标题'); } } }; </script> ``` - **.prop**:强制绑定为 DOM 属性。 ```vue <template> <div v-bind:some-prop.prop="value"></div> </template> <script> export default { data() { return { value: '属性值' }; } }; </script> ``` - **.camel**:在使用 DOM 模板时,将 kebab-case 特性名转换为 camelCase。 ```vue <template> <div v-bind:my-prop.camel="value"></div> </template> <script> export default { data() { return { value: '属性值' }; } }; </script> ``` ### 键盘按键修饰符 - **keyCode**:可以使用按键的 keyCode 来监听特定按键的事件。不过在 Vue 3 中,不推荐使用 keyCode,而是使用按键别名。 ```vue <template> <input @keyup.13="onEnter"> </template> <script> export default { methods: { onEnter() { console.log('按下了回车键'); } } }; </script> ``` - **常用的 keyCode 别名**:Vue 为一些常用的按键提供了别名,如 `.enter`、`.tab`、`.delete`(捕获“删除”和“退格”键)、`.esc`、`.space`、`.up`、`.down`、`.left`、`.right` 等。 ```vue <template> <input @keyup.enter="onEnter"> </template> <script> export default { methods: { onEnter() { console.log('按下了回车键'); } } }; </script> ``` - **.exact**:`.exact` 修饰符允许你控制由精确的系统修饰符组合触发的事件。 ```vue, <template> <button @click.ctrl.exact="ctrlClick">Ctrl + 点击</button> </template> <script> export default { methods: { ctrlClick() { console.log('按下 Ctrl 并点击了按钮'); } } }; </script> ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值