关于Vue生命周期个人理解

什么是生命周期?

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

对于我来说Vue只是会用用写写页面与前后端交互之类的,并没有深究,这可以来说是没有吃透Vue。举个例子把今天在项目中要更改div中字体的颜色,我就使用的js方法,$('.add').css('color','red')的方法。但是我把这个函数应该放到哪个钩子函数下呢?根据以往的经验,我选择了created(){}的函数之下,详情见下图:

但是当我打开浏览器的时候没有任何变化,仍然显示color为默认颜色。我并没有想到是Vue的原因,而是想到一个初级前端都会犯的错误。就是我的.css语法弄错了,于是百度,但是没有错。这时候我纳闷了。alert(11)都可以执行,但是走到改变颜色这一步就不能执行了?这时候大家肯定会想到,没有获取到DOM元素才会导致颜色没有变化。

顺着这个思路我就百度了一下Vue初始化执行函数,这时候在网页中显示一个mounted和created 的区别。抱着一丝希望点进去之后百度给了我一个答案:


看到这个我给大家解释一下,我顿时明白以前看过一篇文章,vue的生命周期讲的就是这个。上面所说的created的钩子函数已经完成数据检测,或者watch事件的回调,但是$el属性不可见。换句话说最重要的dom还不可见,所以我在项目中把改变字体颜色的方法放到created中根本不会走,因为获取不到的div。所以将this.geys()方法放到mounted中就会改变。

详细介绍一下vue的生命周期,什么时候用什么钩子函数。

先不说上图:

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

对于执行顺序,什么时候执行,上面的知识我们看过之后就可以有个大概了解,下面我一边代码上图一边讲解:


咱们在chrome浏览器里打开,F12看console就能发现:

beforecreated:el 和 data 并未初始化

created:完成了 data 数据的初始化,el没有

beforeMount:完成了 el 和 data 初始化

mounted:完成挂载

另外在标红处,我们能发现el还是 {{message}},这里就是应用的Virtual DOM(虚拟Dom)技术,先把坑占住了。到后面mounted挂载的时候再把值渲染进去。

关于updated

我们在console中执行:app.message='yes!! Ido';

下面就能看到data里的值被修改后,将会触发update的操作。

关于destroy

在控制台执行app.$destroy();

有关于销毁,暂时还不是很清楚。我们在console里执行下命令对 vue实例进行销毁。销毁完成后,我们再重新改变message的值,vue不再对此动作进行响应了。但是原先生成的dom元素还存在,可以这么理解,执行了destroy操作,后续就不再受vue控制了

如下图:

后续

关于vue的生命周期本人就总结到这里吧,都是个人意见,如果读者发现哪里不正确希望能及时给指出,希望本人的实验能给你们带来帮助,后续如果还有其它的见解,继续分享!

推荐阅读更多精彩内容

  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 4,300评论 0 29
  • Vue 框架的入口就是 Vue 实例,其实就是框架中的 view model ,它包含页面中的业务 处理逻辑、数据...
    云中一樵夫阅读 709评论 0 1
  • 最近需要用到一个功能,将一张图片保存到自定义的一个相册中去,这个方法很常用,但是写起来代码有点冗杂,所以决定封装成...
    指尖书法阅读 2,251评论 0 2
  • 控油精油之——丝柏 松柏科的植物是世界上最古老的生物,源远流长,巍峨挺立,犹如见证沧海变桑田的睿智长者,沉稳安静,...
    柔光宝宝阅读 43评论 0 0
  • 人是注定孤独的个体,会挣扎在自己给自己布下的一张网,无论富有贫困,疾病健康,膝下儿女环绕,还是到老孑然一身,这一生...
    阿衬阅读 164评论 0 3