【问题标题】:Pass a Component with props, inside a Higher-Order-Component (HOC)在高阶组件 (HOC) 中传递带有道具的组件
【发布时间】:2020-07-30 12:55:45
【问题描述】:

我参考了这个创建 React 高阶组件的示例,taken from this article。

我正在努力完全理解和利用这个 HOC。

interface PopupOnHoverPropType {
  hoverDisplay: string;
}

const WithPopupOnHover = <P extends object>(BaseComponent: React.FC<P>): React.FC<P & PopupOnHoverPropType> => ({ hoverDisplay, ...props }: PopupOnHoverPropType) => {

  const [displayMsg, setDisplayMsg] = useState<boolean>(false);
  const toggleDisplayMsg = () => {
    setDisplayMsg(displayMsg);
  };
  return (
    <div onMouseEnter={() => setDisplayMsg(true)}>
      <div className={`${hoverDisplay} popup`} onClick={toggleDisplayMsg}/>
      <BaseComponent {...props as P} />
    </div>
  )
};

我对上面代码的理解是这样的:

我们定义了一个名为WithPopupOnHover的HOC, 它需要一个 React 组件(BaseComponent)。 BaseComponent 自带 props(简称 P) 它返回一个新的 React 组件, 这需要道具 P 和 PopupOnHoverPropType 中的道具。

如何使用这个 HOC? 以下尝试给出了一个 typescript 错误,即传入了太多参数:

  const enhanced = WithPopupOnHover(Modal);
  const m = Enhanced(a,b,c, "up");

Modal React 组件具有以下 props 结构:

const Modal: React.FC<{
  a: string;
  b(): void;
  c(locationData: customType): void;
}> = { ... }

【问题讨论】:

  • 哪个错误? WithPopupOnHover?或Enhanced,不管那是什么?

标签: javascript reactjs typescript higher-order-functions higher-order-components


【解决方案1】:

看起来你只是忘记了对象括号。 React 组件都采用一个 props 对象参数。

const Enhanced = WithPopupOnHover(Modal);
const m = Enhanced({ a, b, c });

【讨论】:

  • 谢谢你,做到了。如果我可以问,请您查看代码的解释以及是否正确?谢谢
  • @Kayote 当然可以,但是您想要查看什么“代码解释”?
  • 在上面的问题中,就在第一块代码的下方,我从这里开始:Here is what my understanding of the above code is: 谢谢。
  • @Kayote 是的,本质上就是这个想法。您链接的那篇文章很好地描述了 HOC 的类型。
猜你喜欢
  • 1970-01-01
  • 2021-04-14
  • 2020-11-09
  • 2018-09-14
  • 2018-08-22
  • 2018-04-03
  • 2019-10-31
  • 1970-01-01
  • 2020-08-09
相关资源
最近更新 更多