首页 > 其他分享 >vue父子组件生命周期执行顺序

vue父子组件生命周期执行顺序

时间:2022-12-07 10:25:47浏览次数:39  
标签:el 生命周期 created 钩子 vue 组件 mounted data

父子组件生命周期执行顺序(同步组件的情况下)

更新过程
父beforeCreate -> 父created ->父beforeMount -> 子beforeCreate -> 子created -> 子beforeMount -> 子mounted -> 父mounted
更新过程
父beforeUpdate -> 子beforeUpdate -> 子updated -> 父updated
销毁过程
父beforeDestror -> 子beforeDestroy -> 子destroyed -> 父destroyed
常用钩子简易版
父created -> 子created -> 子mounted -> 父mounted
补充单一组件钩子执行顺序
activated,deactivated是组件keep-alive时独有的钩子

1. beforeCreate
2. created
3. beforeMount
4. mounted
5. beforeUpdate
6. updated
7. activated
8. deactivated
9. beforeDestroy
10. destroyed
11. errorCaptured
单一钩子总结
  • beforeCreate执行时:data和el均未初始化,值为undefined
  • created执行时:Vue实例观察的数据对象data已经配置好,已经可以得到data的值,但Vue实例使用的根DOM元素el还未初始化
  • beforeMount执行时:data和el均已经初始化,但此时el并没有渲染进数据,el的值为“虚拟”的元素节点
  • mounted执行时:此时el已经渲染完成并挂载到实例上
  • beforeUpdate和updated触发时,el中的数据已经渲染完成,但只有updated钩子被调用时候,组件dom才被更新。
  • 在created钩子中可以对data数据进行操作,这个时候可以进行数据请求将返回的数据赋给data
  • 在mounted钩子对挂载的dom进行操作,此时,DOM已经被渲染到页面上。
  • 虽然updated函数会在数据变化时被触发,但却不能准确的判断是哪个属性值被改变,所以实际情况中用computed或watch函数来监听属性的变化,并做一些其它的操作。
  • 所有的生命周期钩子自动绑定this上下文到实例中,所以不能使用箭头函数来定义一个生命周期方法(例如 created:()=>this.fetchTodos()),会导致this指向父级。
  • 在使用v-router时有时需要使用keep-alive来缓存组件状态,这个时候created钩子就不会被重复调用了,如果我们的子组件需要在每次加载或切换状态的时候进行某些操作,可以使用activated钩子调用。
  • 父子组件的钩子并不会等待请求返回,请求是异步的,VUE设计也不能因为请求没有响应而不执行后面的钩子。所以我们必须通过v-if来控制子组件钩子的执行时机

在父组件的created中请求获取数据,通过prop传递给子组件。子组件在created或者mounted中拿父组件传递过来的数据这样处理是有问题的!

在父组件调用接口传递数据给子组件时,接口响应显然是异步的。这会导致无论你在父组件哪个钩子发请求,在子组件哪个钩子接收数据。都是取不到的。当子组件的mounted都执行完之后,此时父组件的请求才返回数据。会导致,从父组件传递给子组件的数据是undefined。

解决方法1:

在渲染子组件的时候加上一个条件,当有数据的时候在去渲染子组件。这样就会形成天然的阻塞。在父组件的created中的请求返回数据后,才会执行子组件的created,mounted。最后执行父组件的mounted。

<div class="test">
    <children v-if="data1" :data="data1" ></children>
</div>
解决方法二:

在子组件中watch监听,父组件获取到值,这个 值就会变化,自然可以监听到的

watch:{
    data:{
      deep:true,
      handler:function(newVal,oldVal) {
        this.$nextTick(() => {
          this.data = newVal
          this.data = newVal.url ? newVal.url : ''
        })
      }
    },
}

从父组件点击调用接口并显示子组件,子组件拿到数据并监听在watch中调用方法并显示

以下为子组件,data1是从子组件传递过来的数据。在created,mounted中都拿不到父组件调用接口返回的data1。只能watch监听data1。并调用方法渲染子组件。

props:['data1'],
watch:{
    data1:{
      deep:true,
      handler:function(newVal,oldVal) {
        this.$nextTick(() => {
          this.data1 = newVal
          this.showData1(this.data1)
        })
      }
    },
}

标签:el,生命周期,created,钩子,vue,组件,mounted,data
From: https://www.cnblogs.com/huayang1995/p/16962281.html

相关文章

  • vue这些原理你都知道吗?(面试版)
    前言在之前面试的时候我自己也经常会遇到一些vue原理的问题,我也总结了下自己的经常的用到的,方便自己学习,今天也给大家分享出来,欢迎大家一起学习交流,有更好的方法......
  • 社招前端经典vue面试题汇总
    用过pinia吗?有什么优点?1.pinia是什么?在Vue3中,可以使用传统的Vuex来实现状态管理,也可以使用最新的pinia来实现状态管理,我们来看看官网如何解释pinia的:Pinia是Vue的......
  • SpringCloud该如何入门及相关组件介绍
    前言什么是微服务?什么是SpringCloud?那SpringBoot与SpringCloud的区别又是什么?这几个问题是java开发工程师从SpringBoot向SpringCloud升级的一定回有的疑惑。......
  • vue面试之Composition-API响应式包装对象原理
    本文主要分以下两个部分对CompositionAPI的原理进行解读:reactiveAPI原理refAPI原理reactiveAPI原理打开源码可以找到reactive的入口,在composition-api/src/......
  • 复习精简版快速学vue3
    vue2中。如果给一个之前没有定义的属性赋值,会得不到时实更新:this.obj.b=2//由于这个属性之前没有定义,是不支持动态响应,只能用this.$(this.obj,'b',2)也就是说vue对数据处......
  • 第一个Vue程序
    什么是Vue第三方开发的:可以直接下载使用的基于MVVM设计模式的渐进式的:学习多少就可以用多少,容易与其他技术混搭,但是依然强烈不建议将VUE框架和旧的技术混搭纯前端:只靠......
  • Vue指令
    v-show指令什么是v-show指令v-show指令就是专门控制一个元素显示或者隐藏的指令何时使用v-show指令今后,只要是想控制一个元素的显示或者隐藏,都用v-show指令如何使用v-show......
  • vue使用阿里云视频点播 上传后- 如何播放
    阿里云视频点播  播放器SDK-- web播放器文档地址:https://www.alibabacloud.com/help/zh/apsaravideo-for-vod/latest/apsaravideo-player-sdk-for-web-overview ......
  • vue使用阿里云视频点播上传
    Web(JavaScript)上传SDK(STS方式)阿里云文档地址:https://www.alibabacloud.com/help/zh/apsaravideo-for-vod/latest/use-the-upload-sdk-for-javascript     ......
  • vue项目中上传文件到阿里云oss方法 结合element ui 中的 el-upload
       在项目需求中,关于图片、视频、文件等上传文件,一般不是直接放置在自己的后台服务器上,一般都会购买云服务进行存储。譬如阿里云的oss对象存储。   前端开发项......