vue中事件绑定

事件另一种写法

一般我们事件是这么写

<div id="app">
        <button @click="handleClick">提交</button>
    </div>
    <script>
    var vm=new Vue({
        el:'#app',
        methods:{
            handleClick(){
                alert('a')
            }
        }
    })
    </script>

但其实我们也可以按下面方式写

<div id="app">
        <button @click="handleClick($event,1,2,3)">提交</button>
    </div>
    <script>
    var vm=new Vue({
        el:'#app',
        methods:{
            handleClick(e,one,two,three){
                console.log(e,one,two,three)
            }
        }
    })
    </script>

这么写的好处是可以传参

阻止 prevent修饰符

<div id="app">   
        <form action="/abc">
            <button @click="handleClick">提交</button>
        </form>
    </div>
    <script>
    var vm=new Vue({
        el:"#app",
        methods:{
            handleClick(){
                console.log('a')
            }
        }
    })
    </script>

向上面这种写法,当我们点提交时,页面会跳转会提交到abc,但如果我们不要它跳转,要阻止它怎么办呢?
只需要在form上加上 @click.prevent handleClick中的方法会执行,但是不跳转了

<div id="app">   
        <form action="/abc" @click.prevent>
            <button @click="handleClick">提交</button>
        </form>
    </div>
    <script>
    var vm=new Vue({
        el:"#app",
        methods:{
            handleClick(){
                console.log('a')
            }
        }
    })
    </script>

这是因为vue提供了一种事件修饰的语法,prevent事实上就是事件修饰符,它的意思是,一旦点击的时候,vue会自动帮你取阻止事件的默认行为。
@click.prevent后面也可以加事件的方法,同样的这么写方法会执行但是不跳转

<div id="app">   
        <form action="/abc" @click.prevent="handleClick">
            <button >提交</button>
        </form>
    </div>
    <script>
    var vm=new Vue({
        el:"#app",
        methods:{
            handleClick(){
                console.log('a')
            }
        }
    })
    </script>

vue中除了prevent修饰符,还有stop修饰符(阻止事件向外冒泡) self once

self修饰符

<div id="app">   
        <div @click="handleClick">
            <div>hello world</div>
        </div>
    </div>
    <script>
    var vm=new Vue({
        el:"#app",
        methods:{
            handleClick(){
               alert('hello world')
            }
        }
    })
    </script>

当我们点击hello world时实际上是进行了一次冒泡,它冒泡到上一层div上,触发了handleClick事件。如果有个需求:只有点击了最上面一层div才能执行handleClick事件,冒泡上来的事件不执行,应该怎么处理呢?

<div id="app">   
        <div @click.self="handleClick"> //给最外城div的click事件加上self修饰符即可
            one
            <div>hello world</div>
        </div>
    </div>
    <script>
    var vm=new Vue({
        el:"#app",
        methods:{
            handleClick(){
               alert('one')
            }
        }
    })
    </script>

once修饰符

<div id="app">   
        <div @click.once="handleClick">
            hello world
        </div>
    </div>
    <script>
    var vm=new Vue({
        el:"#app",
        methods:{
            handleClick(){
               alert('hello world')
            }
        }
    })
    </script>

当点击第一次的时候会弹出hello world ,再次点击就不弹了

capture

<div id="app">   
        <div @click="handleClick">
            <div @click="handleClickInner">hello world</div>
        </div>
    </div>
    <script>
    var vm=new Vue({
        el:"#app",
        methods:{
            handleClick(){
               alert('outer')
            },
            handleClickInner(){
                alert('inner')
            }
        }
    })
    </script>

这段代码,先弹出inner再弹出outer 因为是遵循冒泡事件绑定机制(由内而外) ,但有时候我们希望把冒泡机制改成捕获,那就在每个事件绑定的后面加上.capture

<div id="app">   
        <div @click.capture="handleClick">
            <div @click.capture="handleClickInner">hello world</div>
        </div>
    </div>
    <script>
    var vm=new Vue({
        el:"#app",
        methods:{
            handleClick(){
               alert('outer')
            },
            handleClickInner(){
                alert('inner')
            }
        }
    })
    </script>

这样就首先是outer再是inner 它遵循的是事件捕获机制(由外到内)

vue的按键修饰符

<div id="app">   
        <input type="text" @keydown="handleKeydown">
    </div>
    <script>
    var vm=new Vue({
        el:"#app",
        methods:{
            handleKeydown(e){//e是事件对象
               console.log(e.target.value) //e.target指的是input框dom元素节点,原生里面调用value属性可以把节点的值输出来
            }
        }
    })
    </script>

在这里插入图片描述
只要一按下就会在控制台打印,但是这不是我们要的,我们要的是整个输入完毕后回车再打印到控制台,怎么做呢?

<div id="app">   
        <input type="text" @keydown.enter="handleKeydown">
    </div>
    <script>
    var vm=new Vue({
        el:"#app",
        methods:{
            handleKeydown(e){
               console.log(e.target.value)
            }
        }
    })
    </script>

除了enter修饰符之外,还有tab(它指的是只有按tab这个事件才会触发),delete,esc等等。

系统修饰符(ctrl,alt,shift,meta)
鼠标修饰符(right,left,middle)

<div id="app">   
        <input type="text" @click.right="handleKeydown">
    </div>
    <script>
    var vm=new Vue({
        el:"#app",
        methods:{
            handleKeydown(e){
               console.log(e.target.value)
            }
        }
    })
    </script>

当按下鼠标右键才会执行方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值