React 常用高阶组件使用

ops/2025/1/14 1:13:33/

在 React 中,常用的高阶组件(HOC)模式包括增强组件功能、复用逻辑等。它们是接受一个组件并返回一个新组件的函数。高阶组件让我们在不修改原始组件的情况下,扩展组件功能。以下是几个常见的高阶组件的示例:

1. withLoading(加载状态)

withLoading 用于在组件加载数据时显示一个加载指示器。

示例:
javascript">import React, { useState, useEffect } from 'react';const withLoading = (fetchData) => (WrappedComponent) => {return (props) => {const [state, setState] = useState({ loading: true, data: null, error: null });useEffect(() => {fetchData().then(data => setState({ loading: false, data })).catch(error => setState({ loading: false, error }));}, [fetchData]);if (state.loading) return <div>加载中...</div>;if (state.error) return <div>加载失败</div>;return <WrappedComponent {...props} data={state.data} />;};
};export default withLoading;
使用:
javascript">import React from 'react';
import withLoading from './withLoading';const fetchUserData = ({ data }) => fetch('/api/user').then(res => res.json());
const UserProfile = () => <div>姓名:{data.name}</div>;export default withLoading(fetchUserData)(UserProfile);

2. withErrorBoundary(错误边界)

withErrorBoundary 用于捕获组件渲染过程中的错误,并显示错误信息。

示例:
javascript">import React, { Component } from 'react';const withErrorBoundary = (WrappedComponent) => {return class extends Component {state = { hasError: false };static getDerivedStateFromError() {return { hasError: true };}render() {return this.state.hasError ? <div>出了点问题!</div> : <WrappedComponent {...this.props} />;}};
};export default withErrorBoundary;
使用:
javascript">import React, { useState, useEffect } from 'react';
import withErrorBoundary from './withErrorBoundary';const fetchUserData = () => fetch('/api/user').then(res => res.json());const UserProfile = () => {const [data, setData] = useState(null);useEffect(() => {fetchUserData().then(setData).catch(console.error);}, []);return data ? <h1>{data.name}</h1> : '加载失败';
};export default withErrorBoundary(UserProfile);

3. withAuth(权限控制)

withAuth 用于检查用户是否登录或有权限访问某个页面。

示例:
javascript">import React, { useState, useEffect } from 'react';
import { Redirect } from 'react-router-dom';const checkAuthStatus = () => fetch('/api/check-auth').then(res => res.json());const withAuth = (WrappedComponent) => {return (props) => {const [isAuthenticated, setIsAuthenticated] = useState(null);useEffect(() => { checkAuthStatus().then(setIsAuthenticated); }, []);if (isAuthenticated === null) return <div>验证中...</div>;if (!isAuthenticated) return <Redirect to="/login" />;return <WrappedComponent {...props} />;};
};export default withAuth;
使用:
javascript">import React from 'react';
import withAuth from './withAuth';const Dashboard = () => <div>欢迎来到仪表盘</div>;export default withAuth(Dashboard);

4. withTheme(主题支持)

withTheme 用于为组件提供主题样式或样式变量。

示例:
javascript">import React from 'react';const withTheme = (WrappedComponent) => {return (props) => {const theme = { backgroundColor: 'lightblue', color: 'darkblue' };return <div style={theme}><WrappedComponent {...props} /></div>;};
};export default withTheme;
使用:
javascript">import React from 'react';
import withTheme from './withTheme';const ThemedComponent = () => <div>这是一个主题组件!</div>;export default withTheme(ThemedComponent);

5. withWindowSize(窗口尺寸)

withWindowSize 用于获取并传递当前窗口的尺寸信息。

示例:
javascript">import React, { useState, useEffect } from 'react';const getWindowSize = () => ({ width: window.innerWidth, height: window.innerHeight });const withWindowSize = (WrappedComponent) => {return (props) => {const [size, setSize] = useState(getWindowSize());useEffect(() => {const handleResize = () => setSize(getWindowSize());window.addEventListener('resize', handleResize);return () => window.removeEventListener('resize', handleResize);}, []);return <WrappedComponent {...props} windowSize={size} />;};
};export default withWindowSize;
使用:
javascript">import React from 'react';
import withWindowSize from './withWindowSize';const ResponsiveNavbar = ({ windowSize }) => {const isMobile = windowSize.width < 600;return (<nav style={{ backgroundColor: isMobile ? 'lightblue' : 'darkblue' }}><p>{isMobile ? '移动端导航' : '桌面端导航'}</p></nav>);
};export default withWindowSize(ResponsiveNavbar);

6. withRouter(React Router)

