vue 生命周期的理解(created && mouted的区别)

Easter79
• 阅读 636

生命周期先上图(笑skr个人 ~~)

vue 生命周期的理解(created && mouted的区别)

什么是生命周期

Vue实例有一个完整的生命周期,也就是从开始创建、初始化数据、编译模板、挂载Dom、渲染→更新→渲染、卸载等一系列过程,我们称这是Vue的生命周期。通俗说就是Vue实例从创建到销毁的过程,就是生命周期。

在Vue的整个生命周期中,它提供了一系列的事件,可以让我们在事件触发时注册js方法,可以让我们用自己注册的js方法控制整个大局,在这些事件响应方法中的this直接指向的是vue的实例。

再上图,对生命周期图的标注

vue 生命周期的理解(created && mouted的区别)

特别值得注意的是created钩子函数和mounted钩子函数的区别

每个钩子函数都在啥时间触发

beforeCreate

在实例初始化之后,数据观测(data observer) 和 event/watcher 事件配置之前被调用。

created

实例已经创建完成之后被调用。在这一步,实例已完成以下的配置:数据观测(data observer),属性和方法的运算, watch/event 事件回调。然而,挂载阶段还没开始,$el 属性目前不可见。

beforeMount

在挂载开始之前被调用:相关的 render 函数首次被调用。

mounted

el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子。

beforeUpdate

数据更新时调用,发生在虚拟 DOM 重新渲染和打补丁之前。 你可以在这个钩子中进一步地更改状态,这不会触发附加的重渲染过程。

updated

由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。

当这个钩子被调用时,组件 DOM 已经更新,所以你现在可以执行依赖于 DOM 的操作。然而在大多数情况下,你应该避免在此期间更改状态,因为这可能会导致更新无限循环。

该钩子在服务器端渲染期间不被调用。

beforeDestroy

实例销毁之前调用。在这一步,实例仍然完全可用。

destroyed

Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。 该钩子在服务器端渲染期间不被调用。

