如何在typescript react native app中通过props动态使用@expo/vector-icons?

7uhlpewt  于 2023-08-07  发布在  React
关注(0)|答案(2)|浏览(138)

react native app with typescript,我试图通过props传递一个名称作为字符串,动态地创建使用@expo/vector-icons和Fontawesome或MaterialIcon的图标按钮。
我认为问题就在这里,但不知道如何解决。有什么想法?建议?也可以随意批评其他代码。
下面是接收name属性的IconButton组件

import { Ionicons, MaterialIcons, FontAwesome } from 
 "@expo/vector-icons";

const star = "star";

type Props = {
  name: keyof typeof MaterialIcons.glyphMap;
  color: string;
  onPress(): void;
};

export default function IconButton(props: Props) {
  return (
    <Ionicons.Button name={props.name} size={24} color={props.color} />
  );
}

字符串
Fontawesome expo vector expected properties
“名称”属性是这里的问题。
这段代码来自一个使用IconButton的屏幕,我将name作为字符串传递。

useLayoutEffect(() => {
    navigation.setOptions({
      headerRight: () => {
        return (
          <IconButton
            onPress={headerButtonPressHandler}
            name="star"
            color="gray"
          />
        );
      },
    });
  }, [navigation, headerButtonPressHandler]);


name property error

edit:更新代码,但name仍有错误

updated code
this is where I use IconButton and pass in name

hs1ihplo

hs1ihplo1#

在Props类型中,name不应该是字符串-它应该只允许存在于图标集中的名称。如果你在Github上浏览expo/vector-icons的问题,你可以看到其他人也面临着同样的问题,其中一个已经发布了解决方案:

import { MaterialIcons } from '@expo/vector-icons';

type Props = {
  materialIconName: keyof typeof MaterialIcons.glyphMap;
}

字符串
此解决方案和相关讨论可在此处找到:https://github.com/expo/vector-icons/issues/153#issuecomment-752769305
其中一位图书馆作者也提供了这个解决方案:

type MaterialIconName = React.ComponentProps<typeof MaterialIcons>['name'];
const iconName: MaterialIconName =  '3d-rotation'


https://github.com/expo/vector-icons/issues/153#issuecomment-787130328

wwwo4jvm

wwwo4jvm2#

这有助于

type Props{
iconName:   keyof typeof MaterialCommunityIcons.glyphMap;
}

字符串

相关问题