TypeScript 结合 React 开发时候 , React.FunctionComponent 解释

在 TypeScript 结合 React 开发时,React.FC(或 React.FunctionComponent)是一个泛型类型,它用于定义函数组件的类型。这个类型定义了函数组件的结构和预期行为,并且提供了泛型支持,以便你可以指定组件 props 的类型。

React.FC 做了以下几件事情:

  1. 定义 Props 类型 :

    通过泛型参数,React.FC 允许你指定 props 的类型。例如:

    tsx 复制代码
    type MyComponentProps = {
      message: string;
    };
    
    const MyComponent: React.FC<MyComponentProps> = ({ message }) => {
      return <div>{message}</div>;
    };

    在这个例子中,MyComponent 的 props 类型被定义为 MyComponentProps。

  2. 隐含 children :
    React.FC 隐式地给组件的 props 类型添加了 children 属性,这意味着你可以在组件中使用 props.children 而不需要在你的类型定义中显式声明它。

    tsx 复制代码
    const MyComponent: React.FC<MyComponentProps> = ({ children }) => {
      return <div>{children}</div>;
    };

    在这个例子中,即使 MyComponentProps 没有定义 children 属性,你也可以使用它,因为 React.FC 已经包含了它。

  3. 返回类型 :
    React.FC 类型也隐式地定义了组件的返回类型,这意味着你的组件返回的必须是一个 React 元素或者 null。

  4. PropTypes 和 defaultProps :
    React.FC 类型还提供了对 propTypes 和 defaultProps 的支持。虽然在 TypeScript 中,propTypes 不如类型定义那么常用,但 defaultProps 的支持可以让你为 props 设置默认值。

    tsx 复制代码
    const MyComponent: React.FC<MyComponentProps> = ({ message = "Hello" }) => {
      return <div>{message}</div>;
    };

    在这个例子中,如果没有提供 message prop,它会默认为 "Hello"。

然而,使用 React.FC 并不是没有争议的。有一些原因导致一些开发者选择不使用 React.FC:

  • 显式与隐式 :

    一些开发者更喜欢显式地声明 children,以便更清楚地了解组件的 props 结构。

  • defaultProps 的行为 :

    在使用泛型和默认 props 的情况下,defaultProps 有时会与 TypeScript 的类型推断发生冲突。

  • 组件返回类型 :

    当你不希望组件返回 null 时,使用 React.FC 可能会让类型检查变得不那么严格。

因此,是否使用 React.FC 取决于你的个人或团队的偏好。一些团队可能会选择不使用 React.FC 并直接声明函数的类型,例如:

tsx 复制代码
type MyComponentProps = {
  message: string;
  children?: React.ReactNode; // 显式地声明 children
};

const MyComponent = ({ message, children }: MyComponentProps) => {
  return <div>{message}{children}</div>;
};

在这种方式中,你完全控制了组件的 props 类型定义,并且避免了 React.FC 可能引入的任何隐式行为。

相关推荐
Eric.4617 分钟前
Wan‑Animate+MiniMax-H3 本地部署 AI 漫剧流水线:8G 显存动作迁移与动态分镜工程实战
前端·人工智能·comfyui·ai漫剧
liangshanbo121527 分钟前
JavaScript 异步核心主线
javascript·事件循环·异步操作
传人once2 小时前
悬停旋转放大和位移效果如何写
javascript·css·动画
库拉镜像AI牛牛2 小时前
短剧内容自动化生产:知漫剧工作室落地教程
大数据·服务器·前端·人工智能·语音识别
律宏阔2 小时前
Flutter 列表图片内存优化:CachedNetworkImage 与 ClipRRect 的取舍
前端·flutter
行者全栈架构师2 小时前
【鸿蒙心迹】相册文搜图工程化落地:HarmonyOS 7.0 端侧 AI 检索全链路实战与 5 个踩坑解法
前端
律宏阔2 小时前
Dart 3 Record:解决 Future.wait 异构返回值的类型问题
前端·flutter
Seraphina362 小时前
DVWA(XSS Reflected/Stored High,CSRF Low)
前端·xss·csrf
光影少年2 小时前
Taro 是如何解析入口配置 app.config.ts 和页面配置的?
微信小程序·小程序·typescript·reactjs·百度小程序·taro
默_笙3 小时前
🍔 中间件不只是打日志:四个钩子、一次短路,和自带的工具
前端·javascript