下面的代码建议复制后自己在控制台看效果。

  1 <!DOCTYPE html>
  2 <html>
  3 
  4     <head>
  5         <meta charset="UTF-8" />
  6         <title></title>
  7         <script type="text/javascript" src="https://cdn.jsdelivr.net/vue/2.1.3/vue.js"></script>
  8     </head>
  9 
 10     <body>
 11 
 12         <div id="app">
 13             
 14             <p>{{ message }}</p>
 15         </div>
 16 
 17         <script type="text/javascript">
 18             (function myFunction() {
 19                 setTimeout(function() {
 20                     alert("Hello");
 21                 }, 3000);
 22             })()
 23             var app = new Vue({
 24                 el: '#app',
 25                 data: {
 26                     message: "vue is frame"
 27                 },
 28                 beforeCreate: function() {
 29                     console.group('beforeCreate 创建前状态===============》');
 30                     console.log("%c%s", "color:red", "el     : " + this.$el); //undefined
 31                     console.log("%c%s", "color:red", "data   : " + this.$data); //undefined 
 32                     console.log("%c%s", "color:red", "message: " + this.message)
 33                 },
 34                 created: function() {
 35                     console.group('created 创建完毕状态===============》');
 36                     console.log("%c%s", "color:red", "el     : " + this.$el); //undefined
 37                     console.log("%c%s", "color:red", "data   : " + this.$data); //已被初始化 
 38                     console.log("%c%s", "color:red", "message: " + this.message); //已被初始化
 39                 },
 40                 beforeMount: function() {
 41                     console.group('beforeMount 挂载前状态===============》');
 42                     console.log("%c%s", "color:red", "el     : " + (this.$el)); //已被初始化
 43                     console.log(this.$el);
 44                     console.log("%c%s", "color:red", "data   : " + this.$data); //已被初始化  
 45                     console.log("%c%s", "color:red", "message: " + this.message); //已被初始化  
 46                 },
 47                 mounted: function() { 
 48                 
 49                     //beforecreated:el 和 data 并未初始化 
 50                     //created:完成了 data 数据的初始化,el没有
 51                     //beforeMount:完成了 el 和 data 初始化 
 52                     //mounted :完成挂载
 53                     //另外在beforeMount,我们能发现el还是 {{message}},这里就是应用的 Virtual DOM(虚拟Dom)技术,先把坑占住了。到后面mounted挂载的时候再把值渲染进去。
 54                     console.group('mounted 挂载结束状态===============》');
 55                     console.log("%c%s", "color:red", "el     : " + this.$el); //已被初始化
 56                     console.log(this.$el);
 57                     console.log("%c%s", "color:red", "data   : " + this.$data); //已被初始化
 58                     console.log("%c%s", "color:red", "message: " + this.message); //已被初始化 
 59                 },
 60                 beforeUpdate: function() {
 61                     console.group('beforeUpdate 更新前状态===============》');
 62                     console.log("%c%s", "color:red", "el     : " + this.$el);
 63                     console.log(this.$el);
 64                     console.log("%c%s", "color:red", "data   : " + this.$data);
 65                     console.log("%c%s", "color:red", "message: " + this.message);
 66                 },
 67                 updated: function() {
 68                     console.group('updated 更新完成状态===============》');
 69                     console.log("%c%s", "color:red", "el     : " + this.$el);
 70                     console.log(this.$el);
 71                     console.log("%c%s", "color:red", "data   : " + this.$data);
 72                     console.log("%c%s", "color:red", "message: " + this.message);
 73                     console.log('updated:', document.getElementsByTagName('p').length)
 74                 },
 75                 beforeDestroy: function() {
 76                     console.group('beforeDestroy 销毁前状态===============》');
 77                     console.log("%c%s", "color:red", "el     : " + this.$el);
 78                     console.log(this.$el);
 79                     console.log("%c%s", "color:red", "data   : " + this.$data);
 80                     console.log("%c%s", "color:red", "message: " + this.message);
 81                 },
 82                 destroyed: function() { //销毁完成后,我们再重新改变message的值,vue不再对此动作进行响应了。但是原先生成的dom元素还存在,可以这么理解,执行了destroy操作,后续就不再受vue控制了。
 83                     console.group('destroyed 销毁完成状态===============》');
 84                     console.log("%c%s", "color:red", "el     : " + this.$el);
 85                     console.log(this.$el);
 86                     console.log("%c%s", "color:red", "data   : " + this.$data);
 87                     console.log("%c%s", "color:red", "message: " + this.message)
 88                 }
 89             })
 90             //
 91 //el:为了将实例化后的vue挂载到指定的dom元素中。
 92 //如果在实例化vue的时候指定el,则该vue将会渲染在此el对应的dom中,反之,若没有指定el,则vue实例会处于一种“未挂载”的状态,此时可以通过$mount来手动执行挂载。
 93 //
 94 //注:如果$mount没有提供参数,模板将被渲染为文档之外的的元素,并且你必须使用原生DOM API把它插入文档中。
 95             //控制台输入更新状态app.message= 'yes !! I do'
 96             //app.$destroy();
 97             //https://segmentfault.com/a/1190000008010666?utm_source=tag-newest   摘自这个网页加上自己的注释
 98             //总结部分            beforecreate : 举个栗子:可以在这加个loading事件 
 99             //created :在这结束loading,还做一些初始化,实现函数自执行 
100             //mounted : 在这发起后端请求,拿回数据,配合路由钩子做一些事情
101             //beforeDestroy: 你确认删除XX吗? destroyed :当前组件已被删除,清空相关内容
102         </script>
103     </body>
104 
105 </html>

补充:created:在模板渲染成html前调用,即通常初始化某些属性值,然后再渲染成视图。
mounted:在模板渲染成html后调用,通常是初始化页面完成后,再对html的dom节点进行一些需要的操作。
其实两者比较好理解,通常created使用的次数多,而mounted通常是在一些插件的使用或者组件的使用中进行操作,比如插件chart.js的使用: var ctx = document.getElementById(ID);通常会有这一步,而如果你写入组件中,你会发现在created中无法对chart进行一些初始化配置,一定要等这个html渲染完后才可以进行,那么mounted就是不二之选

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k