当前位置: 首页 > news >正文

[react 18+] 定义页面组件时的三种申明区分

  1. function MyComponent({ name }: { name: string })
  2. const MyComponent = ({ name }: { name: string })
  3. const MyComponent: FC<{ name: string }> = ({ name })

这三种写法在功能上是等价的,都能正确渲染组件,但在 TypeScript 类型检查、代码风格 和 可扩展性 上有一些区别:

1. export default function 直接声明(内联 Props 类型)

function MyComponent({ name }: { name: string }) {return <div>{name}</div>;
}export default MyComponent

✅ 特点:

  • 最简洁:适合简单组件,props 类型直接内联
  • 无额外导入:不需要 import { FC }
  • 适合:不需要复用 props 类型或扩展的简单组件


2. const 箭头函数 + 解构 Props(分离 Props 类型)

interface Props {name: string;
}const MyComponent = ({ name }: Props) => {return <div>{name}</div>;
};export default MyComponent;

✅ 特点:

  • 类型可复用:Props 接口可被其他组件复用
  • 更易扩展:添加新 props 时只需修改 interface
  • 显式命名:Props 让类型定义更清晰
  • 适合:中等复杂度的组件


3. FC 泛型写法(React 传统风格)

import { FC } from 'react';const MyComponent: FC<{ name: string }> = ({ name }) => {return <div>{name}</div>;
};export default MyComponent;

✅ 特点:

  • 显式类型标注:明确声明这是一个函数组件
  • 历史原因:React 早期推荐写法(现在已非必须)
  • 自动包含 children:在 React 17 及之前,FC 会默认添加 children?: ReactNode(React 18 已移除)
  • 适合:需要兼容旧代码或团队规范要求时


🔍 关键区别总结

🚀 现代 React + TypeScript 最佳实践建议


1. 简单组件:直接用 export default function + 内联 props(快速原型开发)

export default function Button({ text }: { text: string }) {return <button>{text}</button>;
}


2. 复杂组件:用 const + 独立 interface(清晰且可扩展)

interface UserCardProps {name: string;age: number;onFollow?: () => void;
}const UserCard = ({ name, age, onFollow }: UserCardProps) => {return <div>{name}, {age}</div>;
};


3. 需要 children:手动声明(React 18+ 统一方式)

interface LayoutProps {children: React.ReactNode;
}const Layout = ({ children }: LayoutProps) => {return <div className="container">{children}</div>;
};


4. 避免 FC:除非团队规范要求或维护旧代码


⚠️ 特别注意

  • React 18 后:FC 不再自动包含 children 类型,它的优势已不明显
  • 性能:三种写法编译后完全一致,无运行时差异
  • 一致性:项目中最好统一一种风格
http://www.dtcms.com/a/134176.html

相关文章:

  • 定义AIDL 接口
  • 前端 React 弹窗式 滑动验证码实现
  • 【教程】PyTorch多机多卡分布式训练的参数说明 | 附通用启动脚本
  • 网盘文件下载功能需求分析与技术方案选择:全面解析与最佳实践
  • windows修改远程端口
  • OCP中的OCS operator介绍及应用示例
  • 如何将 Vue-FastAPI-Admin 项目的数据库从 SQLite 切换到 MySQL?
  • 量子纠缠物理本质、技术实现、应用场景及前沿研究
  • Web三漏洞学习(其一:文件上传漏洞)
  • 25.4.15学习总结
  • 代码随想录第18天:二叉树
  • 04-Seata 深度解析:从分布式事务原理到 Seata 实战落地
  • Arduino+ESP826601s模块连接阿里云并实现温湿度数据上报
  • 【leetcode hot 100 72】编辑距离
  • MCP认证难题破解指南
  • 单片机非耦合业务逻辑框架
  • Sentinel源码—2.Context和处理链的初始化二
  • (51单片机)LCD显示日期时间时钟(DS1302时钟模块教学)(LCD1602教程)
  • STM32提高篇: 以太网通讯
  • S06-Kep的跨通道传输
  • 二极管详解:特性参数、选型要点与分类
  • 【正点原子STM32MP257连载】第四章 ATK-DLMP257B功能测试——CAN、CAN FD测试 #FDCAN
  • Qt/C++学习系列之QTreeWidget的简单使用记录
  • IPD项目管理的“黄金三角“在2025年是否需要重构?
  • 基于RV1126开发板获取系统温度
  • WPS Office安卓版文档编辑功能与兼容性评测【高效编辑】
  • uniappx项目上架各手机平台
  • Uniapp:消息提示框
  • vue3 vite创建项目 vite配置、pinia配置
  • 经典算法 判断一个图中是否有环