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

React 高阶组件

在 React 中,高阶组件(Higher-Order Component,简称 HOC)是一种高级技巧,用于复用组件逻辑。它是一个函数,接收一个组件作为参数,并返回一个新的增强组件。

概念

  • 本质是一个函数,不是组件
  • 接收一个组件作为参数
  • 返回一个新的组件
  • 新组件拥有原组件的功能,同时增加了新功能

用途

  1. 代码复用
  2. 逻辑抽象
  3. Props 增强
  4. 生命周期劫持

示例

下面是一个简单的高阶组件示例,用于给组件添加加载状态:

// 高阶组件:添加加载状态
function withLoading(Component) {// 返回一个新组件return function (props) {// 如果正在加载,显示加载提示if (props.isLoading) {return <div>Loading...</div>;}// 否则传递所有 props 给原组件return <Component {...props} />;};
}// 普通组件
function UserList({ users }) {return (<ul>{users.map(user => (<li key={user.id}>{user.name}</li>))}</ul>);
}// 使用高阶组件增强 UserList
const UserListWithLoading = withLoading(UserList);// 使用增强后的组件
function App() {const [users, setUsers] = useState([]);const [isLoading, setIsLoading] = useState(true);useEffect(() => {// 模拟数据加载setTimeout(() => {setUsers([{ id: 1, name: 'John' },{ id: 2, name: 'Jane' }]);setIsLoading(false);}, 2000);}, []);return <UserListWithLoading users={users} isLoading={isLoading} />;
}

注意事项

  1. 不要在渲染方法中使用高阶组件,这会导致每次渲染都创建新组件,引发性能问题和状态丢失
  2. 传递不相关的 props,确保高阶组件只处理它关心的 props,其余的应传递给被包装组件
  3. 包装显示名称,为了调试方便,可以设置新组件的 displayName
  4. 不要在高阶组件内部修改原组件,应该使用组合的方式

带参数的高阶组件

高阶组件还可以接收额外的参数,增加灵活性:

// 带参数的高阶组件
function withData(url) {return function (Component) {return function (props) {const [data, setData] = useState(null);const [isLoading, setIsLoading] = useState(true);useEffect(() => {fetch(url).then(response => response.json()).then(data => {setData(data);setIsLoading(false);});}, [url]);if (isLoading) return <div>Loading...</div>;return <Component data={data} {...props} />;};};
}// 使用带参数的高阶组件
const UserListWithData = withData('/api/users')(UserList);
http://www.xdnf.cn/news/18716.html

相关文章:

  • 服务器初始化
  • APM 系列(一):Skywalking 与 Easyearch 集成
  • 如何在项目中集成XXL-JOB
  • 在线提取维基百科Wikipedia文章页面及离线批处理Wikipedia XML Dump文件
  • 通信中间件 Fast DDS(二) :详细介绍
  • 安卓Android低功耗蓝牙BLE连接异常报错133
  • 计算机实习经历包装/编写
  • 嵌入式系统学习Day22(进程)
  • STL——vector的使用(快速入门详细)
  • Ansible自动化运维介绍与安装
  • 信贷模型域——清收阶段模型(贷后模型)
  • 简述mysql中索引类型有哪些,以及对数据库的性能的影响?
  • QML中的QtObject
  • C# NX二次开发:绘图区控件和指定矢量控件详解
  • vscode--快捷键
  • 【Android 16】Android W 的冻结机制框架层分析
  • QT新建文件或者项目解释:那些模板分别是什么意思?
  • 音视频学习(五十七):RTSP信令交互流程
  • 华为云Stack环境中计算资源,存储资源,网络资源发放前的准备工作(中篇)
  • Spring Boot 结合 Jasypt 实现敏感信息加密(含 Nacos 配置关联思路)
  • Odoo 非标项目型生产行业解决方案:专业、完整、开源
  • 生成式AI的崛起
  • 俄罗斯情报机构推出新型安卓恶意软件,伪装成杀毒软件
  • Fluent Bit系列:字符集转码测试(下)
  • 蛋白质结构信息学大纲
  • Android横竖屏切换的“数据保卫战”:如何优雅地保存和恢复表单数据
  • 深入浅出 Java 多态:从原理到实践的全面解析
  • 程序的“烽火台”:信号的产生与传递
  • 使用 NetworkManager 管理 Wi-Fi 热点
  • 【动态规划】卡特兰数