欢迎来到小懒的博客~email:568705236@qq.com

<template v-for> key should be placed on the <template> tag

2020/11/29 16:59:37站长

    今天在使用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>

image.png

    报错<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官方文档所说的三种不受限制的情况之一。


赞赏