Vue组件之间的循环引用导致的报错:组件未注册

2,915 阅读1分钟

1. 问题描述

主要代码如下:

DateTypeFormItem.vue文件

<template>
  <ParamsFormModal />
</template>

<script>
import ParamsFormModal from './ParamsFormItem'
export default {
  components: {
    ParamsFormModal
  }
</script>
ParamsFormModal.vue文件

<template>
  <DateTypeFormItem />
</template>

<script>
import DateTypeFormItem from './DateTypeFormItem'
export default {
  components: {
    DateTypeFormItem
  }
}
</script>

执行之后,报错如下: image.png

2. 我的思考

碰到这个问题,我第一反应就是觉得是不是哪个单词拼写错了,比如components写成了component,或者是文件路径是不是写错了。但是经过我反复的检查,确定应该没问题的。

后来我去网上找答案,发现大部分也都是一些拼写之类的错误,但是当我看到了这篇文章 www.jianshu.com/p/ae4b392da… ,问题终于解决!

3. 问题解决

修改其中一个文件即可,都修改了好像也没啥问题~

修改DateTypeFormItem.vue文件代码如下

DateTypeFormItem.vue文件(只展示修改部分代码)

<script>
export default {
  components: {
    ParamsFormModal: () => import('./ParamsFormModal')
  }
}
</script>

修改ParamsFormModal.vue文件代码如下

ParamsFormModal.vue文件(只展示修改部分代码)

<script>
export default {
  components: {
    DateTypeFormItem: () => import('./DateTypeFormItem')
  }
}
</script>

4. 总结

这个问题在官方文档中其实也有提到 组件之间的循环引用, 大致意思就是有两个组件,组件A依赖于组件B,组件B也依赖于组件A,当模板系统解析到组件A时,发现A依赖于B,于是去解析B,发现B又依赖于A,这样就会形成一个循环,也就有了这个问题。所以我们需要设置一个点,到底是先解析A还是B,于是我们通过webpack的异步加载的方式,让模板系统知道哪个可以后解析,这样问题就可以解决了。