【发布时间】: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