Vue核心知识-Vue的生命周期方法

有哪些生命周期方法

把所有生命周期打印一遍

import Vue from 'vue'

const app = new Vue({
  // el: '#root',
  template: '<div>{{text}}</div>',
  data: {
    text: 0
  },
  beforeCreate () {
    console.log(this, 'breforeCreate')
  },
  created () {
    console.log(this, 'created')
  },
  beforeMount () {
    console.log(this, 'beforeMount')
  },
  mounted () {
    console.log(this, 'mounted')
  },
  beforeUpdate () {
    console.log(this, 'beforeUpdate')
  },
  updated () {
    console.log(this, 'updated')
  },
  activated () {
    console.log(this, 'activated')
  },
  deactivated () {
    console.log(this, 'deactivated')
  },
  beforeDestroy () {
    console.log(this, 'beforeDestroy')
  },
  destroyed () {
    console.log(this, 'destroyed')
  }
})

app.$mount('#root')

显示结果

结果依次显示 “breforeCreate” "created" "beforeMount" "mounted",说明在new Vue()时,这四个方法执行了。

breforeMount 和 mounted

如果把el:'#root'注释掉,就只显示“breforeCreate” "created" ,因为mount的作用就是把vue组件生成的html内容,挂载到html节点上,所以当我们没有指定el:'#root'或通过$mount进行,是不会挂载到html节点上的。

breforeCreate 和 created

而 breforeCreate created 在初始化阶段就执行了。

beforeUpdate 和 updated

数据更新时,才会执行。

例如,每一秒钟更改数据,相应的每秒都会执行这两个生命周期

setInterval(() => {
  app.text = app.text += 1
}, 1000)

beforeDestroy 和 destroyed

vue实例销毁时执行。

例如,设置一秒钟后销毁,控制台就会显示 "beforeDestroy" 和 "destroyed"

setTimeout(() => {
  app.$destroy()
}, 1000)

activated 和 deactivated

和vue中一个原生的组件 keep-alive有关系。

分别打印出不同周期对应的$el

beforeCreate () {
    console.log(this.$el, 'breforeCreate')
  },
  created () {
    console.log(this.$el, 'created')
  },
  beforeMount () {
    console.log(this.$el, 'beforeMount')
  },
  mounted () {
    console.log(this.$el, 'mounted')
  },

显示结果

undefined "beforeCreate"
undefined "created"
<div id="root"></div> "beforeMount"
<div>0</div> "mounted"

可以看到

beforeCreate 和 created 的 $el 是undefined,所以 beforeCreate 和 created 阶段是不能进行dom操作的,因为拿不到 dom 节点。

brforeMount 时,$el变成了我们写在 html 中 div 节点。

mounted 时, $el变成了 template 中的html,说明覆盖了html原来的 div 节点。

mounted之后,我们调用的所有生命周期方法,拿到的节点,都是渲染之后的节点。

所以一般

  • 做 dom 相关操作会在 mounted 阶段
  • 数据相关操作,可以在 created 或 mounted 阶段

生命周期的调用顺序

beforeCreate created beforeMount mounted 都是一次性的,组件只会调用一次。

beforeMount mounted 在服务端渲染,是不会被调用的,服务端渲染过程中,只会调用 beforeCreate created,因为 mount 是和 dom 操作相关的,服务端根本没有 dom 执行的环境, 所以不会有。

当数据发生变化时,beforeUpdate 和 updated 会调用。

当组件销毁时,beforeDestroy 和 destroyed 会调用。

声明周期中 VUE 实例有哪些区别

在不同的生命周期阶段,this.$el是不同的,而在 mounted之后,一般不会改动 this.$el,而是围绕阶段做某些操作,要尽量避免 this.$el的变动,它会导致一些 vue 错误。

理解生命周期就是理解一张图

