You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native中索引SVG转TSX组件并条件传递Props的问题

解决React Native中SVG组件作为Props传递的"Functions are not valid as a React child"警告

我来帮你搞定这个问题!这个警告的核心原因很简单:你直接把组件函数当成React子元素渲染了,而不是把它实例化成JSX元素。咱们一步步来解决:

第一步:理清导入和结构

你的index.ts导出的cryptoLogos是一个对象,里面每个属性都是转换后的SVG函数组件。在CryptoContainer里导入的时候,其实可以更直接:

// 推荐:直接解构导入,避免多层嵌套访问
import { cryptoLogos } from './cryptologos';

如果还是用import * as logos from './cryptologos',那你需要通过logos.cryptoLogos.BTC来访问对应的组件,这个是没问题的,但解构方式会更清晰。

第二步:正确传递和渲染组件

当你把SVG组件作为Props传给子组件(比如CryptoCard)时,不要直接渲染函数本身,而是要把它当成JSX组件来使用(也就是加< />)。

举个完整的例子:

1. CryptoContainer组件(父组件)

import { View } from 'react-native';
import { cryptoLogos } from './cryptologos';
import CryptoCard from './CryptoCard';

// 模拟你的加密货币列表数据
const cryptoData = [
  { symbol: 'BTC', name: 'Bitcoin' },
  { symbol: 'ETH', name: 'Ethereum' },
  { symbol: 'Doge', name: 'Dogecoin' },
];

export default function CryptoContainer() {
  return (
    <View>
      {cryptoData.map(crypto => (
        <CryptoCard
          key={crypto.symbol}
          name={crypto.name}
          // 把对应的SVG组件传递给子组件
          LogoComponent={cryptoLogos[crypto.symbol as keyof typeof cryptoLogos]}
        />
      ))}
    </View>
  );
}

2. CryptoCard组件(子组件)

这里的关键是,接收组件Props后,要用<LogoComponent />的方式渲染,而不是{LogoComponent}:

import { View, Text } from 'react-native';

// 定义Props类型,明确LogoComponent是一个React函数组件
interface CryptoCardProps {
  name: string;
  LogoComponent: React.FC;
}

export default function CryptoCard({ name, LogoComponent }: CryptoCardProps) {
  return (
    <View style={{ padding: 16, flexDirection: 'row', alignItems: 'center' }}>
      {/* 正确方式:把组件实例化为JSX元素 */}
      <LogoComponent />
      <Text style={{ marginLeft: 8 }}>{name}</Text>
    </View>
  );
}

为什么会出现这个警告?

React的子元素只能是这些类型:JSX元素、字符串、数字、布尔值(会被忽略)、null/undefined,或者数组(包含上述类型)。而你之前直接把组件函数(比如cryptoLogos.BTC)当成子元素({cryptoLogos.BTC}),本质上是把一个函数丢给React渲染,这就触发了警告——React不知道怎么渲染一个普通函数,必须通过<Component />的方式让它变成React元素才行。

额外优化建议

如果你担心类型安全,可以在index.ts里给cryptoLogos加上类型定义:

import BTCLogo from './Bitcoin';
import ETHLogo from './Ethereum';
import DogeLogo from './Doge';

// 定义所有加密货币Logo的类型
type CryptoLogoKey = 'BTC' | 'ETH' | 'Doge';
export const cryptoLogos: Record<CryptoLogoKey, React.FC> = {
  BTC: BTCLogo,
  ETH: ETHLogo,
  Doge: DogeLogo,
};

这样在访问cryptoLogos[crypto.symbol]的时候,TypeScript会帮你做类型检查,避免拼写错误。

内容的提问来源于stack exchange,提问作者cbll

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:33:27