我的高阶组件有问题。我正在尝试将<Layout />组件中的道具传递到路线(React Router v4)上。路线中指定的组件由HOC包装,但我传递的道具从未到达组件。
<Layout />
另外,如果不使用,我将无法使用HOC export default () => MyHOC(MyComponent)。我不知道为什么,但这可能与它有关?
export default () => MyHOC(MyComponent)
Layout.js
const Layout = ({ location, initialData, routeData, authenticateUser }) => ( <Wrapper> <Container> <Switch> // how do I get these props passed through the HOC? render instead of component made no difference. <Route exact path="/pages/page-one" component={() => <PageOne routeData={routeData} title="PageOne" />} /> <Route exact path="/pages/page-two" component={() => <PageTwo routeData={routeData} title="PageTwo" />} /> <Route component={NotFound} /> </Switch> </Container> </Wrapper> ) export default Layout
Page.js
// I've tried swapping to (WrappedComponent) => (props) without success const Page = (props) => (WrappedComponent) => { const renderHeader = props.header ? <Header title={props.headerTitle} /> : false return ( <Wrapper> {renderHeader} <Container withHeader={props.header}> <WrappedComponent /> </Container> </Wrapper> ) } export default Page
PageOne.js
class PageOne extends React.Component { render() { return ( <Content> <Title>{this.props.title}</Title> // <----- not working! {JSON.stringify(this.props.routeData, null, 4)} // <---- not working! </Content> ) } } export default () => Page({ header: true, headerTitle: 'header title' })(PageOne) // does not work without () => Page // when using just export default Page I get the "Invariant Violation: Element type is invalid: // expected a string (for built-in components) or a class/function (for composite components) // but got: object. Check the render method of Route." error.
您还需要一个箭头才能成为PageHOC。它需要参数,包装的组件,并且必须返回一个组件。你的被渲染后WrappedComponent
Page
WrappedComponent
const Page = (props) => (WrappedComponent) => (moreProps) => { const renderHeader = props.header ? <Header title={props.headerTitle} /> : false return ( <Wrapper> {renderHeader} <Container withHeader={props.header}> <WrappedComponent {...moreProps} /> </Container> </Wrapper> ) }
现在您可以像这样使用它
export default Page({ header: true, headerTitle: 'header title' })(PageOne)