Vue2不同组件注册方式导致的生命周期问题

497 阅读1分钟

近期在开发过程中发现一个问题,使用如下方式进行组件注册,

// index.vue
export default {
  components: {
    PureMain: () => import('./panel/main.vue'),
    PureDepartment: () => import('./panel/department.vue'),
    PureEngineer: () => import('./panel/engineer.vue'),
    PureNormalFault: () => import('./panel/normalFault.vue'),
    PureCenter: () => import('./panel/center.vue'),
    DepartmentCascader: () => import('@/views/components/department/departmentCascader.vue'),
  },}

无论是在created周期还是mounted周期调用this.$refs.pureMain.doSomething()都报Cannot read property 'doSomething' of undefined,于是在网上找了下解决方案,(我的子组件里没有v-ifv-show之类解决方案里提到的问题)

mounted() {
    this.$nextTick(()=>{
        this.$refs.pureMain.doSomething();
    }
}

但是依然报Cannot read property 'doSomething' of undefined

这就哔了狗了,于是在子组件和父组件的mounted里分别加了句console.log('fuck me'),console.log('fuck you')

呵,打印结果居然是:

    fuck me
    fuck you

看到这里大家可能已经知道出现问题的根结在哪里了,父组件居然比子组件先挂载完成,不科学啊,于是我把我非主流的注册组件的方式换成了主流的方式,

//index.vue
import PureMain from './panel/main.vue';
import PureDepartment from './panel/department.vue';
import PureEngineer from './panel/engineer.vue';
import PureNormalFault from './panel/normalFault.vue';
import PureCenter from './panel/center.vue';
export default {
  components: {
    PureMain,
    PureDepartment,
    PureEngineer,
    PureNormalFault,
    PureCenter,
    DepartmentCascader: () => import('@/views/components/department/departmentCascader.vue'),
  },}

哟嚯,一切恢复正常了,打印日志也成了先fuck你,再fuck我了。

虽然问题解决了,但底层逻辑我还是没懂,求告知!!!