【问题标题】:Unable to use hook in HOC for functional component无法在 HOC 中将钩子用于功能组件
【发布时间】:2020-07-24 21:40:03
【问题描述】:

使用 HOC 渲染功能组件,即。这里的 SampleComponent 对我有用。

const SampleComponent: FC = () => {
  return (<div>Hello World</div>);
};

export default HOC({ component: SampleComponent });

而 HOC 是->

const HOC = ({ component: Component }) => {
  return (() => <Component/>);
}

但是我想有条件地渲染这个组件,就像这样-

<div> 
{!id ? ( <SomeOtherComponent prop1={'hello'} prop2={'world'} /> ) : ( <Component /> )}
</div>

这里的 id 是来自 graphql 查询钩子的响应,我再次无法在 HOC 函数中使用它。

【问题讨论】:

    标签: reactjs react-hooks higher-order-components


    【解决方案1】:

    对于初学者来说,钩子旨在替代 HOC。

    但是,您绝对可以在作为功能组件的 HOC 中使用钩子。唯一需要确保的是,您在渲染的组件中使用钩子,而不是函数。

    例如使用下面这样的钩子是不正确的,因为你不渲染 HOC 组件而是像 const X = HOC(Component); 那样使用它

    const HOC = ({ component: Component }) => { 
      const id = useQuery(query);
      return (() => <Component/>);
    }
    

    正确的做法是

    const HOC = ({ component: Component }) => {
      return () => {
         const id = useQuery(query);
         return (<div> 
             {!id ? ( <SomeOtherComponent prop1={'hello'} prop2={'world'} /> ) : ( <Component /> )}
         </div>)
      }
    }
    

    Working sample demo

    但是,当您像上面那样实现它时,您可能会收到 ESLINT 警告,因为 ESLINT 还不够智能,无法检测组件的使用方式。 您可以禁用此类情况的警告

    【讨论】:

    • 这不起作用,出现错误-> 无法在回调中调用 React 挂钩 useQuery()。必须在 react 功能组件内调用 React hooks 或 react 自定义 hook 函数
    • @Prernashah 您可能会收到警告,因为 ESLINT 不够智能,无法检测到您正在尝试做什么。我添加了一个工作示例演示来证明它确实有效。您可以禁用此类情况的警告
    • @Prernashah 您可能会收到警告,因为 ESLINT 不够智能,无法检测到您正在尝试做什么。我添加了一个工作示例演示来证明它确实有效。您可以禁用此类情况的警告
    • 同样在测试 HOC vi React 测试库时,遇到同样的问题 React hooks 必须在 react 功能组件中调用或者 react 自定义 hook 函数。你知道如何解决这个问题吗?
    猜你喜欢
    • 2021-04-07
    • 2020-01-11
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 2019-12-29
    • 2019-08-08
    • 2020-12-21
    • 1970-01-01
    相关资源
    最近更新 更多