2016-10-22 134 views
4

我设法使用name属性直接创建自嵌套组件,并且所有工作都完美无缺。如何在Vue JS 2中间接自嵌套组件?

<template> 
    <div> 
     <span>Hi, I'm component A!</span> 
     <component-a></component-a> 
    </div> 
</template> 

<script> 
    export default { 
     name: 'component-a', 
     components: { 
      'component-a': this 
     } 
    } 
</script> 

现在,我想创建间接自嵌套组件。事情是这样的:

ComponentA.vue:

<template> 
    <div> 
     <span>Hi, I'm component A!</span> 
     <component-b v-if="hasItems" v-for="item in items" :item="item"></component-b> 
    </div> 
</template> 

<script> 
    import ComponentB from './ComponentB.vue' 

    export default { 
     name: 'component-a', 
     components: { 
      'component-b': ComponentB 
     }, 
     props: ['items'], 
     computed: { 
      hasItems() { 
       return this.items.length > 0 
      } 
     } 
    } 
</script> 

ComponentB.vue:

<template> 
    <div> 
     <span>Hi, I'm component B!</span> 
     <component-a v-if="hasItems" :items="item.items"></component-a> 
    </div> 
</template> 

<script> 
    import ComponentA from './ComponentA.vue' 

    export default { 
     name: 'component-b', 
     components: { 
      'component-a': ComponentA 
     }, 
     props: ['item'], 
     computed: { 
      hasItems() { 
       return this.item.items.length > 0 
      } 
     } 
    } 
</script> 

但是失败了。我得到以下错误:

[Vue warn]: Failed to mount component: template or render function not defined. (found in component)

有没有人遇到过这样的事情,并能解决它?根据文档,我们有控制递归组件与条件呈现,我在做什么......我甚至试图使用组件上的name道具,但它什么也没做(我认为它应该,因为组件不是直接自嵌套)。

回答

3

我试过你的代码,我也结束了相同的错误,没有一个线索如何进行。后来我关闭了我的vue-cli并直接使用CDN(独立​​版本)中的vue.js,并且它工作正常。

这里是工作示例:https://jsfiddle.net/mani04/z09Luphg/

有没有神奇怎么回事。 Component AComponent B互相打电话给counterValue。一旦counterValue达到一定的限制,递归停止。

如果你没有得到更好的答案,并且如果你无法修改你的应用程序架构,你可以尝试使用这个独立的 vue.js方法。

编辑:下面

在今天进一步研究更多的信息,我碰到这个github上讨论传来的WebPack周期性进口/循环依赖:https://github.com/webpack/webpack/issues/1788

独立的jsfiddle上面的例子不需要任何ES6进口。在我的示例代码中,Vue.js在启动应用程序之前全局注册组件。因此它没有任何问题。

总之,这看起来不像是Vue.js的问题,而是基于当前信息的webpack/es6限制。我可能是错的,请继续探索!

+1

我一直在分析你提供的链接,它似乎确实与webpack相关,以及如何处理循环导入。但我无法找到一个解决方案或解决方法...我已经更新laravel-elixir-webpack官员到最新版本,并尝试了一些链接中引用的东西,但事实是,我的webpack知识不是很深,我没有选择。我会一直试着理解发生的事情,当我找到某些东西时我会在这里发帖。如果在此期间您找到任何可以提供帮助的东西,请分享。谢谢。 –

+0

实际上,在这种情况下,我的第一选择不是太乱Webpack配置。原因是因为它成为维护和解释给其他团队成员的噩梦。这就是为什么我不想深入阅读关于其他人如何解决它的github问题页面。改变应用设计应该更容易,而不是循环导入。但是如果我找到了一个简单的方法,我会回到上面编辑我的答案。 – Mani

+1

由于webpack的限制,我不应该改变我的APP设计。在APP上下文中有这样的组件结构是有意义的。我真的希望有这样的解决方法... –