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

Vue2.x学习三:事件处理生命周期钩子

这里,我们要补充一下
在之前的学习中,我们说到了在构建new Vue()实例对象中,我们往里面写了el和data属性,其实还有其他属性,如:methods,watch,computed,props,以及生命周期钩子函数等。
我们知道,el是Vue实例的作用对象,data定义所有页面中的数据。
而methods则存放我们定义的所有的事件处理函数,watch中存放我们要侦听的函数;
生命周期钩子下面的内容会介绍,computed,props在之后的学习中会有详细说明。

它的大概的完整形式就是这样的:

new Vue{
    el:'',       //执行vue实例服务的视图
    data:{},     //定义数据模型
    methods:{},  //定义函数,主要用于事件的绑定
    watch:{},    //监听某一个数据的变化
    conmputed:{},//计算机属性
    事件钩子函数...
  }

大概了解了以上补充内容之后,我们接着来学习事件处理。

事件处理

在事件处理中,我们用v-on 指令来用于监听DOM事件。它的参数为事件指令名称,引号内为绑定的(methods中的)事件处理函数(需要调用的方法名称)。
它的语法形式是: v-on:event="事件处理函数"。
例如:v-on:click="handler"
当然,v-on:可以简写为@。
例如:@click="handler"。

v-on后面可以绑定的事件指令还有很多,如:submit,keyUp,scroll,mouseout,mousever...
v-on:click是我们比较常用的指令。

下面我们写一个简单应用来测试一下:

<body>
    <div class="container">
        <!-- 我们在此处定义当我们点击时触发handler方法,
        相应的,在methods中存放handler的方法即可
        如果handler事件中需要传递参数,那么要加括号,如handler(data)
        参数可以为常规值或事件对象$event
         -->
        <button @click="handler">点击按钮</button>
        <!-- 
        也可以写成 
        <button v-on:click="handler">点击按钮</button>
         -->
    </div>

    <script type="text/javascript">
        new Vue({
            el:'.container',
            data:{
                
            },
            //存放所有定义的方法或事件处理机制
            methods:{
                handler(){
                    alert("你点击了按钮~~");
                }
                /*
                handler(){},是es6的写法
                es5的写法是这样的:
                handler:function(){
                    alert("你点击了按钮~~");
                }
                箭头函数的写法是这样的:
                handler:()=>{
                    alert("你点击了按钮~~");
                }
                */
            }
        });
    </script>
</body>

v-on除了直接绑定一个方法,也可以内联javascript语句,可以用特殊变量$event把原生dom事件传入方法。
当然,这种情况比较少见,一般来说,数据驱动框架对模型的操作比较少(主要用数据改变模型,而非dom事件)。

我们不推荐用特殊变量$event把原生dom事件传入方法,是因为我们之所以传event对象,主要是因为event中,我们要用到preventDefault,stopPropagation(以及获取target和this),我们主要是要通过事件对象来获取这样的信息。
但是在vue中,我们可以通过事件修饰符来解决这样的问题。

事件修饰符

它的语法形式是:在v-on:指令名称后面用点操作符"."加上一个事件修饰符。
有以下几种修饰符:
1).stop
stop:停止事件冒泡

<!-- 阻止单击事件继续传播 -->
<a v-on:click.stop="doThis"></a>

2).prevent
prevent:阻止事件的默认行为

<!-- 提交事件不再重载页面 -->
<form v-on:submit.prevent="onSubmit"></form>

3).capture
capture:事件捕获

<!-- 添加事件监听器时使用事件捕获模式 -->
<!-- 即元素自身触发的事件先在此处处理,然后才交由内部元素进行处理 -->
<div v-on:click.capture="doThis">...</div>

4).self
self:事件在当前元素本身上时触发

<!-- 只当在 event.target 是当前元素自身时触发处理函数 -->
<!-- 即事件不是从内部元素触发的 -->
<div v-on:click.self="doThat">...</

5).once
once:只触发一次事件

<!-- 点击事件将只会触发一次 -->
<a v-on:click.once="doThis"></a>

6).passive
passive:能够提升移动端的性能

<!-- 滚动事件的默认行为 (即滚动行为) 将会立即触发 -->
<!-- 而不会等待 `onScroll` 完成  -->
<!-- 这其中包含 `event.preventDefault()` 的情况 -->
<div v-on:scroll.passive="onScroll">...</div>

修饰符还可以串联

<a v-on:click.stop.prevent="doThat"></a>

或者只有修饰符,不加事件

<form v-on:submit.prevent></form>

按键修饰符

在监听键盘事件时,我们经常需要检查常见的键值。Vue允许为 v-on 在监听键盘事件时添加按键修饰符keyUp。

举例

<!-- 只有在 `keyCode` 是 13 时调用 `vm.submit()` -->
<input v-on:keyup.13="submit">

全部的按键别名:
.enter
.tab
.delete
.esc
.space
.up
.down
.left
.right

生命周期钩子

每个 Vue 实例在被创建时都要经过一系列的初始化过程。例如,需要设置数据监听、编译模板、将实例挂载到 DOM 并在数据变化时更新 DOM 等。同时在这个过程中也会运行一些叫做生命周期钩子的函数,这给了用户在不同阶段添加自己的代码的机会。
也就是说,从vue开始工作到vue完毕之后,这整个过程,我们是可以插入一些代码进去的,使得它能够在每一阶段做相应的事情。

