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

React passing props down through switch element

我在通过 React 元素(如 Switch 和 Route)传递道具时遇到问题。在下面的示例中,我想将 Dashboard 组件的所有 props 传递给 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.

      }

是的,请改用 render 属性。

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

问题是组件覆盖了渲染道具。

删除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

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

因此,如果您进入您的帐户并且必须再次传递道具,这可能是实现此功能的好地方。

如果设置正确,您可以在您的页面上执行类似的操作。但同样,您不只是传递了一个,而是传递了所有道具。然后,如果您还需要将它们传递给下一个组件怎么办 <<< 这就是 Context 的意义所在。我认为使用上下文比使用组件更好,因为考虑到有状态组件通常是有限的。有了上下文,您的 Account 组件可以有多个子组件,您不必一直向下传递 props 来完成您想要实现的目标。

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

  }}
 </AppContext.Consumer>

假设您在使用 React.createContext() 时命名变量 AppContext; 这个想法是,在许多级别传递 props 对某些人来说可能很烦人,但是使用上下文,您可以随时输入 属性 而不必担心是否正确传递它们。请务必完整阅读本文,有时您想要使用上下文,有时您不想使用上下文。