Vue2的生命周期

目录

一、概念

二、钩子函数总览

三、各钩子函数调用时机

四、父子组件中的声明周期执行顺序

1、同步引入组件的顺序(同步组件)

2、异步引入组件的顺序(异步组件)

四、使用注意点

1、keep-alive中的生命周期

2、异步请求在哪个钩子中请求

3、父组件可以监听到子组件的生命周期

4、在什么阶段才能访问操作DOM?

5、vue子组件监听不到父组件数据变化;子组件获取不到父组件的异步数据的情况

一、概念

Vue实例从创建到销毁的全过程,称为vue实例的生命周期。

包括四大部:

创建(beforeCreate,created)

挂载(beforeMount,mounted)

更新(beforeUpdate,updated)

销毁(beforeDestroy,destroyed)

二、钩子函数总览

beforeCreate

created

beforeMount

mounted

beforeUpdate

updated

activated (keep-alive专属钩子)

deactivated(keep-alive专属钩子)

beforeDestroy

destroyed

三、各钩子函数调用时机

四、父子组件中的声明周期执行顺序

1、同步引入组件的顺序(同步组件)

import componentA from './componentA.vue'

 父组件beforeCreatecreatedbeforeMount —>所有子组件依次beforeCreatecreatedbeforeMount—>所有子组件依次mounted—> 父组件mounted

2、异步引入组件的顺序(异步组件)

只在组件需要渲染的时候才进行加载渲染并进行缓存,以备下次访问。

componentA: () => import('./componentA.vue')

 父组件beforeCreatecreatedbeforeMountmounted —>所有子组件依次beforeCreatecreatedbeforeMountmounted

 

四、使用注意点

1、keep-alive中的生命周期

keep-alive是 Vue 提供的一个内置组件,用来对组件进行缓存——在组件切换过程中将状态保留在内存中,防止重复渲染DOM。

  • beforeCreate、created、beforeMount、mounted、beforeUpdate、updated、beforeDestroy、destroyed。

  • 除以上生命周期以外,keep-alive 还有自己独立的钩子函数 activated 和 deactivated。

如果为一个组件包裹了 keep-alive,那么它会多出两个生命周期:deactivated、activated。同时,beforeDestroy 和 destroyed 就不会再被触发了,因为组件不会被真正销毁

当组件被换掉时,会被缓存到内存中、触发 deactivated 生命周期;当组件被切回来时,再去缓存里找这个组件、触发 activated钩子函数。

2、异步请求在哪个钩子中请求

可以在钩子 created、beforeMount、mounted 中进行调用,因为在这三个钩子函数中,data 已经创建,可以将服务端端返回的数据进行赋值。

推荐在 created 钩子函数中调用异步请求,因为在 created 钩子函数中调用异步请求有以下优点:

能更快获取到服务端数据,减少页面加载时间,用户体验更好;
SSR不支持 beforeMount 、mounted 钩子函数,放在 created 中有助于一致性。(SSR是服务端渲染:在后台将vue实例渲染为HTML字符串直接返回,在前端激活为交互程序。)

3、父组件可以监听到子组件的生命周期

生命周期函数例如mounted,created,updated 等都可以监听,可以通过以下写法实现:

@mounted    @created   @updated

// 父组件
<home-view @mounted="watchChildMounted"></home-view>

watchChildMounted () {
  console.log('监听到子组件的mounted')
}


---------------------------------------------------
// 子组件

mounted () {
  console.log('子组件-mounted')
  this.$emit('mounted')
}



以上是需要手动通过 $emit 触发父组件的事件,更简单的方式可以在父组件引用子组件时通过 @hook 来监听即可

// 父组件
<home-view @hook:mounted="watchChildMounted"></home-view>

watchChildMounted () {
  console.log('监听到子组件的mounted')
}


---------------------------------------------------
// 子组件

mounted () {
  console.log('子组件-mounted')
  // this.$emit('mounted') 不需要手动添加$emit了
}
4、在什么阶段才能访问操作DOM?

在钩子函数 mounted 被调用前,Vue 已经将编译好的模板挂载到页面上,所以在 mounted 中可以进行操作 DOM。

5、vue子组件监听不到父组件数据变化;子组件获取不到父组件的异步数据的情况

可以对子组件使用v-if,当异步数据请求成功后方开始渲染数据,这样页面渲染的就是最新的数据了

<home-view    
  v-if="showHome"
  :infoData= "infoData"
  @hook:mounted="watchChildMounted"
></home-view>

data () {
  return {
    showHome: false
  }
},

created () {
  getData().then(res=> {
    this.dataInfo = res.data.data
    this.showHome = true
  })
},


 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值