当前位置: 首页 > news >正文

Vue中的方法和事件绑定

在Vue对象中方法写在methods属性中,供事件或者其它方法使用。

在methods中定义方法:

 new Vue({
            el:"#box",
            data:{},
            methods: {
                //定义式
                fn1:function(){},
                //箭头函数的写法
                fn2:()=>{},
                //es6写语法,在对象里写方法
                fn3(){}
            },
        })

定义的方法供事件使用,首先要给标签绑定事件。

事件绑定

事件绑定的方法有两种:

1、v-on:事件类型(前面学习过的鼠标事件、键盘事件等),如v-on:click=""   

2、语法糖,v-on:简写为@,如@click=""

我们用两种方法分别来写一个点击事件

<div id="box">
        <button v-on:click="fn1">标准形式</button>
        <button @click="fn1">语法糖</button>
    </div>
    <script>
        new Vue({
            el:"#box",
            data:{},
            methods: {
                //定义式
                fn1:function(){
                    console.log(666);
                },
            }
        })
    </script>

点击两个按钮都会在控制台打印666

一个标签同时也可以绑定多个事件,如:

  <button @click="fn1" @mouseenter="fn11()">语法糖</button>

这里事件后跟方法名可以加()也可以不加,这也是与我们以前学习DOM操作阶段行内绑定的区别,在之前行内绑定函数名必须加()。

如果想要给一个标签加两个相同的事件类型,在以前我们是通过addEventListener监听器添加,如果用属性绑定会被覆盖。在Vue中,如果我们直接在行内写两个相同的事件类型也是会被覆盖,如:

<div id="box">
        <button @click="fn3" @click="fn4">绑定了两个点击事件</button>
    </div>
    <script>
        document.body.addEventListener
        new Vue({
            el:"#box",
            data:{},
            methods: {
                fn3(){
                    console.log(111);
                },
                fn4(){
                    console.log(222);
                }
            },
        })
    </script>

绑定了两个点击事件,但是控制台打印的时候只会打印111,如果我们想要实现通过打印222,那么我们只需要将fn3,fn4的调用同时装在一个方法fn5内,绑定事件=“fn5”

代码展示:

<div id="box">
         <button @click="fn5">改进绑定了两个点击事件</button>
    </div>
    <script>
        document.body.addEventListener
        new Vue({
            el:"#box",
            data:{},
            methods: {
                fn3(){
                    console.log(111);
                },
                fn4(){
                    console.log(222);
                },
                fn5(){
                    this.fn3()
                    this.fn4()
                }
            },
        })
    </script>

注意:fn5方法内要用this来调用fn3和fn4,因为fn3和fn4生效以后就是Vue对象的方法了,在Vue中this就代表Vue对象。

只要是事件就存在事件链,会涉及捕获和冒泡,目标元素被触发时,其事件链上绑定的事件也会被触发。

写一个例子感受一下:


    <style>
        .box11{
            width: 200px;
            height: 200px;
            background-color: blue;
        }
        .box12{
            width: 150px;
            height: 150px;
            background-color: aqua;
        }
        .box13{
            width: 100px;
            height: 100px;
            background-color: yellow;
        }
    </style>
    <!-- 事件链 -->
    <div id="box1">
        <div class="box11" @click="fn1">1
            <div class="box12" v-on:click="fn2">2
                <div class="box13" @click="fn3">3</div>
            </div>
        </div>
    </div>
    <script>
     new Vue({
            el:"#box1",
            data:{

            },
            methods: {
                fn1(){
                    console.log("box11");
                },
                fn2(){
                    console.log("box12");
                },
                fn3(){
                    console.log("box13");
                }
            },
        })
   </script>

点击box13盒子,目标元素为box13,当事件触发后往上冒泡依次执行box12的事件,box11的事件,事件默认都是在冒泡阶段触发。效果:

 我们也可以打印一下事件对象,看一下它的事件链,在绑定事件的方法传入$event,

