• Vue 先初始化父组件再初始化子组件的方法(自定义父子组件mounted执行顺序)


    写在前面:

    • 本篇内容内容主要讲述了,在使用 Konva 进行开发过程中遇到的一些问题。(既然是组件加载顺序,主要牵扯到的就是,父子组件的关系,父子组件的生命周期)

    • 众所周知,Vue中父子组件生命周期的执行顺序为:

      // 挂载阶段
      父beforeCreate -> 父created -> 父beforeMount -> 子beforeCreate -> 子created -> 子beforeMount -> 子mounted -> 父mounted
      // 更新阶段
      父beforeUpdate -> 子beforeUpdate -> 子updated -> 父updated
      // 销毁阶段
      父beforeDestroy -> 子beforeDestroy -> 子destroyed -> 父destroyed
    • 然而,在某些情况下我们有其他需求,例如我们不得不让子组件的初始化在父组件初始化完成之后再进行(一般是针对mounted),下面将进行详细说明

    1、引用关系说明

    • 最终目的:使用Konva 库绘制组件,该组件由两个按钮、一个电平表、一个增益控制推杆,这些子组件组合起来构成所需组件,并将其绘制到Stage中的Layer
      • StageLayer只有一个,所以应当写在App.vue中,使用时将Layer传递给子组件(且这个Layer应当是响应式的);且由于要绘制所需组件,因此自然是要引用所需组件,即所需组件是App.vue的子组件
      • 所需组件应当引用各个子组件,它是各个子组件的父亲
    • 综上,是一个三层的继承关系,此外,由于有了StageLayer才能绘制所需组件,有了所需组件才能绘制各个子组件,此时,各个控件的初始化顺序与生命周期刚好相反

    2、两层继承关系示例

    假如说目前我只有两层继承关系,App.vue 和所需组件 Channel.vue

    代码在下方展示,详细的内容我将在代码中使用注释详细说明,请按照注释编号顺序进行阅读和理解

    • App.vue

      要点:

      • layer 依赖注入,使所有的子组件可以获取
      • 父组件的 layer 进行依赖注入时需要使用响应式,以便于父组件知道 layer 的改变(类比C语言的直接传参和指针传参)
      • 需要将所需组件引用、注册并展示到页面上
    • Channel.vue

      要点:

      • 接收 layer

      • 使用 this.$nextTick(() => { 初始化代码 }),会使得初始化代码在父组件的初始化完成后再执行

        • this.$nextTick()Vue.js提供的一个方法,用于在DOM更新之后执行回调函数。它的作用是确保在下次DOM更新循环结束之后执行回调函数,以确保操作的准确性和可靠性。

        • Vue.js中,当数据发生改变时,Vue会异步地更新DOM。这意味着在修改数据后立即访问更新后的DOM可能无法得到正确的结果,因为此时DOM可能尚未完成更新。

          通过使用this.$nextTick()方法,我们可以将回调函数延迟到下一次DOM更新循环之后执行。在这个时候,Vue已经完成了所有的异步DOM更新,我们可以放心地操作更新后的DOM元素,确保获取到准确的结果。

      • 绘制完成后更新 layer

    3、三层及以上继承关系示例

    • 在上面的内容中,使用this.$nextTick(() => { 回调 })解决了两层继承关系中的反向初始化顺序的问题。
    • 但是这本质上更像是一种小聪明,当到了三层以上继承关系的时候这种方法不能有任何效果,因为子组件和孙子组件如果不同时使用 this.$nextTick(() => { 回调 }) 总会有人在父组件之前初始化,而如果都用了 this.$nextTick(() => { 回调 }) 那么它们两个本身的初始化顺序仍然是先子后父,一定会出问题。所以要使用其他的方式来解决这个问题

    代码在下方展示,详细的内容我将在代码中使用注释详细说明,请按照注释编号顺序进行阅读和理解

    • Channel.vue

      要点:

      • 接收 layer 等不再赘述
      • 使用 this.$nextTick(() => { 初始化代码 }),会使得初始化代码在父组件的初始化完成后再执行
      • 设置flag用于判断当前组件初始化是否完成,使用v-if="flag"控制子组件初始化时机
  • 相关阅读:
    基于openpose的引体向上的识别计数统计项目(2)CPullupCounter类设计与实现
    妙手ERP功能更新:Shopee认领配置中的主货号支持按后缀自动递增、Ozon采集箱支持批量编辑【颜色样本图】、TikTok Shop......
    Northwestern University-844计算机科学与技术/软件工程-复试注意事项【考研复习】
    Sulfo-Cyanine7 NHS ester活体成像用染料1603861-95-5星戈瑞
    渗透工具——kali中wpscan简介
    HTTP状态码是什么?
    数学建模 导航
    mysql之count(*)
    花2w培训数据分析真的值得吗?
    【JavaEE进阶系列 | 从小白到工程师】基本类型包装类的使用,装箱以及拆箱与parseInt方法
  • 原文地址:https://www.cnblogs.com/dandelion-000-blog/p/17532281.html