我的代码类似于以下内容:
const HOC = (props, WrappedComponent) => {
return (
<>
<WrappedComponent />
<Icon className="props.iconStyles" />
</>
);
};
这实际上不是有效的代码,但是您可以希望看到我要完成的工作。我希望能够通过以下方式使用它:
<HOC iconStyles="icon-stuff">
<TheComponentIWantToWrap>
</HOC>
如何正确编写此文字,以便能够传递道具?我想我可能还需要在这里使用children
,但不确定。
答案 0 :(得分:2)
高阶组件将返回另一个组件(在这种情况下为另一个函数)。组件是返回JSX的函数。
const HOC = (Component) => {
return function WrappedComponent(props) {
return (
<>
<Component {...props} />
<Icon className="props.iconStyles" />
</>
);
};
};
答案 1 :(得分:2)
就是这样。
const HOC = (WrappedComponent) => {
const MyComponent = props => {
return (
<>
<WrappedComponent {...props} />
<Icon className={props.iconStyles} />
</>
);
}
return MyComponent;
};
答案 2 :(得分:2)
HOC
是一个函数,它返回一个Component
,通常会在其上注入一些props
。您应该分开关注。实际的HOC
应该看起来像这样
const withFoo = Component =>{
return props =>{
return <Component injectedProps='foo' />
}
}
像这样被叫
const Component = withFoo(({ injectedProps }) =>{
return <jsx />
})
如果您也想合并任意props
,请尝试将传递到props
的{{1}}传播出去
Component
如果愿意,可以创建附加图层。
const withFoo = Wrapped =>{
return props =>{
return <Wrapped injectedProps='foo' {...props}/>
}
}
<Component propsToBeSpreaded='bar' />
在HOC
中注入了一些道具Container
接受任意Container
props
呈现Container
代码
children
像这样称呼
const withHoc = Container =>{
return () => <Container injected='foo' />
}
const Container = withHoc(({ children, injected, ...aditionalProps}) =>{
return(
<div {...aditionalProps}>
{ children }
</div>
)
})
答案 3 :(得分:1)
您仍然可以将道具和要增强的组件一起传递(按照您认为是错误的原始方法),因为-
HOC并非React API的一部分。它们来自React的组成性质。
所以您的HOC用法是-
const EnhancedComponent = higherOrderComponent(WrappedComponent, anyProps);
注意事项:
const higherOrderComponent = (WrappedComponent, anyProps) => {
return class extends React.Component {
// Component body
}
}
const higherOrderComponent = (WrappedComponent, anyProps) => {
return class extends React.Component {
render() {
const { HOCProp, ...compProps } = this.props;
return (
<WrappedComponent
...compProps,
someProp={anyProps.someProp}
/>
);
}
}
}
考虑所有这些,您的HOC如下所示-
const withWrappedIcon = (CompToWrap, iconStyle) => {
return (
<Icon className={iconStyle}>
<CompToWrap />
</Icon>
);
}