通过开关元素向下传递道具
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>
我喜欢已经存在的一些答案。让您了解如何以不同的方式解决此问题,以及可以学习并添加到您的工具箱中的东西。我会说使用上下文。 Context 提供了一种通过组件树传递数据的方法,而无需在每个级别手动传递 props。 https://reactjs.org/docs/context.html
因此,如果您进入您的帐户并且必须再次传递道具,这可能是实现此功能的好地方。
如果设置正确,您可以在您的页面上执行类似的操作。但同样,您不只是传递了一个,而是传递了所有道具。然后,如果您还需要将它们传递给下一个组件怎么办 <<< 这就是 Context 的意义所在。我认为使用上下文比使用组件更好,因为考虑到有状态组件通常是有限的。有了上下文,您的 Account 组件可以有多个子组件,您不必一直向下传递 props 来完成您想要实现的目标。
<AppContext.Consumer>
{({prop1, prop2, prop3}) => {
}}
</AppContext.Consumer>
假设您在使用 React.createContext() 时命名变量 AppContext;
这个想法是,在许多级别传递 props 对某些人来说可能很烦人,但是使用上下文,您可以随时输入 属性 而不必担心是否正确传递它们。请务必完整阅读本文,有时您想要使用上下文,有时您不想使用上下文。
我在通过 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>
我喜欢已经存在的一些答案。让您了解如何以不同的方式解决此问题,以及可以学习并添加到您的工具箱中的东西。我会说使用上下文。 Context 提供了一种通过组件树传递数据的方法,而无需在每个级别手动传递 props。 https://reactjs.org/docs/context.html
因此,如果您进入您的帐户并且必须再次传递道具,这可能是实现此功能的好地方。
如果设置正确,您可以在您的页面上执行类似的操作。但同样,您不只是传递了一个,而是传递了所有道具。然后,如果您还需要将它们传递给下一个组件怎么办 <<< 这就是 Context 的意义所在。我认为使用上下文比使用组件更好,因为考虑到有状态组件通常是有限的。有了上下文,您的 Account 组件可以有多个子组件,您不必一直向下传递 props 来完成您想要实现的目标。
<AppContext.Consumer>
{({prop1, prop2, prop3}) => {
}}
</AppContext.Consumer>
假设您在使用 React.createContext() 时命名变量 AppContext; 这个想法是,在许多级别传递 props 对某些人来说可能很烦人,但是使用上下文,您可以随时输入 属性 而不必担心是否正确传递它们。请务必完整阅读本文,有时您想要使用上下文,有时您不想使用上下文。