欢迎光临
个人技术文档整理

Vue:常用事件处理

v-on 事件的基本用法 

  • 使用 v-on:xxx或**@xxx**绑定事件,其中 xxx 是事件名
  • 事件的回调需要配置在methods对象中,最终会在vm
  • methods中的函数,不要用箭头函数,否则this就不是vm
  • methods中的函数,都是被Vue所管理的函数,this 的指向是vm组件实例对象
  • @click="demo"和@click=“demo($event)” 效果一致,但后者可以传参
    <div id="app">
        <button v-on:click="showInfo">提示(不传参)</button>
        <button @click="del(66,$event)">删除(传参)</button>
    </div>

    <script type="text/javascript">
        new Vue({
            el: '#app',
            methods: {
                showInfo(event) {
                    console.log(event.target);
                    console.log("点击了 showInfo");
                },
                del: function (id, event) {
                    console.log(event.target);
                    console.log("删除id=" + id);
                }
            }
        })

    </script>

 

事件修饰符

  • prevent 阻止事件的默认行为(常用)
            <div class="box1">
                <a href="http://www.baidu.com" @click.prevent="showMsg('1')">阻止事件的默认行为</a>
            </div>

     

  • stop 阻止事件冒泡,从而防止其被祖先元素捕获(常用)
            <!-- 
                点击儿子:
                1、默认执行顺序: 儿子->父亲
                2、阻止事件冒泡, 儿子 
            -->
            <div class="box1" @click="showMsg('父亲1')">
                父亲1
                <div class="box2" @click.stop="showMsg('儿子2')">儿子2</div>
            </div>

     

  • once 事件只触发一次(常用)
    <button @click.once="showMsg('1')">一次性按钮</button>

     

  • capture 使用事件的捕获模式(先捕获后冒泡)
            <!-- 
                点击儿子:
                1、默认执行顺序: 儿子->父亲
                2、使用事件捕获模式,点击儿子,执行顺序:父亲->儿子 
            -->
    
            <div class="box1" @click.capture="showMsg('父亲1')">
                父亲1
                <div class="box2" @click="showMsg('儿子2')">儿子2</div>
            </div>

     

  • self 只有event.target元素本身触发时才执行
            <!-- 
                 点击儿子:
                1、默认执行顺序: 儿子->父亲
                2、使用self,执行顺序: 儿子 
                --功能有点类似,阻止冒泡
            -->
            <div class="box1" @click.self="showMsg('父亲1')">
                父亲1
                <div class="box2" @click="showMsg('儿子2')">儿子2</div>
            </div>

     

  • passive 事件的默认行为立即执行,无需等待事件回调执行完毕
            <!-- 
                事件的默认行为立即执行,无需等待事件回调执行完毕,如:事件中耗时操作   (从而提高页面的滚动性能)
                wheel是鼠标滚轮滚动,passive有影响
                1、默认执行顺序: 页面滚动卡顿  
                2、使用passive,优先响应滚动
            -->
    
            <div class="box1" @click.capture="showMsg('父亲1')">
                <ul @wheel.passive="wheel" class="list">
                    <li>1</li>
                    <li>2</li>
                </ul>
            </div>

补充:

    <script type="text/javascript">
        new Vue({
            el: '#app',
            methods: {
                showMsg(msg) {
                    console.log(event.target);
                    console.log(msg);
                },
                //鼠标滚轮 事件
                wheel(event) {
                     
                    
                    for (let index = 0; index < 10000; index++) {
                        console.log("#--耗时中");
                    }

                    console.log(event.currentTarget.scrollTop);
                    console.log("滚动完成");
                }
            }
        })

    </script>

 

按键修饰符(键盘事件)

  • Vue 提供常用的按键码的别名:
    1. .enter (回车)
    2. .tab (换行 tab特殊,必须配合keydown去使用)
    3. .delete (捕获“删除”和“退格”键)
    4. .esc (退出)
    5. .space (空格)
    6. .up ()
    7. .down ()
    8. .left ()
    9. .right ()
  • Vue未提供别名的按键,可以使用按键原始的key值去绑定,但注意要转为kebab-case(多单词小写短横线写法)
  • 系统修饰键(用法特殊)ctrl alt shift meta(meta就是win键)
    1. 配合keyup使用:按下修饰键的同时,再按下其他键,随后释放其他键,事件才被触发指定 ctr+y 使用 @keyup.ctr.y
    2. 配合keydown使用:正常触发事件
  • 也可以使用keyCode去指定具体的按键(不推荐)键码不推荐了
    //参考地址--已经被弃用了
    https://developer.mozilla.org/zh-CN/docs/Web/API/KeyboardEvent/keyCode
  • Vue.config.keyCodes.自定义键名 = 键码,可以去定制按键别名
    <div id="app">

        <input type="text" placeholder="keyup" @keyup="showMsg"><br />

        <input type="text" placeholder="caps-lock" @keyup.caps-lock="showMsg"><br />
        <input type="text" placeholder="回车" @keyup.enter="showMsg"><br />
        <input type="text" placeholder="自定义回车" @keydown.huiche="showMsg"><br />


        <input type="text" placeholder="tab" @keydown.tab="showMsg"><br />


        <input @keyup.alt.67="showMsg" placeholder="Alt + C"><br />

        <input @click.ctrl="showMsg" placeholder="Ctrl + Click"><br />

        <input @click.ctrl="showMsg" placeholder="即使 Alt 或 Shift 被一同按下时也会触发"><br />
        <input @click.ctrl.exact="showMsg" placeholder="有且只有 Ctrl 被按下的时候才触发"><br />
        <input @click.exact="showMsg" placeholder="没有任何系统修饰符被按下的时候才触发"><br />


    </div>

    <script type="text/javascript">
        //自定义键名 = 键码,可以去定制按键别名
        Vue.config.keyCodes.huiche = 13 // 定义了一个别名按键
        new Vue({
            el: '#app',
            methods: {
                showMsg(e) {
                    console.log(e);
                    console.log("键位=", e.key, "---- 键码=", e.keyCode)
                    console.log("值:", e.target.value);
                },
            }
        })

    </script>

 

 

 

赞(1)