vuejs 指令之 v-on

本文深入探讨Vue.js中的事件绑定v-on及其简化语法,讲解如何在Vue组件中正确使用事件监听器,包括事件回调函数的使用、事件修饰符如.prevent和键盘事件修饰符的实践应用。

v-on

绑定事件监听器。事件类型由参数指定
形式:v-on:事件类型(不要加前缀)=“ 方法名称 ”
方法名称的命名:事件类型 + Handler
也就是设置一个事件(比如点击事件,提交事件等)

我们在视图上不做逻辑业务的操作,和 mvc 一样,逻辑业务的操作放在控制器里,在里面有一个属性 methods ,专门用来放方法的,所以如果视图上有复杂逻辑操作的话,我们一般是设置一个对象函数,使用的时候直接用它的属性,而不是直接在视图上操作

<div id="box">
//绑定一个点击事件,然后调用函数
    <button v-on:click="clickHandler">点击事件 v-on</button>
    <!--简写-->
    <button @click="clickHandler">点击事件二</button>
</div>
<script>
    var vm = new Vue({
        el: "#box",
        data: {
            name: "lili"
        },
        //方法统一写在methods里面
        methods: {
            clickHandler: function(){
                console.log(this.name);

            }
        }
    })
</script>

上面我们简单知道了如何去用 v-on ,下面我们用 click 事件来看一下这个指令的特性
1:回调函数(写在 methods 里的)
1): 不能使用箭头函数,如果使用 this 代表Window全局
2):建议使用 es6 的简化写法
2:vuejs 里面的事件的回调函数可以增加括号,也可以不增加,增加和不增加有什么区别
不加括号的时候, vuejs 会自动给回调函数传递 event 事件源,不能传参
如果加上括号,需要传递 $event,是vuejs帮我们封装的事件源,还可以传参,这里传参我们可以用剩余运算符(…rest:在参数列表里我们这么叫,其他时候是扩展运算符),我们就可以传入多个参数了

<div id="box">
<!--1. vuejs 里面的事件的回调函数可以增加括号,也可以不增加,增加和不增加有什么区别?-->
    <!--如果不增加 括号的时候, vuejs 会自动给回调函数传递 event 事件源;如果加上括号,需要传递 $event,是vuejs帮我们封装的事件源-->
    <!--加上括号,除了可以传递 $event 还可以传递用户自定义的参数-->
    <button v-on:click="clickHandler">vuejs 点击事件</button>
    <!--简写-->
    <button @click="clickHandler">vuejs 点击事件</button>
    <button @click="clickDataHandler($event, 1, 'abc')">有event的点击事件</button>
</div>
<script>
    var vm = new Vue({
        el: "#box",
        data: {
            name: "lili",
        },
        methods: {
            // 回调函数,1. 不能使用箭头函数,如果使用 this 代表Window全局
            // 2. 建议使用 es6 的简化写法
            //...rest  如果是函数的参数列表,则被称为 剩余运算符,只能放置在最后的一个参数
            // es6 尽可能写代码的速度,方便程序员
            clickHandler: function(){
                alert("我被点击了");
            },
            clickDataHandler (event, ...rest) {
                console.log(event.target);
            }
        }
    })
</script>

除了 click 事件比较常见外,submit 事件我们也会常常用到
在提交事件中,我们如果不想跳转页面,就要进行阻止默认行为的操作,除了 event.preventDefault();这个方法外,vuejs 框架里也有他的方法,那就是修饰符

	v-on:click.prevent 事件的修饰符一种,代表阻止表单的默认的行为
	用法:在事件类型后面加上即可,如@submit.prevent="submitHandler",
	这样阻止了表单默认提交的行为,注意,一定要加载 form 标签上
	
	除了事件修饰符,还有其他的类型修饰符,例如 v-model 修饰符
	v-on:"v-model".trim:出去空白字符
	.number:只保留数字
	
	事件修饰符 按键 代表只有用户按下 回车的时候,触发事件
	v-on:keyup.enter="keyupHandler"
	v-on:keyup.13="keyupHandler"
<div id="box">
    <!--@submit.prev  .prevent 称为事件的修饰符,代表阻止表单的默认的行为-->
    <!--prevent 阻止的意思-->
    <!--除了 prevent 事件修饰符,还有其他的修饰符-->
    <!--除了事件修饰符,还有其他的类型修饰符,例如 v-model 修饰符-->
    <form action="#" @submit.prevent="submitHandler">
        <!--去掉空字符串-->
        username:<input type="text" v-model.trim="username" />
        <!--设置里面的内容为数字-->
        password:<input type="text" v-model.number="password" />
        <input type="submit" value="提交">

        <!--事件修饰符 按键 代表只有用户按下 回车的时候,触发事件-->
        <input type="text" v-on:keyup.enter="keyupHandler" />
        <input type="text" v-on:keyup.13="keyupHandler" />
        <input type="text" v-on:keyup.up="keyupHandler" />
        <input type="text" v-on:keyup.down="keyupHandler" />
    </form>
