So I am trying to pass some props from my top level component to a child component, I have done some searching online but cannot find anything that shows how I can pass this.props.children WITH some values my component's state. Here is my code.
Layout (Parent):
export default class Layout extends React.Component {
constructor (props) {
super(props)
this.state = { data: 'test' }
}
render() {
const {location} = this.props;
console.log("layout");
return (
<div>
<Nav location={location}/>
<div className="container">
<div className="row">
<div className="col-lg-12">
{this.props.children}, data={this.state.data}
</div>
</div>
<Footer/>
</div>
</div>
);
}
}
When I call the "data" props in my next Component:
Home (Child):
//ON COMPONENT RENDER
componentDidMount = () => {
console.log("home");
console.log(this.props.data);
}
In my console it returns:
home
Undefined
Any pointers to how I should be doping this? Any help is appreciated, thank you in advance.
If you're trying to add a prop to the children directly, this won't really work since components are ment to be immutable. What you should do instead is create a map with clones of the children.
This blog post explains it fairly well: http://jaketrent.com/post/send-props-to-children-react/
And the relevent code snippets altered for your code:
class Layout extends React.Component {
constructor (props) {
super(props)
this.state = { data: 'test' }
}
renderChildren() {
return React.Children.map(this.props.children, child => {
if (child.type === Child) {
return React.cloneElement(child, {
data: this.props.data
})
} else {
return child
}
});
}
render() {
const {location} = this.props;
console.log("layout");
return (
<div>
<Nav location={location}/>
<div className="container">
<div className="row">
<div className="col-lg-12">
{this.renderChildren()}
</div>
</div>
<Footer/>
</div>
</div>
);
}
}
Do a console.log on this.state.data in your Layout component. I'm thinking its undefined there too.
I think you need to set your state before the constructor super() call or statically outside the constructor.
Edit: So this.props.children is a react element? You need to clone it to pass it different props.
React.cloneElement(this.props.children, {
name: props.name
})
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With