今天在使用antd vue 2.0复制了一下官方的单文件递归菜单例子,然后将里面的递归拆了,直接做成固定三层菜单。然而却报错了。先上部分错误代码
<a-sub-menu :menu-info="item2" :key="item2.key" >
<template #title><span>{{ item2.title }}</span></template>
<template v-for="item3 in item2.children" :key="item3.key">
<a-menu-item :key="item3.key">
<span>{{ item3.title }}</span>
</a-menu-item>
</template>
</a-sub-menu>
报错<template v-for> key should be placed on the <template> tag。身为vue新手的我当场就蒙蔽了,你把错误标在span上几个意思?
不过按照错误提示,问题应该是在template上面,那我将目光往上移一下,外面的template可是有key的,循环没问题。但是编辑器就是不通过,那必定是有语法错了。只能尝试。
//下面这个编译成功,将循环放在组件menuitem上
<a-sub-menu :menu-info="item2" :key="item2.key" >
<template #title><span>{{ item2.title }}</span></template>
<!--<template v-for="item3 in item2.children" :key="item3.key">-->
<a-menu-item v-for="item3 in item2.children" :key="item3.key">
<span>{{ item3.title }}</span>
</a-menu-item>
<!--</template>-->
</a-sub-menu>
//下面这个编译成功,移除组件menuitem
<a-sub-menu :menu-info="item2" :key="item2.key" >
<template #title><span>{{ item2.title }}</span></template>
<template v-for="item3 in item2.children" :key="item3.key">
<template v-if="!item3.children">
<!--<a-menu-item :key="item3.key">-->
<span>{{ item3.title }}</span>
<!--</a-menu-item>-->
</template>
</template>
</a-sub-menu>
//下面这个编译成功,循环的template和组件menuitem直接再加一个判断的template
<a-sub-menu :menu-info="item2" :key="item2.key" >
<template #title><span>{{ item2.title }}</span></template>
<template v-for="item3 in item2.children" :key="item3.key">
<template v-if="!item3.children">
<a-menu-item :key="item3.key">
<span>{{ item3.title }}</span>
</a-menu-item>
</template>
</template>
</a-sub-menu>按以上的测试,看上去是组件menuitem上的问题,我还是去vue的官网看了下教程中列表循环的部分。于是看到了https://cn.vuejs.org/v2/guide/components.html#%E8%A7%A3%E6%9E%90-DOM-%E6%A8%A1%E6%9D%BF%E6%97%B6%E7%9A%84%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9
里面的一句话“哪些元素可以出现在其内部是有严格限制的”。而在antd vue 的文档中,menu组件部分也有一句话”Menu.SubMenu 的子元素必须是 MenuItem 或者 SubMenu“。
得了,大概是这个原因了,在antd vue 2.0官方的单文件递归菜单例子中,递归部分是用字符串写的,刚好符合vue官方文档所说的三种不受限制的情况之一。
