Vue生命周期

78 阅读1分钟
// Vue应用程序,通常由多个Vue组件构成
// 如何理解生命周期?
    // 生命周期描述的是vue组件从创建到销毁的完整过程(你可以类比成人的一生)
    // 生命周期只能满足条件时,自动执行。用户是不能调用生命周期的。
 // Vue生命周期分为四个阶段(常用的有8个):
    // 第1阶段:创建阶段(造人->出生)
    // 第2阶段:挂载阶段(上户口的过程)
    // 第3阶段:更新阶段(幼儿园、小学、中学、大学、升职加薪)
    // 第4阶段:销毁阶段(走向死亡)
    const app = new Vue({
        //  在第一阶段之前,new Vue之后),Vue还做了两件重要的事
        // 1 对生命周期钩子函数进行了初始化声明
        // 2 对methods中多有方法进行初始化声明
        
        data: {
        count: 1
      },
      // 第1阶段:创建阶段
      // (1)data选项上数据,使用Object.defineProperty进行劫持
      // (2)响应式依赖收集(依赖注入)
      // 对同一个组件,创建阶段会执行几次?(一次)
      // 注意:所以以后在使用响应式变量,先定义再使用。
       beforeCreate() {
        console.log('--------beforeCreate')
      },
      created() {
        console.log('--------created')
        // 工作中,一般在这里调接口
      },
       // 在第1阶段之后(第2阶段之前)Vue组件通过el选项或者$mount()来寻找视图模板
       // 经过一系列的判断,最终把视图模板转化成render函数(为后面生成vm而准备的)
       // render函数会把带有指令的template视图转化成抽象语法树(AST)
       
        // 第2阶段:挂载阶段
      // (1)用AST抽象语法树生成虚拟DOMx
      // (2)把rDOM树

      // 什么是虚拟DOM?
      // 实际上虚拟DOM是对真实DOM结构的一种描述,它本质上是一个JSON文件。
      // 虚拟DOM是一种特殊的数据结构,它保存在当前Vue应用程序所对应的内存中。
    // 响应拦截,请求拦截

      // 为什么需要虚拟DOM ? 这是为了给更新阶段来使用的.

      // 对同一组件,挂载阶段也只执行一次.
       beforeMount() {
        console.log('--------beforeMount')
      },
      mounted() {
        console.log('--------mounted')
        // 调后端接口
        // 开启定时器
        // 初始化一些基于DOM的第三方插件
        // 开启websocket长连接
        this.timer = setInterval(()=>console.log('timer'), 1000)
      },
      
        // 更新阶段,可以执行0次或多次
      beforeUpdate() {
        console.log('--------beforeUpdate')
      },
      updated() {
        console.log('--------updated')
      },
      
        // 第3阶段 : 更新阶段
      // 问题: 当某些声明式变量发生变化时,我们希望vue帮助我们更新视图. 那么vue更新视图有什么依据?是整个更新,还局部更新?
      // (1) 当有data变化时, 重新生成一个新的虚拟DOM,开始参考patch(diff)运算
      // (2) 对新旧这两个虚拟DOM进行diff运算,找到数据变化前后的所有脏节点,再通知Watcher局部更新视图. 视图更新完成后,旧的虚拟DOM将被删除.

      // 在更新阶段,为什么要这样做? Vue需要找出数据变化前后最小化的更新任务,预示着进行最少地DOM操作. 所以这种基于虚拟DOM的MVVVM是划时代的.

      // 更新阶段,可以执行0次或多次
      beforeUpdate() {
        console.log('--------beforeUpdate')
      },
      updated() {
        console.log('--------updated')
      
      
       beforeUpdate() {
        console.log('--------beforeUpdate')
      },
      updated() {
        console.log('--------updated')
      },

      // 第4阶段: 销毁阶段
      // (1) 拆卸掉Watcher(响应式失效了)
      // (2) 把当前组件和子组件中的事件处理器都解绑(各种交互事件没用了)

      // 如何触发组件的销毁?
      // 有两种方式: 通过vue-router来触发组件的销毁, 使用$destroy()手动销毁
      beforeDestroy() {
        console.log('--------beforeDestroy')
        // 关闭定时器
        clearInterval(this.timer)
        // 清除缓存
        // 关于websocket长链接
        // 清除一些占用内存的变量
      },
      destroyed() {
        console.log('--------destroyed', this)
      },
      methods: {}
    })
    app.$mount('#app')
    })