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

好的,很棒 。

1
3
淡定的飞脚
回复
五月的夏天
好不容易避免了2604报错平。。。。这个该怎么实现呀 不会写。
2021-12-31
共3条回复

五月的夏天

2021-12-31

就按课程视频里面的写,是最简单的 。

0
0

基于Vue3+Vite+TS,二次封装element-plus业务组件

集成大量实际样例,系统掌握前沿技术栈与二次组件库封装能力

447 学习 · 185 问题

查看课程