ts报错JSX 元素类型“item.icon”不具有任何构造签名或调用签名。ts(2604)
来源:4-4 导航菜单-使用 tsx 实现无限层级菜单
淡定的飞脚
2021-12-31
我这里自己改装了一下icon的自定风格封装,当我写<item.icon />时,ts报错JSX 元素类型“item.icon”不具有任何构造签名或调用签名。ts(2604)。这里我不需要用item.i,直接用本身即可,请问这个报错怎么解决。
import { defineComponent, PropType } from 'vue'
import { MenuItem } from './types'
export default defineComponent({
name: 'infiniteMenu',
props: {
//说明:
data: {
required: true,
type: Array as PropType<MenuItem[]>,
},
// 默认选中的菜单
defaultActive: {
type: String,
default: '',
},
//是否是路由模式 router,
//是否启用 vue-router 模式
//启用该模式会在激活导航时以 index 作为 path 进行路由跳转
router: {
type: Boolean,
default: false,
},
},
setup(props, ctx) {
//****************** 封装渲染一个无限层菜单的方法 ******************/
let renderMenu = (data: MenuItem[]) => {
return data.map((item: MenuItem) => {
//每个菜单的图标
let slots = {
title: () => {
return (
<>
<item.icon />
<span>{item.name}</span>
</>
)
},
}
//递归渲染children
if (item.children && item.children.length) {
return (
<el-sub-menu index={item.index} v-slots={slots}>
{/* 递归 */}
{renderMenu(item.children)}
</el-sub-menu>
)
}
//正常渲染普通的菜单
return (
<el-menu-item index={item.index}>
<item.icon />
<span>{item.name}</span>
</el-menu-item>
)
})
}
return () => {
return (
<el-menu
default-active={props.defaultActive}
router={props.router}
>
{renderMenu(props.data)}
</el-menu>
)
}
},
})
我找到解决方案了 ,百度不到,自己猜出来的:
{item.icon ? <item.icon /> : ''}
谢谢老师。
写回答
2回答
-
五月的夏天
2021-12-31
好的,很棒 。
132021-12-31 -
五月的夏天
2021-12-31
就按课程视频里面的写,是最简单的 。
00
相似问题