Vue ������
  1. init,new Vue() 先执行 init 操作,这个操作是默认执行的。
    1. init Events $ Lifecycle,调用 beforeCreate,所以此时,事件OK,但reactive不OK,所以这个阶段不要修改数据 data 中的数据
    2. init injections $ reactivity,调用 createdajax请求获取数据赋值,最早在 created 阶段做
  2. 判断 Has "el" option
    1. 如果有,执行下一步。
    2. 如果没有,等我们调用 vm.$mounted(el)
  3. 判断 Has "template" options
    1. 如果有,把 template 解析生一个 render 函数。render 函数会用 template 中的 html 去覆盖 html 中的 div 标签。在使用 .vue 文件进行开发的过程中,是没有 template 的,我们在 .vue 文件中写的 template 都经过了 vue-loader 处理,直接变成了 render 函数,放在vue-loader 解析过的文件中;这样做的好处,把 template 解析成 render 函数,比较耗时,vue-loader 处理后,我们在页面上执行代码时,效率会变高。
    2. 如果没有,Compile el's outerHTML as template
  4. 有了 render 函数之后
    1. beforeMount 执行
  5. 执行 render 函数
    1. Create vm.$el and replace "el" with it
  6. 执行 render 函数之后
    1. mounted 执行
  7. mounted之后,实例创建完成,后续过程,都是通过外部触发进行的。
  8. 当数据变化时
    1. beforeUpdate 执行
    2. Virtual DOM re-render and patch
    3. updated 执行
  9. 当组件销毁时
    1. beforeDestroy 执行
    2. Teardown watchers,child comonents and event listeners
    3. destroyed 执行

render 函数

直接使用 render 函数和使用 template 一样的。

import Vue from 'vue'

const app = new Vue({
  // template: '<div>{{text}}</div>',
  data: {
    text: 0
  },
  render (h) {
    return h('div', {}, this.text) // 参数1,创建的标签;参数2,对象配置;参数3,标签内容
  },
})

app.$mount('#root')

render 函数执行时机

render (h) {
    console.log('render function invoked')
    return h('div', {}, this.text)
  },

控制台结果

undefined "beforeCreate"
undefined "created"
<div id="root"></div> "beforeMount"
render function invoked
<div>0</div> "mounted"

在beforeMount 和 mounted 之间执行的

renderError 方法

renderError 方法,只有在开发时,才会被调用,正式打包上线时,不会被调用。帮助我们调试 render 中的错误。renderError 方法,只有在本组件 render 出现错误时,才会被调用;如果是子组件报错,是不会被捕获到的。

当 render 函数报错时,renderError 方法会执行。

render (h) {
    throw new TypeError('render error')
    // console.log('render function invoked')
    // return h('div', {}, this.text)
  },
  renderError (h, err) {
    return h('div', {}, err.stack)
  }

errorCaptured 方法

可以用在正式开发环境中,帮助我们搜集线上的错误。如果在根组件使用这个方法,而根组件的子组件报的任何错误都可捕捉到,除非子组件把向上冒泡停止掉。

errorCaptured 方法使用与 renderError 相似,唯一的区别是:errorCaptured 会向上冒泡,并且正式环境可以使用。

总结

生命周期的执行顺序,调用时机,不同时机进行哪些操作,不同生命周期this.$el的区别。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容

  • 涉及到钩子函数有:1)beforeCreate;2)created;3)beforeMount;4)mounted...
    puxiaotaoc阅读 12,732评论 1 10
  • vue生命周期总共分为8个阶段创建前/后,载入前/后,更新前/后,销毁前/后。 创建前/后: 在beforeCre...
    雨蒙_snow阅读 1,256评论 0 1
  • 首先,每个Vue实例在被创建之前都要经过一系列的初始化过程,这个过程就是vue的生命周期。首先看一张图吧~这是官方...
    廊桥梦醉阅读 2,730评论 0 49
  • 儿童食疗止咳化痰,一定要对症下食! 简单辨别咳嗽类型,进而对症制作饮食。 首先我们学习下最简单的辨别风热型咳嗽和风...
    听雨心依阅读 354评论 0 0
  • 金风未浓清凉早,农家禾穗秋浆少。已见黄花催叶老,稀飞鸟。心忧春梦随烟了。 谁为兆民除重恼,伸来玉手招招巧。取道长河...
    宏波_阅读 419评论 0 4