生命周期按顺序分为以下八个部分,分别为:
beforeCreat:在实例初始化之后,数据观测 (data observer) 和 event/watcher 事件配置之前被调用。
created:在实例创建完成后被立即调用。在这一步,实例已完成以下的配置:数据观测 (data observer),属性和方法的运算,watch/event 事件回调。然而,挂载阶段还没开始,
beforeMount:在挂载开始之前被调用。
mounted:el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子。
beforeUpdate:数据更新时调用,发生在虚拟 DOM 打补丁之前。
updated:由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。
beforeDestroy:实例销毁之前调用。
destroyed:Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。

下面我们来简单的尝试一下:
(请按顺序阅读以下代码)

<body>
    <div class="container">
        <p>{{msg}}</p>
        <!-- <input type="text" v-model="msg"> -->
    </div>

    <script type="text/javascript">
        new Vue({
            el:'.container',
            data:{
                msg:'hello lifecycle'
            },
            //实例初始化之后(刚刚创建了实例,还没初始化data,methods,computed...)
            beforeCreate(){
                 //console.log(this);//在事件钩子中,this代表当前对象实例
                 console.log(this.$data);//undefined
                 //此时有vue中的值但未被初始化,{{msg}}未被解析          
                 alert('beforeCreate');//alert可以阻塞当前代码的运行      
            },
            //创建了实例,初始化了data,methods,,computed...,并且启动了数据监听
            created(){
                console.log(this.$data);//[object Object]: {msg: "hello lifecycle"}
                //此时{{msg}}还未被解析,我们可以手动添加msg的值
                this.msg = 'hello world';
                console.log(this.$data);//[object Object]: {msg: "hello world"}
                alert('created');                
            },
            //在数据挂载之前,可以对数据做最后一次修改
            beforeMount(){
                this.msg = 'last change';
                console.log(this.$data);//[object Object]: {msg: "last change"}
                alert('beforeMount');
            },    
            //数据挂载(渲染)之后,即model中的数据显示到了view中        
            mounted(){
                //此时在页面中打印出hello world
                alert('mounted');
            },
            //以上四个阶段在一次渲染之后就不会再执行了

            //模型发生改变,数据渲染之前执行
            beforeUpdate(){
                alert('update');//未执行,因为值没改变
                //想要改变的话可以在上面代码中加入    <input type="text" v-model="msg">
                //一旦发生改变,beforeUpate就会被反复执行
            },
            //模型发生改变,并且数据渲染之后执行
            updated(){
                alert('updated');//每次改变都会被激发
            },
            //vue实例销毁之后(一般我们等不到它销毁)
            beforeDestroy(){
                alert('beforeDestroy');
            },
            //vue实例销毁之后
            destroyed(){
                alert('destroyed');
            },
            //监听数据的变化
            watch:{
                //这里我们监听msg的变化
                msg:{
                    handler(now,old){
                        console.log(now,old);//打印当前值和之前的值 last change hello lifecycle
                    }
                }
            },
        });
    </script>
</body>

相关文章:

  • MySQL的prompt不生效的问题
  • Django之ModelForm(二)-----ModelForm组件
  • Lua使用总结
  • Python模块-threading模块
  • xtrabackup 备份原理
  • tkinter简单打开网址 + 执行系统命令
  • flask学习笔记之flask-migrate
  • 项目实战 (规范、轮子、学习案例) - iOS
  • iOS中类、元类、isa详解
  • 生鲜 B2B 平台的产品体系如何迭代(B2B 技术共享第三篇)
  • CentOS7.X安装php-7.x.x
  • 2018年UI设计师的前景如何?长沙牵引力用数据告诉你
  • JS深拷贝总结
  • centos7安装
  • 万万没想到,枯燥的“机器学习”还可以这样学!
  • [译] React v16.8: 含有Hooks的版本
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 2018一半小结一波
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Consul Config 使用Git做版本控制的实现
  • Electron入门介绍
  • Java面向对象及其三大特征
  • js 实现textarea输入字数提示
  • js如何打印object对象
  • mysql常用命令汇总
  • orm2 中文文档 3.1 模型属性
  • PHP那些事儿
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • Theano - 导数
  • 搭建gitbook 和 访问权限认证
  • 动态魔术使用DBMS_SQL
  • 好的网址,关于.net 4.0 ,vs 2010
  • 普通函数和构造函数的区别
  • 前端存储 - localStorage
  • 驱动程序原理
  • ​io --- 处理流的核心工具​
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #100天计划# 2013年9月29日
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (day6) 319. 灯泡开关
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (剑指Offer)面试题34:丑数
  • (六)vue-router+UI组件库
  • (三)终结任务
  • (算法)Travel Information Center
  • (转)Sublime Text3配置Lua运行环境
  • (转)winform之ListView
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .net framework4与其client profile版本的区别
  • .NET Project Open Day(2011.11.13)
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • @GetMapping和@RequestMapping的区别
  • [ vulhub漏洞复现篇 ] AppWeb认证绕过漏洞(CVE-2018-8715)