Vue组件递归 及 循环依赖 解决办法

本文介绍了在Vue中处理组件递归时遇到的循环依赖问题。通过在组件内部异步引入自身,利用`beforeCreate`钩子函数动态注册组件或者在`components`选项中使用异步导入,可以避免组件未注册的错误。这种方法在处理菜单组件如Menu和MenuItem的递归渲染时尤其有用。
摘要由CSDN通过智能技术生成

组件递归(引入自己)

在写一个menu组件时,需要用到递归生成组件树的方法。

但是 “怎么在这个组件内部引入自己????”

解决办法

添加name option,无需注册组件,直接在内部使用<MenuItem></MenuItem>

<script>
export default {
    name: "MenuItem"
}
</script>

循环依赖

我有一个Menu组件,一个MenuItem组件。

Menu组件内部接收一个名为list的props,通过它来循环渲染MenuItem

当我要生成一个二级菜单时,会使用list-item中的children来生成,比较简单的一个方法是 在MenuItem内再放一个Menu,将item中的children作为list props引入

如下:

Menu.vue

Menu.vue
<ul>
    <MenuItem
        v-for="item in list"
        :key="item.index"
        :info="item"
    />
</ul>

<script>
import MenuItem from "./MenuItem.vue"
export default {
    components: { MenuItem },
    props: {
        list: { type: Array }
    }
}
</script>

MenuItem.vue 

MenuItem.vue
<li>
    <span>{{info.title}}</span>
    <Menu
        v-if="item.children?.length"
        :list="item.children"
    />
</li>

<script>
import Menu from "./Menu.vue"
export default {
    components: { Menu },
    props: {
        info: { type: Object }
    }
}
</script>

此时会出现一个循环依赖的问题:Menu依赖MenuItem,而MenuItem依赖Menu。

若使用常规的组件引入方式时,会出现其中一方注册了但另一方未注册的情况发生,此时会报 "did you registed currectly?" 的错误。

解决办法

这时候我们可以考虑先注册好Menu组件,而MenuItem将以异步的方式引入组件内部。

1. beforeCreate

export default {
    beforeCreate () {
      this.$options.components.MenuItem = () => import('./MenuItem.vue')
    },
}

2.components

export default {
    components: { MenuItem: () => import("./MenuItem.vue") }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值