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

【React】常见的 HOC 使用案例

高阶组件(Higher-Order Component,HOC)是一种用于在 React 中复用组件逻辑的技术。以下是几个常见的 HOC 使用案例,以及详细的代码示例。

1. 日志记录 HOC

这个高阶组件将在每次组件更新时记录日志。

LoggingHOC.js
import React from 'react';const withLogging = (WrappedComponent) => {return class extends React.Component {componentDidMount() {console.log(`${WrappedComponent.name} mounted`);}componentDidUpdate() {console.log(`${WrappedComponent.name} updated`);}componentWillUnmount() {console.log(`${WrappedComponent.name} will unmount`);}render() {return <WrappedComponent {...this.props} />;}};
};export default withLogging;
使用日志记录 HOC
// src/App.js
import React from 'react';
import withLogging from './LoggingHOC';const MyComponent = () => {return <div>My Component</div>;
};const LoggedMyComponent = withLogging(MyComponent);const App = () => {return (<div><LoggedMyComponent /></div>);
};export default App;

2. 数据获取 HOC

这个高阶组件在组件挂载时从一个 API 获取数据,并将数据传递给被包装的组件。

FetchDataHOC.js
import React from 'react';const withFetchData = (url) => (WrappedComponent) => {return class extends React.Component {state = {data: null,loading: true,error: null,};async componentDidMount() {try {const response = await fetch(url);const data = await response.json();this.setState({ data, loading: false });} catch (error) {this.setState({ error, loading: false });}}render() {const { data, loading, error } = this.state;return <WrappedComponent data={data} loading={loading} error={error} {...this.props} />;}};
};export default withFetchData;
使用数据获取 HOC
// src/App.js
import React from 'react';
import withFetchData from './FetchDataHOC';const DataComponent = ({ data, loading, error }) => {if (loading) return <div>Loading...</div>;if (error) return <div>Error: {error.message}</div>;return <div>Data: {JSON.stringify(data)}</div>;
};const FetchDataComponent = withFetchData('https://api.example.com/data')(DataComponent);const App = () => {return (<div><FetchDataComponent /></div>);
};export default App;

3. 权限控制 HOC

这个高阶组件根据用户权限来控制组件的渲染。

withAuthorization.js
import React from 'react';const withAuthorization = (requiredRole) => (WrappedComponent) => {return class extends React.Component {render() {const { user } = this.props;if (user.role !== requiredRole) {return <div>You do not have permission to view this page</div>;}return <WrappedComponent {...this.props} />;}};
};export default withAuthorization;
使用权限控制 HOC
// src/App.js
import React from 'react';
import withAuthorization from './withAuthorization';const AdminPage = () => {return <div>Admin Page</div>;
};const AuthorizedAdminPage = withAuthorization('admin')(AdminPage);const App = () => {const user = { role: 'user' }; // change to 'admin' to see the pagereturn (<div><AuthorizedAdminPage user={user} /></div>);
};export default App;

4. 动态样式 HOC

这个高阶组件根据 props 动态添加样式。

withDynamicStyles.js
import React from 'react';const withDynamicStyles = (WrappedComponent) => {return class extends React.Component {render() {const style = {color: this.props.color || 'black',fontSize: this.props.fontSize || '16px',};return <WrappedComponent {...this.props} style={style} />;}};
};export default withDynamicStyles;
使用动态样式 HOC
// src/App.js
import React from 'react';
import withDynamicStyles from './withDynamicStyles';const StyledComponent = ({ style }) => {return <div style={style}>Styled Component</div>;
};const DynamicStyledComponent = withDynamicStyles(StyledComponent);const App = () => {return (<div><DynamicStyledComponent color="red" fontSize="20px" /></div>);
};export default App;

总结

高阶组件是一种强大的模式,可以在 React 中实现代码复用和逻辑抽象。通过高阶组件,你可以:

  • 提取和重用跨组件的逻辑
  • 控制组件的渲染
  • 操作传递给组件的 props
  • 管理和注入状态

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Qt Designer,仿作一个ui界面的练习(一):界面的基本布局
  • Unity四元数线性插值Lerp
  • C++篇:入门(2)
  • 重磅更新||Pyside6|Pyqt实现处理GUI界面获取的数据时进度条同步更新
  • 第一个 Flask 项目
  • 第十二节、人物下蹲
  • 生产力工具|vscode for mac安装及过程留存
  • 探索哈希表:C++中的实现与操作详解【Map、Set、数据结构】
  • 【Python学习手册(第四版)】学习笔记13.1-while、for循环
  • C++的STL简介(一)
  • R语言统计分析——描述性统计
  • YUM软件包管理工具:更改YUM源、配置本地YUM仓库
  • 前端学习AI历程
  • 计算机基础(Windows 10+Office 2016)教程 —— 第8章 多媒体技术及应用
  • Cursor搭配cmake实现C++程序的编译、运行和调试
  • classpath对获取配置文件的影响
  • Cookie 在前端中的实践
  • create-react-app做的留言板
  • crontab执行失败的多种原因
  • Git初体验
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • IndexedDB
  • IOS评论框不贴底(ios12新bug)
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • JavaScript 一些 DOM 的知识点
  • PhantomJS 安装
  • python学习笔记 - ThreadLocal
  • 阿里云前端周刊 - 第 26 期
  • 初探 Vue 生命周期和钩子函数
  • 对象管理器(defineProperty)学习笔记
  • 简析gRPC client 连接管理
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 力扣(LeetCode)965
  • 那些被忽略的 JavaScript 数组方法细节
  • 你真的知道 == 和 equals 的区别吗?
  • 七牛云假注销小指南
  • 前端技术周刊 2019-02-11 Serverless
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (2020)Java后端开发----(面试题和笔试题)
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (四)鸿鹄云架构一服务注册中心
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)nsfocus-绿盟科技笔试题目
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • *p++,*(p++),*++p,(*p)++区别?
  • .DFS.
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • @Autowired注解的实现原理
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • @synthesize和@dynamic分别有什么作用?
  • [C#]科学计数法(scientific notation)显示为正常数字