React的React.FC与React.Component的初步认识

本文深入解析React中的两种组件类型:函数式组件(React.FC)与类组件(React.Component)。探讨了它们的定义方式、特性及应用场景,通过实例对比了两者的使用差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

React 的组件可以定义为 函数(React.FC<>)或class(继承 React.Component) 的形式。

一、React.FC<>

1.React.FC是函数式组件,是在TypeScript使用的一个泛型,FC就是FunctionComponent的缩写,事实上React.FC可以写成React.FunctionComponent

const App: React.FunctionComponent<{ message: string }> = ({ message }) => (
  <div>{message}</div>
);

2.React.FC 包含了 PropsWithChildren 的泛型,不用显式的声明 props.children 的类型。React.FC<> 对于返回类型是显式的,而普通函数版本是隐式的(否则需要附加注释)。

3.React.FC提供了类型检查和自动完成的静态属性:displayNamepropTypesdefaultProps(注意:defaultProps与React.FC结合使用会存在一些问题)。

4.我们使用React.FC来写 React 组件的时候,是不能用setState的,取而代之的是useState()useEffect等 Hook API。

例子(这里使用阿里的Ant Desgin Pro框架来演示):

const SampleModel: React.FC<{}> = () =>{   //React.FC<>为typescript使用的泛型
  	const [createModalVisible, handleModalVisible] = useState<boolean>(false); 
  	return{
  	{/** 触发模态框**/}
  	<Button style={{fontSize:'25px'}}  onClick={()=>handleModalVisible(true)} >样例</Button>
  	{/** 模态框组件**/}
  	<Model onCancel={() => handleModalVisible(false)} ModalVisible={createModalVisible} /> 
  }

二、class xx extends React.Component

如需定义 class 组件,需要继承 React.ComponentReact.Component是类组件,在TypeScript中,React.Component是通用类型(aka React.Component<PropType, StateType>),因此要为其提供(可选)prop和state类型参数:

例子(这里使用阿里的Ant Desgin Pro框架来演示)::

class SampleModel extends React.Component {
  state = {
    createModalVisible:false,
  };

  handleModalVisible =(cVisible:boolean)=>{
    this.setState({createModalVisible:cVisible});
  };
  return {
  {/** 触发模态框**/}
  	<Button onClick={()=>this.handleModalVisible(true)} >样例</Button>
  	{/** 模态框组件**/}
  	<Model onCancel={() => handleModalVisible(false)} ModalVisible={this.state.createModalVisible} /> 
  }

ps:简单来说,不知道用什么组件类型时,就用 React.FC

### React.ReactElement React.FC区别 `React.ReactElement` `React.FC` 是 React 类型系统中两个不同的概念,它们在组件定义使用中扮演着各自的角色。 `React.ReactElement` 表示的是一个 React 元素对象,它包含了描述 UI 的信息。这个对象通常由 `React.createElement()` 函数创建,或者通过 JSX 语法糖自动生成。每个 `ReactElement` 都有一个 `type` 属性(可以是字符串表示的 HTML 标签名、自定义组件或特殊类型如 Fragment)以及一组 `props` 属性。例如,在定义 AvatarList 组件时,其 children 属性被指定为 `React.ReactElement<AvatarItemProps>` 或者该类型的数组,这意味着它可以接受特定类型的单个元素或多个元素作为子节点 [^3]。 ```typescript export interface AvatarListProps { Item?: React.ReactElement<AvatarItemProps>; // ... children: React.ReactElement<AvatarItemProps> | React.ReactElement<AvatarItemProps>[]; } ``` 另一方面,`React.FC`(FunctionComponent 的缩写)是用来描述函数组件的一种泛型接口。它接收一个 props 参数,并返回一个 `ReactElement` 或 `null`。简单来说,`React.FC` 是一种用来声明函数组件的方式,其中 P 泛型参数代表了组件期望接收的属性类型。以下是一个简化的 `React.FC` 定义: ```typescript type FC<P = {}> = FunctionComponent<P>; interface FunctionComponent<P = {}> { (props: PropsWithChildren<P>, context?: any): ReactElement | null; // 其他静态属性... } ``` 因此,当开发者编写一个函数组件并希望明确地表明这是一个 React 函数组件时,可以选择使用 `React.FC` 类型来标注组件的类型,这样不仅提供了更好的类型推断支持,也使得组件签名更加清晰 [^2]。 ```tsx const MyComponent: React.FC<{ message: string }> = ({ message }) => { return <div>{message}</div>; }; ``` 总结两者之间的关系:`ReactElement` 是实际渲染到屏幕上的不可变数据结构,而 `React.FC` 则是用于构建这些元素的蓝图或工厂函数。`React.FC` 在调用时会生成 `ReactElement` 实例,这些实例随后会被 React 渲染器处理以更新用户界面 [^1]。 ---
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值