Vue中事件修饰符

一、语法

xxx代表修饰符

@click.xxx = 'fn'

二、修饰符汇总

  • stop :阻止事件冒泡;
  • once : 事件只可被执行一次;
  • native :保证自定义组件上的事件可以被执行;
  • prevent : 阻止默认事件的发生;
  • keyCode : 指定键位触发事件;
  • self :只有绑定事件本身被执行某个操作时,事件才会被触发;
  • passive : 不去阻止默认事件发生;
  • capture : 事件捕获;
  • sync :子组件更新父组件的传递值;
  • left /middle /right : 指定鼠标键位触发事件;

三、用法

3.1、修饰符 —— .stop

阻止事件冒泡

  <view>
            <view @click='fatherClick' class="padding-tb-lgx bg-gradual-blue">
                <button @click.stop='childrenClick'>点击</button>
            </view>
        </view>

        methods: {
            fatherClick(){
                console.log(1);
            },
            childrenClick(){
                console.log(2);
            }
        },

不添加.stop修饰符的情况下点击button按钮时先后触发事件打印出2 1,即事件冒泡给了父级,父级事件被一同触发。添加.stop修饰符后可避免此情况发生。

3.2、 修饰符 —— .once

顾名思义,事件只可被执行一次。

<view>
            <view @click.self='fatherClick' class="padding-tb-lgx bg-gradual-blue">
                <button @click.once='childrenClick'>点击</button>
            </view>
        </view>

        methods: {
            fatherClick(){
                console.log(1);
            },
            childrenClick(){
                console.log(2);
            }
        },

点击加了.once修饰符的button按钮,事件打印只执行一次,此后`多次点击 事件不生效。

3.3、 修饰符 —— .native

保证自定义组件上的事件可以被执行

<view class="padding-tb-lgx bg-gradual-blue">
  <ybh-tags @click.native='childrenClick' :config='configTags'></ybh-tags>
</view>

methods: {
  childrenClick(){
    console.log(2);
  }
},

一般在组件定义事件无法被直接执行的,大多是通过组件内部的emit广播出处理后的数据,父级通过组件中emit广播的参数名写成方法形式接收,但是通过给事件添加.native后可以直接生效该事件。

3.4、修饰符 —— .prevent

阻止默认事件的发生,比如a标签的跳转button的提交等。

<a href="#" @click.prevent="clickEvent(1)">点我</a>

methods: {
        clickEvent(num) {
            不加 prevent 点击a标签 先跳转然后输出 1
            加了 prevent 点击a标签 不会跳转只会输出 1
            console.log(num)
        }
    }

3.5、修饰符 —— .keyCode

指定键盘键位触发对应事件,一般配合事件@keyup使用,如指定按ctrl事件触发事件 @keyup.ctrl ;

<input type="number" @keyup.ctrl="children">

也可以有多种搭配,需自行尝试。

Vue提供的keyCode:

//普通键
.enter 
.tab
.delete //(捕获“删除”和“退格”键)
.space
.esc
.up
.down
.left
.right
//系统修饰键
.ctrl
.alt
.meta
.shift

如果如果想直接调用 @keyup.f2 = "add" ,需要自定义全局按键

解决方案如下:键盘对应的键码链接 (https://blog.csdn.net/weixin_42218847/article/details/81411291)
//自定义全局按键修饰符
Vue.config.keyCodes.F2 = 113
<!-- 自定义按键修饰  按  f2 添加 -->
<input type="text" name="" id="" value="" class="form-control" v-model="name" @keyup.113="add"/> 

3.6、修饰符 —— .self

只有绑定事件本身被执行某个操作时,事件才会被触发。有点绕,看示例:

 <view>
            <view @click.self='fatherClick' class="padding-tb-lgx bg-gradual-blue">
                <button @click='childrenClick'>点击</button>
            </view>
        </view>

        methods: {
            fatherClick(){
                console.log(1);
            },
            childrenClick(){
                console.log(2);
            }
        },

如果不在父级标签的点击事件上添加.self修饰符,点击button按钮时,会先后触发事件打印出 2 1,形成了事件冒泡,此时对父级事件添加.self后,由于触发的对象并不是父级标签,所以父级标签上的事件不会被触发,点击button后只会打印出 2。

3.7、修饰符 ——.passive

不在阻止默认事件的发生;提问:本来就默认执行了,还要加这玩意干嘛嘞???

每个事件执行时,系统都会看一看这个执行的事件有没有被什么 .prevent(阻止默认) 的家伙阻止掉,没有最好,有那就没办法,老老实实听它的。正常情况事件执行次数少或连续执行时间不会很短时是没什么大问题,但是如果是屏幕滚动事件,需要在短时间内连续触发很多次时,每次执行都会问一下这一次有没有被阻止啊啥的,严重影响了性能,就可能会照成滑动卡顿、不流畅的现象。

怎么办嘞?这时候就在事件上加上.passive,直接跟这个事件脸上贴上“ 我没有阻止的倾向 ”,不用再问我有没有被阻止啦。

<div @scroll.passive="onScroll">...</div>

3.8、修饰符 ——.capture

用于事件捕获,与冒泡相反


     <view>
            <view @click.capture='fatherClick' class="padding-tb-lgx bg-gradual-blue">
                <button @click='childrenClick'>点击</button>
            </view>
        </view>

        methods: {
            fatherClick(){
                console.log(1);
            },
            childrenClick(){
                console.log(2);
            }
        },

不加.capture修饰时,点击button会前后触发事件冒泡打印出 2 1,而添加了.capture修饰后 事件打印变为 1 2

3.9、修饰符 ——.sync

父组件传递给子组件值后,若子组件需要更新父组件传递的这个值时在父组件传递值的属性上使用此修饰符。(vue组件之间传值时单向数据流,一般不支持子组件直接更改父组件值)

//父组件 :
<ybh-tags :isShow.sync='show'></ybh-tags>
data(){
  return {
    show : true,
  }
}
//子组件:
this.$emit('update:isShow',false);

以上代码实现内容为:子组件在父组件传递的show为true时显示,子组件关闭(子组件将父组件传递的show值改为false)后子组件隐藏。但是由于控制子组件显隐的show值是父组件传递过来的,在子组件中直接更改show值无法改变父级中的show值,所以导致了父组件在打开一次子组件后,子组件关闭将无法在此显示子组件内容。因为父级在第一次将show值改为true之后,并没有因为子组件将show值改为false而变成false,导致了父组件的show值一直保持在了true的状态。

3.10、 left /middle /right

指定鼠标键位触发对应事件

 <button @click.middle="clickEvent(1)"  @click.left="clickEvent(2)"  @click.right="clickEvent(3)">点我</button>

  methods: {
        点击中键输出1
        点击左键输出2
        点击右键输出3
        clickEvent(num) {
            console.log(num)
        }
    }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容