Vue2生命周期
每个 Vue 实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听、编译模板、将实例挂载到 DOM 并在数据变化时更新 DOM 等。同时在这个过程中也会运行一些叫做生命周期钩子的函数,这给了用户在不同阶段添加自己的代码的机会。
vue中每一个组件都会创建一个vue实例,这个实例从出生到死亡,经历的过程如下(官网给出)
生命周期函数(也叫生命周期勾子),用于在Vue实例 创建的生命周期的不同阶段,执行业务逻辑 。Vue2有8个生命周期钩子,都是成对出现:
分别是:
- beforeCreate
- created
- beforeMount
- mounted
- beforeUpdate
- updated
- beforeDestory
- destroyed
接下来我们逐一讲解每个生命周期前后做的事,以及每个生命周期中经常执行的业务。
这是一整个生命周期,接下来我们来拆分讲解
首先,当一个vue对象被创建时
初始化默认事件,生命周期,这样我们的生命周期就被创建了,可以执行接下来的操作了
随后,我们遇到了第一个生命周期函数beforeCreated():
此时,由于data,methods等属性还未被创建,因此我们一般不会再这个生命周期执行业务,可执行安装插件操作,例如vue.use(vuex)
初始化注入,响应式数据(此时我们data,methods已经初始化完成了)
此时进入created函数,此时虽然data,methods中未操作dom的方法可以正常使用,,但是模板还未解析,也就是DOM结点还未渲染,对于DOM的操作都无法执行,在created钩子执行的业务为:发送axios请求。
接下来就是根据是否存在el,是否存在template标签渲染虚拟dom结点
进入beforeMount,此时虚拟DOM已经生成,但还未挂载到真实DOM上,也就是页面还未渲染,因此我们仍然无法获取DOM结点,此钩子一般没有业务逻辑。
beforeMount过后,虚拟DOM被挂在到真实DOM树上。
进入mounted,DOM树上已经存在结点,页面渲染成功,我们也可以执行操作DOM操作了,也可以执行发送请求等业务。
mounted过后,当响应式数据(data)发生变化时,页面重新渲染数据之前,beforeCreated执行了,页面渲染完过后,updated执行了,具体执行业务根据需求执行。
当vm.$destory()被调用时,在组件销毁之前,执行beforeDestroy函数,通常在此时解除一些全局或自定义事件(举例:一个父组件中有一个子组件为路由,子组件在全局添加了监听器,当路由切换的时候,子组件被销毁,如果不在beforeDestroy()中解除,监听器将会工作于父组件。)。
在生命周期销毁之后,执行destoryed函数。
两个隐藏的生命周期钩子
由于创建和销毁组件十分消耗浏览器性能,有时我们希望当组件进行路由切换的时候,不被销毁,缓存起来。
为了解决这个问题,我们可以用一个 <keep-alive>
元素将其动态组件包裹起来。被<keep-alive>
包裹的组件将不会被销毁。
当路由组件被<keep-alive>
包裹当路由切换,Vue为我们提供了两个生命周期钩子,actived和deactived。
当一个组件从显示到隐藏的时候,触发deactived()钩子,当路由组件从隐藏到显示的时候,触发actived钩子,由于<keep-alive>
包裹的组件不会被销毁和重复创建,这两个钩子可以做到代替mounted()和destoryed()钩子执行业务的效果