近期在开发过程中发现一个问题,使用如下方式进行组件注册,
// 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-if,v-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我了。
虽然问题解决了,但底层逻辑我还是没懂,求告知!!!