</div>
<script>
    var vm = new Vue({
        el: "#box",
        data: {
           username: '',
            password: '',
        },
        methods: {
            submitHandler ( event ){
                //阻止默认行为
                //vuejs 作者也考虑到阻止表单的默认行为是很常见的需求,封装一个事件修饰符,我们只要用这个修饰符就可以阻止默认的行为,在form标签上加
                // event.preventDefault();
                //收集信息
                var _username = this.username;
                var _password = this.password;
                //进行验证
                if(_username.length <= 0 || _username.length >= 10){
                    alert(" 信息错误 ");
                    return;
                }
                console.log("合法");

            },
            keyupHandler ( event ) {
                if(event.keyCode === 13){
                    console.log("回车键");
                    return;
                }

            }

        }
    })
</script>
### Vue.js 中 `v-on` 指令的修饰符使用说明 #### `.stop` `.stop` 修饰符会调用 `event.stopPropagation()` 方法,阻止事件冒泡。这意味着当某个事件被触发时,它不会继续向其祖先元素传播。 ```html <div id="app"> <div @click="handleOuter">Outer Div <div @click.stop="handleInner">Inner Div</div> </div> </div> <script> new Vue({ el: '#app', methods: { handleOuter() { console.log('Outer clicked'); }, handleInner() { console.log('Inner clicked'); } } }); </script> ``` 在这个例子中,点击 Inner Div 只会在控制台打印 "Inner clicked",而不会触发 Outer Div 的点击事件[^5]。 --- #### `.prevent` `.prevent` 修饰符会调用 `event.preventDefault()` 方法,防止默认行为的发生。这常用于表单提交场景。 ```html <form @submit.prevent="onSubmit"> <button type="submit">Submit</button> </form> <script> new Vue({ el: 'form', methods: { onSubmit() { console.log('Form submitted, but default action is prevented.'); } } }); </script> ``` 在此示例中,表单提交时不会刷新页面,而是仅执行 `onSubmit` 方法中的逻辑[^2]。 --- #### `.capture` `.capture` 修饰符会使事件监听器采用捕获阶段而非冒泡阶段来处理事件。这对于复杂的 DOM 结构特别有用。 ```html <div id="app"> <div @click.capture="handleCapture">Parent <div @click="handleChild">Child</div> </div> </div> <script> new Vue({ el: '#app', methods: { handleCapture() { console.log('Captured at parent level'); }, handleChild() { console.log('Clicked on child'); } } }); </script> ``` 在这种情况下,即使 Child 被点击,也会先触发 Parent 的 `handleCapture` 方法。 --- #### `.self` `.self` 修饰符确保只当事件是由该元素本身触发时才执行回调函数。如果事件是从子元素冒泡而来,则不触发。 ```html <div class="parent" @click.self="onClickParent"> Click me directly. <button>Clicking this won't trigger the parent event.</button> </div> <script> new Vue({ el: '.parent', methods: { onClickParent() { console.log('Only triggered when clicking the parent element itself.'); } } }); </script> ``` 此功能对于构建复杂交互界面非常实用,比如导航栏组件。 --- #### `.once` `.once` 修饰符表示事件只会被触发一次。之后再触发相同的事件将不再生效。 ```html <button v-on:click.once="incrementCounter">Increment Counter Once</button> <script> new Vue({ data: { counter: 0 }, methods: { incrementCounter() { this.counter += 1; console.log(`Counter value: ${this.counter}`); } } }); </script> ``` 无论按钮被点击多少次,计数器只会增加一次。 --- #### `.passive` `.passive` 修饰符优化滚动性能问题,尤其适用于触摸设备上的滚动事件。它可以提高浏览器响应速度并减少延迟。 ```html <div @touchstart.passive="handleTouchStart"></div> <script> new Vue({ methods: { handleTouchStart(event) { console.log('Passively handled touch start event.'); } } }); </script> ``` 这种修饰符主要用于提升移动端体验,尤其是在滑动或拖拽操作中[^1]。 --- ### 组合多个修饰符 还可以组合多个修饰符以实现更精细的行为: ```html <a href="https://vuejs.org/" @click.stop.prevent="openLink">Visit Vue.js Official Site</a> <script> new Vue({ methods: { openLink() { alert('Opening link...'); } } }); </script> ``` 这里同时使用了 `.stop` 和 `.prevent`,既阻止了链接跳转又停止了事件冒泡[^3]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值