面经-Vue-生命周期函数


生命周期流程

  • 完整的生命周期
    完整的生命周期

  • 详细描述
    1
    2
    3

生命周期函数

  • 创建 -> 前后: (beforeCreate, created)

  • 挂载 -> 前后: (beforeMount, mounted)

  • 更新 -> 前后: (beforeUpdate, updated)

  • 销毁 -> 前后: (beforeDestroy, destroyed)

常用的生命周期函数

  • created
    • Vue中data的数据和methods的方法已可以使用
    • data属性,methods属性,watch监听等都初始化好了,也就是可以使用了。
  • mounted
    • 开启定时器
    • 发送ajax请求
    • 订阅消息
    • 绑定自定义事件
    • 已经把内存中编译好的模板替换到页面中,也就是视图层已渲染成最新的,vue 实例完全创建完毕。可以操作DOM,但不保证所有子组件都挂载了。
  • beforeUpdate
    • 清除定时器
    • 取消订阅、事件监听
    • 解绑自定义事件

vue实例销毁

  • vue开发者工具的数据为空
  • 销毁后自定义事件失效
  • 不要在beforeDestroy进行数据的操作,不会再走更新流程

Vue生命周期经历哪些阶段:

  1. 总体来说:初始化、运行中、销毁
  2. 详细来说:开始创建、初始化数据、编译模板、挂载Dom、渲染→更新→渲染、销毁等一系列过

生命周期经历的阶段和钩子函数:

  1. 实例化vue(组件)对象:new Vue()
  2. 初始化事件和生命周期 init events 和 init cycle
  3. beforeCreate函数:
    • 在实例初始化之后,数据观测 (data observer) 和 event/watcher 事件配置之前被调用。即此时vue(组件)对象被创建了,但是vue对象的属性还没有绑定,如data属性,computed属性还没有绑定,即没有值。
    • 此时还没有数据和真实DOM。
    • 即:属性还没有赋值,也没有动态创建template属性对应的HTML元素(二阶段的createUI函数还没有执行)
  4. 挂载数据(属性赋值)
  • 包括 属性和computed的运算
  1. Created函数:
  • vue对象的属性有值了,但是DOM还没有生成,$el属性还不存在。
  • 此时有数据了,但是还没有真实的DOM
  • 即:data,computed都执行了。属性已经赋值,但没有动态创建template属性对应的HTML元素,所以,此时如果更改数据不会触发updated函数
  • 如果:数据的初始值就来自于后端,可以发送ajax,或者fetch请求获取数据,但是,此时不会触发updated函数
  1. 检查
  2. 检查是否有el属性
    • 检查vue配置,即new Vue{}里面的el项是否存在,有就继续检查template项。没有则等到手动绑定调用 vm.$mount()完成了全局变量$el的绑定
  3. 检查是否有template属性
    • 检查配置中的template项,如果没有template进行填充被绑定区域,则被绑定区域的el对outerHTML(即 整个#app DOM对象,包括所在的标签,以及里面的所有标签)都作为被填充对象替换掉填充区域。
    • 如果vue对象中有 template属性,那么,template后面的HTML会替换$el对应的内容。如果有render属 性,那么render就会替换template。 即:优先关系: render > template > el
  4. beforeMount函数:
  • 模板编译(template)、数据挂载(把数据显示在模板里)之前执行的钩子函数
    此时 this.$el有值,但是数据还没有挂载到页面上。即此时页面中的{{}}里的变量还没有被数据替换
  1. 模板编译:
  • 用vue对象的数据(属性)替换模板中的内容
  1. Mounted函数:
  • 模板编译完成,数据挂载完毕
  • 即:此时已经把数据挂载到了页面上,所以,页面上能够看到正确的数据了。
    一般来说,我们在此处发送异步请求(ajax,fetch,axios等),获取服务器上的数据,显示在DOM里。
  1. beforeUpdate函数:
  • 组件更新之前执行的函数,只有数据更新后,才能调用(触发)beforeUpdate,注意:此数据一定是在模板上出现的数据,否则,不会,也没有必要触发组件更新(因为数据不出现在模板里,就没有必要再次渲染)
  • 数据更新了,但是,vue(组件)对象对应的dom中的内部(innerHTML)没有变,所以叫作组件更新前
  1. Updated函数:
  • 组件更新之后执行的函数
  • vue(组件)对象对应的dom中的内部(innerHTML)改变了,所以,叫作组件更新之后
  1. activated函数:keep-alive组件激活时调用
  2. activated函数:keep-alive组件停用时调用
  3. beforeDestroy函数:vue(组件)对象销毁之前
  4. destroyed函数:vue组件销毁后

keep-alive

  • 包裹动态组件时,会缓存不活动的组件实例,主要用于保留组件状态或避免重新渲染。

  • 解析: 比如有一个列表和一个详情,那么用户就会经常执行打开详情=>返回列表=>打开详情…这样的话列表和详情都是一个频率很高的页面,那么就可以对列表组件使用 进行缓存,这样用户每次返回列表的时候,都能从缓存中快速渲染,而不是重新渲染

问: 说一说 vue keep-alive 参考博客

  • 答:

    • keep-alive: keep-alive 可以实现组件缓存,是Vue.js的一个内置组件
  • 作用:

    • 它能够把不活动的组件实例保存在内存中,而不是直接将其销毁
    1. 它是一个抽象组件,不会被渲染到真实DOM中,也不会出现在父组件链中
  • 使用方式:

    • 常用的两个属性 include/exclude ,允许组件有条件的进行缓存。
    1. 两个生命周期 activated/deactivated ,用来得知当前组件是否处于活跃状态。
    2. keep-alive的中还运用了 LRU(Least Recently Used) 算法。

问:vue生命周期中异步加载在mouted还是create里实现 ? 参考答案

  • 答:

    • 最常用的是在created钩子函数中调用异步请求
  • 解析:

    • 一般来说,在,created,mounted中都可以发送数据请求,但是,大部分时候,会在created发送
      请求。
    • Created的使用场景:如果页面首次渲染 就来自后端数据。
      • 因为,此时data已经挂载到vue实例了。在 created(如果希望首次选的数据来自于后端,就在此处发请求)(只发了异步请求,渲染是在后端响应之后才进行的)、beforeMount、mounted(在mounted中发请求会进行二次渲染) 这三个钩子
        函数中进行调用。因为在这三个钩子函数中,data 已经创建,可以将服务端端返回的数据进行赋值。但是最常用的是在
        created 钩子函数中调用异步请求,因为在 created 钩子函数中调用异步请求有两个优点:
        • 第一点:能更快获取到服务端数据,减少页面 loading 时间;
        • 第二点:放在 created 中有助于一致性,因为ssr 不支持 beforeMount 、mounted 钩子函数。

文章作者: Zetai Wei
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Zetai Wei !
评论
  目录