我在通过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.
}
答案 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>
答案 2 :(得分:1)
我喜欢已经存在的一些答案。为了给您一种不同的方式解决此问题的感觉,还有一些需要学习并添加到工具箱中的东西。我会说使用上下文。上下文提供了一种通过组件树传递数据的方法,而不必在每个级别手动传递道具。 https://reactjs.org/docs/context.html
因此,如果您进入帐户并不得不再次传递道具,那么这可能是实现此目标的好地方。
正确设置后,您可以在页面上执行类似的操作。但是同样,您不仅要传递一个道具,还要传递所有道具。然后,如果您还需要将它们传递给下一个组件<<<,这就是上下文的重点。我认为使用上下文比使用组件要好,因为考虑到有状态组件通常受到限制,因此您的状态会更好。有了上下文,您的Account组件可以有几个孩子,而不必完全传递道具就可以完成想要实现的目标。
<AppContext.Consumer>
{({prop1, prop2, prop3}) => {
}}
</AppContext.Consumer>
假设您在使用React.createContext()时将变量命名为AppContext; 这个想法是,在某些级别传递道具可能有些烦人,但是使用上下文,您可以随时引入属性,而不必担心是否正确传递了道具。在某些情况下,请确保完整阅读本文,而在某些情况下,请不要使用。