Skip to content

vue生命周期总结 #6

Description

@guilixie

vue生命周期都有哪些?

vue生命周期主要分成实例初始化阶段、挂载阶段、更新阶段和销毁阶段。实例初始化阶段提供了beforeCreate和created钩子函数,挂载阶段提供了beforeMount和mounted钩子函数,更新阶段提供了beforeUpdate和updated钩子函数,销毁阶段提供了beforeDestory和destroyed。还有三个钩子函数activated、deactivated和errorCaptured。

生命周期的图示

这里直接引用官方经典的那张图。

生命周期

每个生命周期钩子函数分别何时调用?

  1. beforeCreate

这个阶段是实例初始化好了,但是数据观测 (data observer) 和 event/watcher 事件配置还没完成。源码中显示此时inject、props、methods、data、computed、watch、provide都还没有处理。

  1. created

这个阶段实例已完成以下的配置:数据观测 (data observer),property 和方法的运算,watch/event 事件回调。然而,因为还没挂载,$el属性目前尚不可用。源码中显示此时inject、props、methods、data、computed、watch、provide都已经处理。

源码片段如下:
init

initState

  1. beforeMount
    在挂载开始之前被调用。

  2. mounted
    实例被挂载后调用,这时 el 被新创建的 vm.$el 替换了。如果根实例挂载到了一个文档内的元素上,当 mounted 被调用时 vm.$el 也在文档内。
    源码片段如下:
    mounted

  3. beforeUpdate
    数据更新时调用,发生在虚拟 DOM 打补丁之前。这里适合在更新之前访问现有的 DOM,比如手动移除已添加的事件监听器。

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

当这个钩子被调用时,组件 DOM 已经更新,所以你现在可以执行依赖于 DOM 的操作。然而在大多数情况下,你应该避免在此期间更改状态。如果要相应状态改变,通常最好使用计算属性或 watcher 取而代之。

源码片段如下:
$destory

  1. beforeDestory
    实例销毁之前调用。在这一步,实例仍然完全可用。
  2. destroyed
    实例销毁后调用。该钩子被调用后,对应 Vue 实例的所有指令都被解绑,所有的事件监听器被移除,所有的子实例也都被销毁。
  3. activated
    被 keep-alive 缓存的组件激活时调用。
  4. deactivated
    被 keep-alive 缓存的组件停用时调用。
  5. errorCaptured
    当捕获一个来自子孙组件的错误时被调用。此钩子会收到三个参数:错误对象、发生错误的组件实例以及一个包含错误来源信息的字符串。此钩子可以返回 false 以阻止该错误继续向上传播。

注意:服务端渲染的只有beforeCreate和created两个钩子函数。

一般在那几个钩子函数中请求数据?

理论上好多生命周期钩子函数中都可以请求数据,一般来说要在created之后,因为此时数据观测 (data observer)已经完成了,数据已经是响应式了,那么created、beforeMount、mounted这几个生命周期钩子都可以。如果是服务端渲染的话,那只能是created周期了。

参考文章

  1. vue官方文档

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions