vue组件循环引用组件导致的报错问题

364 阅读1分钟

vue组件循环引用组件导致的报错问题

问题描述

在开发过程中,遇到一个循环引用组件的问题,导致开发时就会报错。 例如

image.png 这种情况是,比如A组件中引用B组件,同时B组件中也引用A组件导致的。 A 组件(这里举例为列表页)

<template>
  <div>
    <div>我是列表页</div>
    <div v-for="item in list" :key="item.id" class="grid" @click="recordItem(item)">
      <div>
        {{ item.id }}
      </div>
      <div>
        {{ item.typeName }}
      </div>
      <div>
        {{ item.name }}
      </div>
    </div>
    <div>详情展示</div>
    <Info v-if="record.id" :id="record.id" :type="record.type"/>
  </div>
</template>

<script>
import Info from './Info.vue'
export default {
  name: "da-a",
  components:{
    Info
  },
  data() {
    return {
      list: [],
      record:{},
    };
  },
  created() {
    const Arr = [];
    for (let i = 1; i <= 10; i++) {
      const type = Math.floor(Math.random() * 2);
      Arr.push({
        id: i,
        type: type,
        typeName: type ? "类型1" : "类型2",
        name: "张三" + i,
      });
    }
    this.list = Arr;
  },
  methods: {
    recordItem(row){
      this.record = row
    }
  },
};
</script>

<style>
.grid {
  display: grid;
  grid-template-columns: repeat(3,1fr);
  grid-gap: 10px;
}
</style>

B组件(这里举例为详情展示)

<template>
  <div>
    我是详情页{{id}}
    <div>
        {{ type ? "类型2":"类型1" }}
    </div>
    <div>
        下面时关联列表
    </div>
    <div>
        <ListA />
    </div>
  </div>
</template>

<script>
import ListA from './ListA.vue';
export default {
    components:{
        ListA:ListA
    },
  name: 'info',
  props:{
    type:{
        type:Number,
        default: 1
    },
    id:{
        required:true
    }
  }
}
</script>

<style>

</style>

这里的需求关系,就是列表页中,列表点击渲染出详情数据; 但是详情数据可能还会关联别的列表数据,并且通过点击关联的列表数据,依旧可以查询详情,并显示出来。

问题分析

这里为什么会报错呢? webpack解析文件组件时,是按顺序执行。 当解析到 ListA 组件时,遇到了导入语句

import Info from './Info.vue'

这个时候就会再去解析Info组件 解析Info组件时,又遇到了导入语句

import ListA from './ListA.vue';

这个时候因为之前已经在解析ListA 组件了,只是还没有解析完。所以这个时候,ListA是undefined的。

问题解决

如何解决呢? 那么通过动态导入就可以轻松解决.

deal.png