withRouter 是 React Router 提供的 HOC,使组件能够访问路由信息(如路径、历史记录、路由参数等)。

示例:
javascript">import React from 'react';
import { withRouter } from 'react-router-dom';const FormPage = ({ location, history }) => ();const FormPage = ({ location, history }) => (<div><p>当前路径: {location.pathname}</p><button onClick={() => history.push('/new-path')}>跳转</button></div>
);export default withRouter(FormPage);

7. connect(Redux)

connectreact-redux 提供的,用于将 Redux 的 state 和 actions 绑定到组件的 props。

示例:
javascript">import React from 'react';
import { connect } from 'react-redux';
import { increment } from './actions';const Cart = ({ cart, increment }) => (<div>{cart.map(item => (<li key={item.id}>{item.name} - {item.quantity}<button onClick={() => increment(item.id)}>增加</button></li>))}</div>
);const mapStateToProps = (state) => ({ cart: state.cart });
const mapDispatchToProps = { increment };export default connect(mapStateToProps, mapDispatchToProps)(Cart);

总结

高阶组件(HOC)在 React 中提供了一种灵活的方式来复用逻辑并增强组件功能,提升代码复用性和可维护性。以下是常见的 HOC 示例:

  • withLoading:显示加载状态。
  • withErrorBoundary:捕获渲染错误。
  • withAuth:实现权限控制。
  • withTheme:提供主题样式。
  • withWindowSize:获取窗口尺寸。
  • withRouter:访问路由信息。
  • connect:连接 Redux 状态和 actions。

http://www.ppmy.cn/ops/149873.html

相关文章

【Ubuntu与Linux操作系统:十二、LAMP平台与PHP开发环境】

第12章 LAMP平台与PHP开发环境 12.1 LAMP安装与配置 LAMP简介 LAMP 是一种经典的开源 Web 开发平台&#xff0c;代表 Linux&#xff08;操作系统&#xff09;、Apache&#xff08;Web 服务器&#xff09;、MySQL&#xff08;数据库管理系统&#xff09;和 PHP&#xff08;脚本…

如何在 IDEA 中配置 npm ?

在 IntelliJ IDEA 或其他基于 IntelliJ 的 IDE&#xff08;如 WebStorm&#xff09;中配置 npm 主要涉及以下几个步骤。这些步骤将帮助你确保项目可以正确使用 npm 来管理依赖项和运行脚本。 1. 安装 Node.js 和 npm 首先&#xff0c;确保你的计算机上已经安装了 Node.js 和 …

STM32内置Flash

一、原理 利用flash存储用户数据需要注意查看&#xff0c;用户数据是否会覆盖芯片运行程序。 IAP&#xff08;在程序中编程&#xff09;利用程序修改程序本身&#xff0c;和OTA是一个原理。IAP在程序中编程支持任意一种通信下载。 ICP&#xff08;在电路中编程&#xff0c;通…

【开源免费】基于Vue和SpringBoot的城镇保障性住房管理系统(附论文)

本文项目编号 T 122 &#xff0c;文末自助获取源码 \color{red}{T122&#xff0c;文末自助获取源码} T122&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

FinGPT:通过传播意识和上下文增强的LLM提升基于情感的股票走势预测

“FinGPT: Enhancing Sentiment-Based Stock Movement Prediction with Dissemination-Aware and Context-Enriched LLMs” 论文地址&#xff1a;https://arxiv.org/pdf/2412.10823 摘要 金融情感分析对于解读新闻如何影响股价具有关键作用&#xff0c;大型语言模型&#xff…

【Ubuntu与Linux操作系统:十一、Java与Android应用开发】

第11章 Java与Android应用开发 11.1 Java开发 Java是一种广泛使用的面向对象编程语言&#xff0c;以其平台无关性和强大的生态系统而闻名。它在Android开发中占据重要地位&#xff0c;同时也是企业级应用和服务器开发的首选语言。 1. Java语言的特点 跨平台性&#xff1a;Ja…

Spring 中的常用注解

Spring 作为 Java 企业级开发中最广泛使用的框架之一&#xff0c;以其强大的功能和灵活性为开发者提供了高效的开发体验。在 Spring 中&#xff0c;注解&#xff08;Annotation&#xff09;是其核心机制之一&#xff0c;它简化了配置文件的繁琐操作&#xff0c;通过声明的方式实…

车载音频开发(二):对音频数据作音量调节

通过前一个章节打下的基础车载音频开发&#xff08;一&#xff09;&#xff1a;从看懂wav开始https://blog.csdn.net/Hellomino_/article/details/140873133?fromshareblogdetail&sharetypeblogdetail&sharerId140873133&sharereferPC&sharesourceHellomino_&…