React常见的 HOC 使用案例及示例代码

 更新时间:2024年08月08日 10:31:03   作者:cangloe  
高阶组件(Higher-Order Component,HOC)是一种用于在 React 中复用组件逻辑的技术,这篇文章主要介绍了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
  • 管理和注入状态

到此这篇关于React常见的 HOC 使用案例的文章就介绍到这了,更多相关React HOC 使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • react使用antd-design中select不能及时刷新问题及解决

    react使用antd-design中select不能及时刷新问题及解决

    这篇文章主要介绍了react使用antd-design中select不能及时刷新问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • React报错之Object is possibly null的问题及解决方法

    React报错之Object is possibly null的问题及解决方法

    这篇文章主要介绍了React报错之Object is possibly null的问题,造成 "Object is possibly null"的错误是因为useRef()钩子可以传递一个初始值作为参数,而我们传递null作为初始值,本文给大家分享详细解决方法,需要的朋友可以参考下
    2022-07-07
  • React样式冲突解决问题的方法

    React样式冲突解决问题的方法

    本文主要介绍了React样式冲突解决问题的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • React中组件的this.state和setState的区别

    React中组件的this.state和setState的区别

    在React开发中,this.state用于初始化和读取组件状态,而setState()用于安全地更新状态,正确使用这两者对于管理React组件状态至关重要,避免性能问题和常见错误
    2024-09-09
  • React项目中className运用及问题解决

    React项目中className运用及问题解决

    这篇文章主要为大家介绍了React项目中className运用及问题解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • react中如何使用监听

    react中如何使用监听

    在 React 中,您可以使用 addEventListener 函数来监听事件,本文通过实例代码给大家介绍react中如何使用监听,感兴趣的朋友跟随小编一起看看吧
    2023-10-10
  • React onClick/onChange传参(bind绑定)问题

    React onClick/onChange传参(bind绑定)问题

    这篇文章主要介绍了React onClick/onChange传参(bind绑定)问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 浅谈React和Redux的连接react-redux

    浅谈React和Redux的连接react-redux

    本篇文章主要介绍了浅谈React和Redux的连接react-redux,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • react 移动端实现列表左滑删除的示例代码

    react 移动端实现列表左滑删除的示例代码

    这篇文章主要介绍了react 移动端实现列表左滑删除的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • 一文教你如何避免React中常见的8个错误

    一文教你如何避免React中常见的8个错误

    这篇文章主要来和大家一起分享在 React 开发中常见的一些错误,以及如何避免这些错误,理解这些问题背后的细节,防止犯下类似的错误,需要的可以参考下
    2023-12-12

最新评论