通过开关元件向下传递道具

时间:2019-06-16 14:30:54

标签: reactjs react-router-v4

我在通过React元素(例如Switch和Route)传递道具时遇到问题。在下面的示例中,我想将仪表板组件的所有道具传递到Account组件。有没有办法做到这一点?

App.js

  <Dashboard>
    <Switch>
      // Dashboard props to Account component
      <Route path="/account" render={props => <Account {...props} /> } exact />
      <Route path="/someothercomponent" component={Someothercomponent} />
    </Switch>
  </Dashboard>

Dashboard.js

  render() {
      const children = React.Children.map(this.props.children, child => {
          var router = React.cloneElement(child, { image: this.state.image });
          return router;
          // Like this the router Element does receive the image prop from
          // the Dashboard component. Now this image prop needs to be
          // passed on to the Account component.

      }

3 个答案:

答案 0 :(得分:1)

是的,请改用render属性。

<Route path="path" render={() => <MyComponent {...this.props} />} />

答案 1 :(得分:1)

问题在于组件正在覆盖渲染道具。

删除component={Account}

我还在(props)周围添加了括号,以提高可读性

<Dashboard> 
  <Switch>
    <Route 
      path="/account"
      render={(props) => <Account {...props} /> } 
      exact 
    /> 
    <Route 
      path="/someothercomponent" 
      component={SomeOtherComponent} 
    />
 </Switch> 
</Dashboard>

或者:

const renderMergedProps = (component, ...rest) => { 
const finalProps = Object.assign({}, ...rest); 
return( React.createElement(component, finalProps) 
); 
} 

const PropsRoute = ({ component, ...rest }) => { 
  return ( 
    <Route {...rest} render={routeProps => { 
      return renderMergedProps(component, routeProps, rest); 
    }}/> 
  ); 
}

<Router> 
  <Switch> 
    <PropsRoute path='/login' component={Login} auth={auth} authenticatedRedirect="/" />  
    <PropsRoute path='/trades' component={Trades} user={user} />
  </Switch> 
</Router>

source

答案 2 :(得分:1)

我喜欢已经存在的一些答案。为了给您一种不同的方式解决此问题的感觉,还有一些需要学习并添加到工具箱中的东西。我会说使用上下文。上下文提供了一种通过组件树传递数据的方法,而不必在每个级别手动传递道具。 https://reactjs.org/docs/context.html

因此,如果您进入帐户并不得不再次传递道具,那么这可能是实现此目标的好地方。

正确设置后,您可以在页面上执行类似的操作。但是同样,您不仅要传递一个道具,还要传递所有道具。然后,如果您还需要将它们传递给下一个组件<<<,这就是上下文的重点。我认为使用上下文比使用组件要好,因为考虑到有状态组件通常受到限制,因此您的状态会更好。有了上下文,您的Account组件可以有几个孩子,而不必完全传递道具就可以完成想要实现的目标。

<AppContext.Consumer>
  {({prop1, prop2, prop3}) => {

  }}
 </AppContext.Consumer>

假设您在使用React.createContext()时将变量命名为AppContext; 这个想法是,在某些级别传递道具可能有些烦人,但是使用上下文,您可以随时引入属性,而不必担心是否正确传递了道具。在某些情况下,请确保完整阅读本文,而在某些情况下,请不要使用。