2020-04-23

vue 生命周期

生命周期 vue实例从开始创建、初始化数据、编译模板、挂载Dom->渲染、更新->渲染、卸载等一系列的过程,称生命周期,各个阶段有相对应的事件钩子。
生命周期钩子
beforeCreate(创建前) 实例初始化后,this指向创建的实例,不能访问到data、computed、watch、methods的方法和数据 用于初始化非响应式变量。

created(创建后) 实例创建完成,可访问data、computed、watch、methods上的方法和数据,未挂载Dom不能访问refs 属性内容为空数组 用于简单的ajax请求页面的初始化、

beforeMount(挂载前) 在挂载开始之前被调用,相关的render 函数首次调用,实例已完成以下的配置、:编译模板,把data里边的数据和模板生成html。注意此时还没有挂载在html页面上

mounted(挂载后)实例挂载在Dom上,此时可通过Dom API获取到DOM节点上,$refs可以访问 用于获取Vnode信息和操作 ajax请求

beforeUpdate(更新前) 响应式数据更新前调用发生在虚拟DOM重新渲染和打补丁之前 适合在更新前访问现有的DOM ,比如手动移除已经添加的事件监听器

updated(更新后) 虚拟DOM重新渲染和打补丁之后,组件DOM已经更新可执行依赖dom的操作 避免在这个时候操作数据可能陷入死循环

beforeDestory(销毁前) 实例销毁之前调用,实例仍然完全可以用 用于销毁定时器解绑全局事件 销毁插件对象等

Destroyed(销毁后) 实例销毁后 调用,所有的事件监听会被移除,所有的子实例 也会被销毁

单个组件的生命周期


export default {
  data() {
    return {
      dataVar: 1
    }
  },
  beforeCreate() {
    this.compName = 'single'
    console.log(`--${this.compName}--beforeCreate`)
  },
  created() {
    console.log(`--${this.compName}--created`)
  },
  beforeMount() {
    console.log(`--${this.compName}--beforeMount`)
  },
  mounted() {
    console.log(`--${this.compName}--mounted`)
  },
  beforeUpdate() {
    console.log(`--${this.compName}--beforeUpdate`)
  },
  updated() {
    console.log(`--${this.compName}--updated`)
  },
  beforeDestroy() {
    console.log(`--${this.compName}--beforeDestroy`)
  },
  destroyed() {
    console.log(`--${this.compName}--destroyed`)
  },
  methods: {
    handleDestroy() {
      this.$destroy()
    }
  }
}

初始化組件时打印

-single--beforeCreate
--single--created
--single--beforeMount
--single--mounted

当data中的值变化时,打印:

-single--beforeUpdate
--single--updated

从打印结果可以看出:

初始化组件时,仅执行了beforeCreate/Created/beforeMount/mounted四个钩子函数。
当改变data中定义的变量(响应式变量)时,会执行beforeUpdate/updated钩子函数。
当切换组件(当前组件未缓存)时,会执行beforeDestory/destroyed钩子函数。
初始化和销毁时的生命钩子函数均只会执行一次,beforeUpdate/updated可多次执行。

父组件的生命周期

将单组件作为基础组件(由于props 在beforeCreate()中未初始化)需做如下更改

props: {
  compName: {
    type: String,
    default: 'single'
  }
},
beforeCreate() {
  // this.compName = 'single'
  // console.log(`--${this.compName}--beforeCreate`)

  console.log(` --data未初始化--beforeCreate`)
}

父组件代码


onst COMPONENT_NAME = 'complex'

import LifecycleSingle from './LifeCycleSingle'

export default {
  beforeCreate() {
    console.log(`--${COMPONENT_NAME}--beforeCreate`)
  },
  created() {
    console.log(`--${COMPONENT_NAME}--created`)
  },
  beforeMount() {
    console.log(`--${COMPONENT_NAME}--beforeMount`)
  },
  mounted() {
    console.log(`--${COMPONENT_NAME}--mounted`)
  },
  beforeUpdate() {
    console.log(`--${COMPONENT_NAME}--beforeUpdate`)
  },
  updated() {
    console.log(`--${COMPONENT_NAME}--updated`)
  },
  beforeDestroy() {
    console.log(`--${COMPONENT_NAME}--beforeDestroy`)
  },
  destroyed() {
    console.log(`--${COMPONENT_NAME}--destroyed`)
  },
  components: {
    LifecycleSingle
  }
}

初始化组件时打印

--complex--beforeCreate
--complex--created
--complex--beforeMount
  --data未初始化--beforeCreate
  --child--created
  --child--beforeMount
  --child--mounted
--complex--mounted
--complex--beforeUpdate
--complex--updated

当子组件data中 的值变化时 打印

--child--beforeUpdate
--child--updated

当父组件data中的值发生变化打印

--complex--beforeUpdate
--complex--updated

当props改变 打印

-complex--beforeUpdate
  --child--beforeUpdate
  --child--updated
--complex-updated

当子组件销毁打印

-child--beforeDestroy
--child--destroyed

当父组件销毁时

--complex--beforeDestroy
  --child--beforeDestroy
  --child--destroyed
--complex--destroyed

从打印结果可以看出:

仅当子组件完成挂载后,父组件才会挂载。
当子组件完成挂载后,父组件会主动执行一次beforeUpdate/updated钩子函数(仅首次)。
父子组件在data变化中是分别监控的,但是在更新props中的数据是关联的。
销毁父组件时,先将子组件销毁后才会销毁父组件。

你可能感兴趣的:(2020-04-23)