【问题标题】:Pass props through a higher order component from a Route通过 Route 中的高阶组件传递 props
【发布时间】:2017-11-25 10:11:45
【问题描述】:

我的高阶组件有问题。我正在尝试将来自<Layout /> 组件的道具沿路线传递(React Router v4)。路由中指定的组件由 HOC 包装,但我传递的道具永远不会到达组件。

另外,如果不使用export default () => MyHOC(MyComponent),我将无法使用 HOC。我不知道为什么,但这可能与它有关?

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.

【问题讨论】:

    标签: javascript reactjs react-router react-router-v4


    【解决方案1】:

    您还需要一个箭头才能使您的Page 成为 HOC。它需要参数、包装的组件并且必须返回一个组件。你得到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)
    

    【讨论】:

    • 什么时候调用它?谁是被包装的组件?-
    • @ValRob 嗯,你想调用它就调用它。例如在导出之前。 Wrapped 组件是您要包装的任何组件。
    猜你喜欢
    • 2019-05-18
    • 2020-06-12
    • 2021-04-08
    • 2021-01-11
    • 2019-06-08
    • 2019-04-01
    • 1970-01-01
    • 2020-08-05
    相关资源
    最近更新 更多