在 typeScript 中遇到了同样的问题,在 JSX 中有一个 menuItem 列表来映射它,每个都包含一个不同的 React Component 图标,如下所示:
const menuItems: {label: string, icon: React.FC, selected:boolean}[] = [
{label: 'Home', icon: <HomeIcon/>, selected: false},
{label: 'Live TV', icon: <ScreenIcon/>, selected: false},
{label: 'VOD', icon: <PlayIcon/>, selected: true},
{label: 'Podcasts', icon: <MicIcon/>, selected: false},
{label: 'Games', icon: <GameIcon/>, selected: false},
{label: 'App', icon: <MenuIcon/>, selected: false},
{label: 'Services', icon: <ShopIcon/>, selected: false},
{label: 'Languages', icon: <WorldIcon/>, selected: false},];
但是如果 menuItem 被选中或聚焦,我需要给图标一个“填充”道具,所以我改变了我的数组,如下所示:
const menuItems: {label: string, icon: React.FC, selected:boolean}[] = [
{label: 'Home', icon: HomeIcon, selected: false},
{label: 'Live TV', icon: ScreenIcon, selected: false},
{label: 'VOD', icon: PlayIcon, selected: true},
{label: 'Podcasts', icon: MicIcon, selected: false},
{label: 'Games', icon: GameIcon, selected: false},
{label: 'App', icon: MenuIcon, selected: false},
{label: 'Services', icon: ShopIcon, selected: false},
{label: 'Languages', icon: WorldIcon, selected: false},];
并这样称呼它:
const FocusableListItem: FC<ExportableProps> = (props) => {
const classes = useStyles(props);
return (
<ListItem button key={props.label} className={classes.button} >
<ListItemIcon>
<props.icon fill={props.focused || props.selected ? '#6648ff' : '#c4c4c4'}></props.icon>
</ListItemIcon>
<ListItemText>{props.label}</ListItemText>
</ListItem>
);
};
使用这种道具接口:
interface ExportableProps extends withFocusableProps {
label: string;
icon: React.FC<{fill: string}>;
onClick?: () => void;
disabled?: boolean;
selected?: boolean;
small?: boolean;
}
并且工作完美!不知道它是否会帮助某人,但看起来很有用。