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 类型还提供了对 propTypesdefaultProps 的支持。虽然在 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 可能引入的任何隐式行为。

相关推荐
程序员爱技术1 小时前
Vue 2 + JavaScript + vue-count-to 集成案例
前端·javascript·vue.js
并不会2 小时前
常见 CSS 选择器用法
前端·css·学习·html·前端开发·css选择器
悦涵仙子2 小时前
CSS中的变量应用——:root,Sass变量,JavaScript中使用Sass变量
javascript·css·sass
衣乌安、2 小时前
【CSS】居中样式
前端·css·css3
兔老大的胡萝卜2 小时前
ppk谈JavaScript,悟透JavaScript,精通CSS高级Web,JavaScript DOM编程艺术,高性能JavaScript pdf
前端·javascript
低代码布道师2 小时前
CSS的三个重点
前端·css
耶啵奶膘3 小时前
uniapp-是否删除
linux·前端·uni-app
王哈哈^_^5 小时前
【数据集】【YOLO】【目标检测】交通事故识别数据集 8939 张,YOLO道路事故目标检测实战训练教程!
前端·人工智能·深度学习·yolo·目标检测·计算机视觉·pyqt
cs_dn_Jie5 小时前
钉钉 H5 微应用 手机端调试
前端·javascript·vue.js·vue·钉钉
开心工作室_kaic6 小时前
ssm068海鲜自助餐厅系统+vue(论文+源码)_kaic
前端·javascript·vue.js