Vue2 中如何在App.vue中保证当前页面的所有子组件加载并渲染完毕才执行特定逻辑?

Vue2 中如何在App.vue中保证当前页面的所有子组件加载并渲染完毕才执行特定逻辑,测试mounted中并不能实现。

阅读 1.7k
3 个回答

你可以尝试使用Vue.nextTick()

什么是Vue.nextTick()??

定义:在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。

所以就衍生出了这个获取更新后的DOM的Vue方法。所以放在Vue.nextTick()回调函数中的执行的应该是会对DOM进行操作的 js代码;

理解:nextTick(),是将回调函数延迟在下一次dom更新数据后调用,简单的理解是:当数据更新了,在dom中渲染后,自动执行该函数

   created() {
      this.$nextTick(()=>{
        this.$refs.str.value = '西瓜'
        }
      )
    },

可以在父组件中定义一个对象,记录各子组件的状态,监控该对象,所有子组件加载并渲染完毕才执行特定逻辑
父组件:
watch: {

stateObj: {
  handler(n, o) {
    if (n && n.children1 == 'mounted' && n.children2 == 'mounted') {
      // 执行特定逻辑
    }
  },
  deep: true,
        immediate: true
},

},
data() {

return {
  stateObj: {
    children1: '',
    children2: '',
  }
}

},
子组件:
mounted() {

this.$parent.stateObj.children1 = 'mounted'

},

需要等子组件渲染完毕才执行特定逻辑,说明父子组件具有很强的耦合。
可以使用provide/reject 来处理这种逻辑。
每渲染一个子组件调用add在父组件注册一个,在子组件渲染完毕后调用reject反馈给父组件,父组件监听注册列表全部渲染完毕,则执行特定逻辑。

这个方式也可以用状态管理实现pinia,vuex。但逻辑会复杂一些

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题