• 【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 page
      return (
        <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
    • 管理和注入状态
  • 相关阅读:
    【JAVA】06 封装、继承、多态 总结(初级)
    算法-贪心-112. 雷达设备
    Mac电脑安装Zulu Open JDK 8 使用 spring-kafka 消费不到Kafka Partition中的消息
    Linux服务器自定义登陆提示信息
    js 常见报错 | js 获取数据类型 | js 判断是否是数组
    探索SPI:深入理解原理、源码与应用场景
    软考下午题第1题——数据流,题目分析与案例解析:
    pdf生成:puppeteer
    面向对象的三大特性之——封装
    【手把手教你写Go】03.基本数据类型
  • 原文地址:https://blog.csdn.net/u013675821/article/details/140591599