如 @click="fn1($event)",在methods方法内fn1方法接收,并打印,点击box13的path路径即为我们向上冒泡的路径,在这条路径上有事件的结点会依次触发。

 

既然有冒泡那就肯定有阻止冒泡,防止一些不必要的操作。

在vue中阻止冒泡,用事件修饰符.stop写在绑定事件后,如: @click.stop="fn1",该元素就不会再向上冒泡。

其它事件修饰符

.prevent 阻止默认事件

.capture 添加事件侦听器时让事件在捕获阶段触发

.self 其他元素的事件触发时 事件链经过它,无论是捕获还是冒泡阶段都不会触发它的事件,只有它自己是精准对象才会触发事件, 虽然它自己不会被别人影响,但是它自己的事件触发的时候还是会生成事件链经过其他元素,并不阻止继续冒泡到其他元素

.once 事件只触发一次,触发完之后,事件就解绑

其中多修饰符一起使用:连点,例如@click.stop.prevent="fn1",表示即阻止事件冒泡也阻止默认事件冒泡(a标签就是默认事件)。

补充知识点

methods方法中的this

1. 方法中的this代表vm对象,即就是new Vue()创建的对象

2、方法和ES5的函数中的this是vm对象

3、ES6的箭头函数中的this就不是vm,因为箭头函数中的this跟谁调用无关,指向上一个不是箭头函数的函数的this==>因此推荐事件的函数采用ES6的对象的方法写方法 这种写法不推荐。

相关文章:

  • 阿里首席架构师谈微服务:入门到实战架构
  • 一幅长文细学算法(一)——C++STL
  • 键盘切换不出中文输入法的解决方法
  • 集合的父亲之collection----(单列集合顶级接口)和遍历方式
  • Harbor安装(待补充)
  • python基础(二、基础语法)
  • YOLO系列之yolov2解读(2)
  • 【一生一芯】Chap.0 IC常用网站论坛门户 如何提出一个技术问题 并尝试解决 | 提问的智慧
  • 攻防世界WEB练习-fileclude
  • Mybatis实战练习四【单个条件(动态SQL)添加数据】
  • 国赛高教杯使用python/matlab必会基础数学建模-数据处理模块(课程4)
  • XGBoost算法原理详解与参数详解
  • MySQL识别不了中文怎么办?(适合新手)
  • 【面试题】集合并发问题
  • 精品基于Uniapp+SSM实现的Android安全网购平台
  • [译]Python中的类属性与实例属性的区别
  • javascript 总结(常用工具类的封装)
  • JavaScript创建对象的四种方式
  • JAVA并发编程--1.基础概念
  • js 实现textarea输入字数提示
  • JSONP原理
  • Python连接Oracle
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 规范化安全开发 KOA 手脚架
  • 如何优雅地使用 Sublime Text
  • 使用SAX解析XML
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 微信小程序实战练习(仿五洲到家微信版)
  • 一道面试题引发的“血案”
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (vue)页面文件上传获取:action地址
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (一)基于IDEA的JAVA基础10
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .NET开发人员必知的八个网站
  • @ComponentScan比较
  • @Data注解的作用
  • @EventListener注解使用说明
  • @Not - Empty-Null-Blank
  • [Android]Tool-Systrace
  • [Angular 基础] - 数据绑定(databinding)
  • [AUTOSAR][诊断管理][ECU][$37] 请求退出传输。终止数据传输的(上传/下载)
  • [AutoSar]工程中的cpuload陷阱(三)测试
  • [BZOJ1053][HAOI2007]反素数ant
  • [BZOJ2850]巧克力王国
  • [c]扫雷
  • [flask] flask的基本介绍、flask快速搭建项目并运行
  • [HeadFrist-HTMLCSS学习笔记][第一章Web语言:开始了解HTML]
  • [HNOI2008]水平可见直线
  • [Java、Android面试]_05_内存泄漏和内存溢出
  • [jQuery]10 Things I Learned from the jQuery Source