百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

第三章 Vue生命周期以及数据交互

csdh11 2025-02-26 11:41 14 浏览

生命是有周期的,比如一个人的生老病死便是他的生命周期;一个公司和企业也是拥有周期的,从创立,稳定,发展,到上市;本章节我们主要学习vue的生命周期以及vue中的数据交互。对于vue来说它只是一段执行的代码,为什么拥有周期呢?通过本章节的学习你会拥有答案。并且本章节中的第二部分内容也是很重要的,叫做数据交互,也就是如何使前端和后端进行数据的传递,这里读者应该想起ajax技术,vue中提供了Axios技术来替换ajax完成数据交互。

3.1 Vue生命周期

在vue官网中针对生命周期提供了一张图片来展示周期内的不同阶段,并且配文:“你不需要立马弄明白所有的东西,不过随着你的不断学习和使用,它的参考价值会越来越高。”但是仍然建议你对生命周期充分理解,避免将来在学习和编程过程中踩坑。

3.1.1 Vue生命周期概述

学习Vue的生命周期之前,我们先做一个小的思考,人的一生有不同的阶段,大概分为出生,婴儿,儿童,少年,青年,老年,到最终生命的消亡。每个人都会按照固定的顺序经历不同的阶段,并且会在不同的阶段做不同的事情。这些固定顺序的阶段就组成了一个人的生命周期,那生命周期有什么用呢?比如一个人要结婚,这个事情正常来说肯定是要发生在一个人的青年或者中年阶段,那如果发生在儿童阶段,那就乱套了。总结来说一个人的生命周期可以保证这个人在正确的阶段做正确的事情。

每个Vue应用都是从Vue实例的初始化开始的。Vue 实例在被创建时都要经过一系列的过程,比如创建、数据初始化、挂载、更新、销毁等,这就是一个Vue所谓的生命周期。Vue在经历不同的过程时会调用不同的函数,我们将这些函数叫做生命周期钩子函数,或者生命周期函数。

总结来说,一个Vue实例拥有生命周期,这些生命周期会顺序执行,在经历不同的过程时会自动调用生命周期函数。开发者可以将自己的业务逻辑代码编写在不同的生命周期函数内,这样就是可以实现在Vue实例不同的过程中执行不同的代码。

这里先列出所有的钩子函数,然后我们再一一详解:

  • beforeCreate 创建前状态
  • created 创建完毕状态
  • beforeMount 挂载前状态
  • mounted 挂载结束状态
  • beforeUpdate 更新前状态
  • updated 更新完成状态
  • beforeDestroy 销毁前状态
  • destroyed 销毁完成状态

我们先创建本章节的第一个案例,此案例中包含钩子函数的代码编写方式,注意运行时打开控制台查看日志,console中输出的结果可以帮助我们了解生命周期钩子函数。创建index.html,代码内容如3-1所示。

