5. 事件处理

事件的基本使用

  1. 使用v-on:xxx或者@xxx绑定事件,其中xxx是事件名
  2. 事件的回调需要配置在methods对象中,最终会在vm里面
  3. methods中配置的函数,不要用箭头函数 ,否则使用this指的不是vm
  4. methods中配置的函数,都是被Vue所管理的函数,this指向的是vm组件实例对象
  5. @click="demo"@click="demo($event)" 效果一样,但后者可以传参,例如@click="demo($event, 66)", 这里指传入数字66

事件修饰符

Vue中的事件修饰符

  1. prevent:阻止默认事件(常用)
<a href="https://www.baidu.com" @click.prevent="showInfo">点我</a>
//默认事件为跳转页面,这里阻止了页面跳转
  1. stop:阻止事件冒泡(常用)

  2. once:事件只触发一次(常用)

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

  4. self:只有event.target是当前操作的元素时,才触发事件

  5. passive:事件的默认行为立即执行,无需等待事件回调执行完毕

    <div id="room">
        <h3>修饰符可以链式调用。 例如: @click.prevent.stop </h3>
		
		<!-- 这里阻止了a标签的默认跳转网页事件 -->
        <a href="https://www.baidu.com" @click.prevent="showInfo">点我</a>

        <div class="demo" @click="showInfo">
            <button @click.stop="showInfo">阻止事件冒泡</button>
        </div>

        <button @click.once="showInfo">只触发一次</button>

        <!-- 使用事件捕获模式 -->
        <!-- 事件有捕获阶段(从外往内)和冒泡阶段(从内往外) ,一般事件处理是在冒泡阶段,所以点击div2时,先打印2再打印1。可以用capture使事件处理在捕获阶段,这样就是先打印1再打印2-->
        <div class="box1" @click.capture="showMsg(1)">
            div1
            <div class="box2" @click="showMsg(2)">
                div2
            </div>
        </div>

        <!-- 只有event.target是当前操作的元素时才触发事件 -->
        <!-- 本来点击按钮会冒泡到div,从而触发两次点击事件,但是div加了self后,由于点击的是btn,所以event.target是btn而不是div,所以不会触发div的点击事件(阻止冒泡的另一种方式)-->
        <div class="demo" @click.self="showInfo">
            <button @click="showInfo">点我</button>
        </div>

        <!-- 事件的默认行为立即执行,无需等待时间回调执行完毕 -->

        <!-- 滚动事件分为:滚动条滚动scroll && 鼠标滚轮滚动wheel -->
        <!-- 滚动条滚动,一旦滚动到底,就不再触发滚动事件里的代码;先滚动条滚动再触发事件里的代码 -->
        <!-- 鼠标滚轮只要一直滚,滚动条到底了也可以继续执行滚动事件里的代码;先触发事件里的代码再滚动 -->
        <!-- 所以这里如果使用wheel就需要优化,使用passive,让代码立即执行,无需等待滚动条滚动 -->
        <div class="list" @wheel.passive="demo">
            <li></li>
            <li></li>
            <li></li>
            <li></li>
        </div>
    </div>
    <script>
        // 创建Vue实例
        const vm = new Vue({
            el: '#room',
            data: {
                name: 'cloud'
            },
            methods: {
                showInfo(e) {
                    // e.preventDefault();// a的默认事件是跳转页面,这个方法可以阻止默认事件
                    //e.stopPropagation();//阻止事件冒泡
                    alert('你好')
                },
                showMsg(msg) {
                    console.log(msg)
                },
                demo() {
                    for(let i = 0; i < 10000; i++) {
                        console.log('$')
                    }
                    console.log('finish')
                }
            },
        })
    </script>

键盘事件

键盘上的每个按键都有自己的名称和编码,例如:Enter(13).Vue还对一些常用的按键起了别名便于使用

Vue中常用的按键别名

  1. enter:回车
  2. delete:删除(捕获delete键和<———键)
  3. esc:退出
  4. space:空格
  5. tab:换行,必须配合keydown使用
  6. up:上
  7. down:下
  8. left:左
  9. right:右

Vue未提供别名的按键

可以使用按键原始的key值去绑定,但注意要转为kebab-case(短横线命名)

<!-- 使用自定义键名 -->
 <input type="text" name="" id="" @keydown.huiche="showInfo">
 ...
 //声明自定义键名
 //Vue.config.keyCodes.自定义键名 = 键码
 Vue.config.keyCodes.huiche = 13

系统修饰符(特殊)

例如ctrl、alt、shift、meta(win键)等都是系统修饰符

  1. 配合keyup使用:按下修饰键的特殊,再按下其他键,随后释放其他键,事件才被触发
  2. 配合keydown使用:正常触发事件
<div id="room">
        <h1>
            Hello, {{name}}
        </h1>
        <h3>keyup:按下后松手才触发</h3>
        <h3>keydown:按下后就触发</h3>
        <input type="text" placeholder="按下回车提示输入" @keyup="showInfo">


        <h3>自定义键名</h3>
        <input type="text" name="" id="" @keydown.huiche="showInfo">


        <h3>按下tab</h3>
        <!-- tab只适合跟keydown配合使用,因为tab一按下,焦点就会离开输入框,而事件的对象又是这个输入框,所以如果用up则无法触发事件</br> -->
        <input type="text" @keyup.tab="showInfo">


        <!-- 系统修饰键指定某个按键配合使用,例如ctrl+y才触发事件 -->
        <input type="text" name="" id="" @keyup.ctrl.y="showInfo">
    
</div>

 <script>
       //自定义键名
        Vue.config.keyCodes.huiche = 13
        
		const vm = new Vue({
            el: '#room',
            data: {
                name: 'cloud'
            },
            methods: {
                showInfo(e) {
                    // if (e.keyCode !== 97) return
                    console.log(e.keyCode)
                }
            }
        })
</script>
posted @ 2023-03-15 23:01  月豕  阅读(50)  评论(0编辑  收藏  举报