例3-1 index.html

  1. vue生命周期
  2. {{message}}

  • 运行index.html,有些读者对vscode的使用可能不是特别熟悉,这里说一下简要的步骤:1点击菜单栏中的运行;2点击启动调试;3选择运行环境,比如谷歌浏览器,如果没有谷歌浏览器可以配置自己本机的浏览器环境。

    运行结果如图3.1所示。

    图3.1 运行结果

    代码解释:

    我们拿其中的beforeCreate的钩子函数进行讲解,钩子函数书写在vue实例的初始化选项中,属性名为钩子函数名称,属性值为函数,函数会在钩子函数的对应生命周期被自动调用执行。

    beforeCreate: function() {

    console.group('------beforeCreate创建前状态------');

    console.log(this.$el); //undefined

    console.log(this.$data); //undefined

    console.log(this.message)

    }

    其中this.$el,this.$data,this.message分别在不同的生命周期用于获取当前Vue实例的el选项,data选项,message数值,通过控制台我们可以探究他们分别在什么阶段有值,我们会在各个钩子函数详细讲解中进行学习。

    通过运行结果我们可以看到钩子函数执行的顺序为:beforeCreate,created,beforeMount,mounted,也说明了在vue实例创建过程中,按照顺序经历了,实例创建之前,实例创建成功后,挂载之前,挂载完成后。这些函数要求开发者按照案例3.1中的形式书写,执行是由Vue在经历不同的生命周期时自动调用的。

    有同学可能会问,为什么没有执行其他的几个钩子函数,比如beforeDestroy,destroyed等。这个问题其实很好回答,从字面意思分析一下这些钩子函数。拿destroyed来说,destroyed表示销毁,也就是说这个函数只会在实例销毁时才会执行,实例没有经历销毁的过程,所以也不会执行对应的钩子函数。

    Vue完整的生命周期以及钩子函数如图3.2所示。

    图3.2 Vue生命周期

    3.1.2 准备阶段

    准备阶段开始创建Vue实例,我们结合图片分析此阶段发生了什么事情,如图3.3所示。

    图3.3 开始阶段

    • new Vue({}) :开始创建vue实例。
    • Init events&Lifecycle:此时vue实例只有默认的一些生命周期和 默认的事件,此时的data,methods,el等等都不存在,还没有初始 化数据。
    • beforeCreate():beforeCreate钩子函数在此时自动运行。

    beforeCreate: function() {

    console.group('------beforeCreate创建前状态------');

    console.log(this.$el); //undefined

    console.log(this.$data); //undefined

    console.log(this.message)

    }

    create表示创建,beforeCreate也就是创建之前,值得注意的是,这里并不是表示在Vue实例初始化之前,而是在实例开始初始化之后,但是实例未完全创建之前。此时实例的选项对象还未创建,el 和 data 并未初始化,因此无法访问methods, data等选项。对应的运行结果中可以看到此时获取实例对象的el,data,message选项都是undefined:

    ------beforeCreate创建前状态------

    undefined

    undefined

    undefined

    3.1.3 初始化数据阶段

    初始化数据阶段进行了Vue实例的中选项的初始化,比如el,data,methods等但是还未编译模板。如图3.4所示。

    图3.4 初始化阶段

    • init injections&reactivity:这个阶段的vue实例不再是空壳了,在它内部已经初始 化了数据和事件,包括data和methods,但是还没编译模板。
    • created:钩子函数运行,此时你可以使用created钩子函数获取到vue中初始化的数据,在这里是你最早可以获取到数据的地方,更改数据不会触发update和其他钩子函数。一般在这个钩子函数中进行初始化数据的获取。

    created: function() {

    console.group('------created创建完毕状态------');

    console.log(this.$el); //undefined

    console.log(this.$data); //已被初始化

    console.log(this.message); //已被初始化

    },

    通过控制台的打印我们可以看出,此时data和message可以获取其值,但是el还是undefined,el指定的就是我们的模板,也就是说此时还未编译模板。created对应的运行结果如下:

    ------created创建完毕状态------

    undefined

    {message: , __ob__: Observer}

    学习Vue生命周期

    3.1.4 编译模板阶段

    从creatd()钩子函数到beforeMount钩子函数之间称之为编译模板阶段,此时模板编译成功,生成了一个编译好的模板字符串,在内存中将这个模板字符串渲染为内存中的DOM,但是还在内存中,没有挂载到页面中。具体流程如图3.5所示。

    图3.5 编译模板阶段

    • Has “el” option:编译阶段会首先判断Vue实例的选项中是否存在el选项,所以要求我们的初始化代码中一定要执行el选项,此选项是用于执行html中模板的位置。
    • Compile el’s outerHTML as template:将el选项指定的html标签编译成模板,字符串,并且保存在内存中。
    • beforeMount:是位于编译模板阶段的钩子函数,在这里可以进行一般数据的获取和更改,同 created() 函数一样更改数据不会触发update和其他钩子函数,这个阶段是在内存中生成了虚拟DOM还没有挂载到页面中!

    beforeMount: function() {

    console.group('------beforeMount挂载前状态------');

    console.log( (this.$el)); //已被初始化

    console.log(this.$data); //已被初始化

    console.log(this.message); //已被初始化

    },

    beforeMount对应的运行结果我们可以看出,此时vue实现的内部选项已经初始化完毕,可以分别获取el和data的值。但是值得注意的是在beforeMount钩子函数找那个并不是能对页面中的元素进行修改,原因是beforeMount()钩子函数是触发在编译阶段的,此时还没搭载到页面上,就无法对页面上的元素和内容进行修改。

    ------beforeMount挂载前状态------

    div#app

    {message: , __ob__: Observer}

    学习Vue生命周期

    3.1.5 挂载页面阶段

    上一个阶段是编译阶段,在内存中生成的是虚拟的DOM,还没挂载到页面上,编译阶段还不能操作页面上的dom元素。编译模板阶段之后就是挂载阶段,此时在内存中的虚拟DOM挂载到了浏览器的页面上,我们可以操作页面上的DOM元素了!此阶段的流程如图3.6所示。

    图3.6 挂在页面阶段

    • Create vm.$el and repacle “el” with it :渲染真实DOM,说白了就是我们用的模板语法被真实的数据替换了比如html中的{{msg}}被替换了真实的数据。
    • mount:编译、挂载后执行的钩子函数。此时的实例已经被完全创建出来,并且可以操作页面中的dom元素。

    mounted: function() {

    console.group('------mounted 挂载结束状态------');

    console.log(this.$el); //已被初始化


    console.log( this.$data); //已被初始化

    console.log( this.message); //已被初始化

    },

    对应的日志输出:

    -------mounted 挂载结束状态-----

    div#app

    {message: , __ob__: Observer}

    学习Vue生命周期

    3.1.6 运行阶段

    在mounted()钩子函数之后,vue实例已经创建完毕了,这个运行阶段有两个钩子函数,只有当data中的数据发生改变时,才会触发。也就是beforeUpdate和updated。此阶段的流程如图3.7所示。

    图3.7 运行阶段

    • beforeUpdate:组件更新之前执行的钩子函数;当vue发现data中的数据发生了改变,会触发对应组件的重新渲染,先后调用beforeUpdate和updated钩子函数。
    • update:组件重新渲染后调用。

    我们发现例3.1中并没有执行此阶段的两个钩子函数,原因是我们例3.1中并未涉及到数据的改变,那么我们接下来创建index2.html来演示beforeUpdate和update函数的执行。代码如例3-2所示:

    1. vue生命周期
    2. {{ msg }}


  • 运行结果:

    当我们点击按钮之后,会执行methods中的show函数,在show函数中将data中的msg的值进行了变更,此时就会触发beforeUpdate函数,在beforeUpdate中通过dom元素获取的数据还是修改之前msg的值,直接通过msg属性获取的值是修改之后的数据,证明了此时beforeUpdate执行在数据修改之前。

    3.1.7 销毁阶段

    当用户关闭整个页面或者执行了某些$destroy时,就会从运行阶段进入销毁阶段此阶段的流程如图3.8所示。

    图3.8 销毁阶段

    beforeDestroy :销毁前执行的钩子函数,可以继续使用vue实例中的数据,如data, methods,filters,derictives等等。

    destroyed : 已经销毁了,vue实例中的数据不可用了。

    3.2 Axios数据交互

    本小节我们学习Axios数据交互。我们都知道动态网站的数据都是存在于服务器的数据库中,那么对于完整的项目来说一般需要涉及到前端和后端的数据交互才能够实现将后端的数据展示在前端的页面上,没有学习Axios之前我们会采用原生的ajax或者jquery提供的封装来完成数据交互。在Vue中我们更加建议使用Axios来替代原生ajax和jQuery封装来实现数据交互。

    3.2.1 Axios简介

    首先我们来看一下关键的自我介绍:“Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。”我们需要复习一些名词和常识。

    • promise :ECMAscript 6 原生提供了 Promise 对象,用来传递异步操作的消息。也就是说Axios 是es6中的新语法。
    • HTTP 库 :进行http协议的网络请求处理的代码库。
    • node.js :简单的说 Node.js 就是运行在服务端的 JavaScript,不是本书中讨论的重点,作为了解。

    总结来说Axios是es6中提供的语法,通过promise实现对ajax技术的一种封装,就像jQuery实现ajax封装一样。ajax技术也实现了网页的局部数据刷新,axios实现了对ajax的封装。这里我们做一下代码上的对比。

    Axios语法:

    axios({

    url: '/getUsers',

    method: 'get',

    responseType: 'json', // 默认的

    data: {

    “name”: ‘aaa’,

    “id”:1

    }

    }).then(function (response) {

    console.log(response);

    console.log(response.data);

    }).catch(function (error) {

    console.log(error);

    })

    jquery封装ajax语法:

    $.ajax({

    url: '/getUsers',

    type: 'get',

    dataType: 'json',

    data: {

    “name”: ‘aaa’,

    “id”:1

    },

    success: function (response) {

    console.log(response);

    }

    })

    从语法来说axios和jQuery的封装代码结构上的区别并不大,那么我们为什么要使用Axios呢,我们来做一下两种方式特点的对比。

    ajax特点:

    • 本身是针对MVC的编程,不符合现在前端MVVM的浪潮
    • 基于原生的XHR开发,XHR本身的架构不清晰,es6中已经有了fetch的替代方案
    • JQuery整个项目太大,单纯使用ajax却要引入整个JQuery非常的不合理。

    axios特点:

    • 从浏览器中创建 XMLHttpRequests
    • 从 node.js 创建 http 请求
    • 支持 Promise API
    • 拦截请求和响应 (就是有interceptor)
    • 转换请求数据和响应数据
    • 取消请求
    • 自动转换 JSON 数据
    • 客户端支持防御 XSRF

    可能大家对interceptor(拦截器)并不是很熟悉,在这里作下介绍,拦截器可以在请求发送前和发送请求后做一些处理。有一张图可以清晰的了解它在一次HTTP请求中做了什么,如下图3.9所示。

    图3.9 拦截器

    3.2.2 Axios安装

    了解过Axios之后,我们开始学习Axios的使用,第一步就是需要进行安装,也就是在自己的应用中引入Axios环境。这里有三种方式进行安装,读者可以自行选择自己了解的方式,他们的导入分别如下。

    使用 npm执行命令:

    $ npm install axios

    使用 bower工具:

    $ bower install axios

    使用 csdn:

    3.2.3 Axios的使用

    Axios的使用并不复杂,代码中重要部分是指定请求方式,请求路径,请求参数,相应处理等,听到这里是不是觉得axios使用流程上和jQuery封装的ajax操作十分类似,确实是这样,只是使用的对象和方法属性不同而已,接下来我们直接通过代码来学习Axios的基本使用。代码如例3-3所示。

    例3-3 index3.html

    3.3 本章小结

    • Vue (读音 /vju?/,类似于 view) 是一套用于构建用户界面的渐进式框架。
    • Vue则是通过Vue对象将数据和View完全分离开来了。对数据进行操作不再需要引用相应的DOM对象,可以说数据和View是分离的,他们通过Vue对象这个vm实现相互的绑定。
    • MVC表示“模型-视图-控制器”,MVP表示“模型-视图-演示者”,MVVM表示“模型-视图-视图模型”。
    • 使用双大括号来包裹 js 代码构成插值表达式,用于将双大括号中的数据替换成对应属性值进行展示,插值表达式中可以写入JSON数字,字符串,数字,js表达式。
    • 遇到复杂逻辑时建议使用Vue特带的计算属性computed来进行处理,在一个计算属性里可以完成各种复杂的逻辑,包括运算、函数调用等,只要最终返回一个结果。
    • 侦听器用于当数据发生变化时,及时做出响应处理,当需要在数据变化时执行异步或开销较大的操作时

    3.4 理论习题与实践练

    1.思考题

    1.1 请简述什么是vue生命周期。

    1.2 请简述vue生命周期都有哪些阶段。

    1.3 请简述vue不同生命周期阶段都做了什么,会执行哪个钩子函数。

    1.4 请思考网络数据的请求应该执行在哪个钩子函数中?

    1.5 请简述Axios和ajax的区别已经优缺点?

    1.5 请简述Axios的使用步骤?

    2.编程题

    • 2.1 创建vue页面,按照记忆编写各个生命周期钩子函数,并在钩子函数中打印log,运行页面查看打印结果,理解生命周期的执行。
    • 2.2 创建vue页面,使用Axios完成对天气预报接口的访问(自行百度免费接口),获取数据并显示在页面中。

    相关推荐

    全能硬件大师AIDA64 v4.60 最新绿色版下载

    IT之家(www.ithome.com):全能硬件大师AIDA64v4.60最新绿色版下载今天,国外FinalWire公司正式发布全能系统硬件大师AIDA64v4.60最新版。本次新版加入14款...

    2023年4款Mac软件推荐,绝不失望(mac2020i3)

    1.VDown-免费下载视频是最近mac上出现的免费的视频下载软件,支持超过900多个站点,虽然看上去支持的站点略少于Downie,但是熟悉的网站B站,Youku全部都有,国外的站点,只要有办法访问...

    实验设计和数据分析必不可少的Design-expert,谁还不会用呢?

    Design-Expert软件介绍...

    关于视频格式的那些事儿(视频格式作用)

    闲暇之余,相信很多人的选择就是看视频。电视剧、综艺、手机短视频,总有一款适合你。然而播放这些视频时,你是否注意到了文件名后各种各样的后缀名了呢?是否会好奇为什么会存在这么多视频格式?不同的格式是不是影...

    机器人学习也要提速提质!智元机器人发布首个通用具身基座大模型

    去年已实现量产近千台的人形机器人公司智元机器人再度对外宣布重磅消息。3月10日,该公司正式发布首个通用具身基座大模型,即智元启元大模型(GenieOperator-1)。“GO-1大模型借助人类和多...

    软网推荐:硬盘管理用好Macrorit Partition Expert

    平时我们经常需要对硬盘进行管理,比如为了释放空间,需要将隐藏分区删除并重建分区;出于隐私保护,需要彻底删除硬盘分区上的数据;硬盘出现坏道需要将其屏蔽等等。诸如此类的操作,现在借助免费且图形化操作的分区...

    Design-Expert 12.0 安装教程(附安装包下载)

    Design-Expert12.0软件介绍是一款由Stat-EaseInc开发的专用于执行实验设计(DOE)的软件。它提供比较测试、筛选、表征、优化、稳健的参数设计、混合物设计和组合设计等功能,并...

    不用在PLC内编程,实现西门子与罗克韦尔(AB)PLC之间数据通讯

    巨控NET400数据网关支持多种PLC之间、PLC与智能仪表之间多对多通讯,支持以太网,串口设备混合数据交换;无需PLC内编程开发,只需在智能网关的参数管理软件上配置数据的起始地址和数量即可,支持热插...

    S7-1500PLC做OPC UA通信服务器(s7-1200 opc ua)

    OPCUA概述OPCUA是一项开放标准,适用于从机器到机器间(M2M)的水平通信和从机器直到云端的垂直通信。该标准独立于供应商和平台,支持广泛的安全机制,并且可以与PROFINET共享同一工...

    WINCC配置OPC UA服务器的步骤和故障解决

    WINCC配置OPCUA服务器的步骤和故障解决本次配置实例的环境:在同一局域网内的两台计算机,均为windows7SP1系统一台计算机安装wincc7.4,并建立项目,项目在运行状态一台计算机安...

    视频格式在线转换,五种超实用的视频格式转换工具!

    视频内容无处不在,从教育课程到娱乐电影,从社交媒体分享到在线会议,视频已成为我们日常生活中不可或缺的一部分。然而,不同的设备和平台支持的视频格式各异,会导致视频文件在某些设备上无法播放。因此,掌握视频...

    支持裸眼3D:长虹X1手机/全新CHIQ电视发布

    IT之家讯10月16日消息国产传统家电品牌长虹此前也一直有智能手机产品,但关注度并不高。今天下午,长虹举行发布会,发布了两款以裸眼3D技术为卖点的产品,分别为长虹X1手机和全新CHIQ曲面电视。长...

    h265和h264有什么区别(h265和h264有什么区别)

    目前很多摄像机采用了H.265的编码标准,H.264编码的摄像机逐渐减少,为什么H.265会流行?H.264和H.265有何不同?一、什么是H.265...

    中文白皮书:面向视频编解码器和图形引擎的前沿多媒体方案 WP497

    该白皮书探讨了ZynqUltraScale+MPSoC的多媒体功能。MPSoC基于Zynq-7000SoC,包括一个可编程逻辑(PL)的桥接处理系统(PS),但它在ZynqUltr...

    科达NVR家族换新装:推出首款通用型H.265+4K NVR

    近期,科达推出业内首款通用型H.265+4KNVR——NVR1821,吹响NVR家族全面升级的号角。据了解,保持原有通用型产品“高性价比”定位的基础上,全新NVR1821系列增加了4路4K解码+1路...