Reputation: 679
I have get some data from db , when I console log them it works nice. and also when I stringfy the passed props are OK and displayed on the screen as they are expected.
import axios from 'axios'
import { URL } from '../../../../config'
import Header from './header'
class NewArticle extends Component {
state = {
article: [],
team: []
}
componentWillMount() {
axios.get(`${ URL }/articles?id=${ this.props.match.params.id }`)
.then( res => {
let article = res.data[ 0 ]
console.log( res.data[ 0 ] )
//{
// author: "John Secada",
// date: "10/12/2018",
// }
axios.get( `${ URL }/teams?id=${ article.team }` )
.then( res => {
this.setState({
article,
team: res.data[0]
})
console.log( res.data[0] )
// {
// id: 3,
// logo: "nets.png",
// name: "Nets",
// poll: "false",
// stats: {wins: 23, defeats: 12}
// }
} )
} )
}
render(){
let article = this.state.article
let team = this.state.team
return(
<div>
<Header
teamData={ team }
date={ article.date }
author={ article.author }
/>
{ JSON.stringify(article,team) }
</div>
)
}
}
export default NewArticle
the Header component which recieves the props:
import React from 'react'
const Header = props => {
return (
<div>
{ console.log( props) }
{/* {teamData: Array(0), date: undefined, author: undefined} */}
</div>
)
}
export default Header
So why they are undefined, when I pass them as props to a Header component?
Upvotes: 7
Views: 12877
Reputation: 3428
First of all, @Evghenii 's answer is correct.
Here's the more smart and recommended approach to handle conditional rendering.
You can use Higher Order Components to handle conditional rendering in reactjs.
For more details: Higher Order Components with Conditional Rendering in React.
Upvotes: 2
Reputation: 184
Inside the componentWillMount you are using axios which returns a promise and is asynchronous. The problem is that you are rendering the <Header/>
before the data is fetched from the API. To Avoid this you can update your render
function like this.
function render() {
let article = this.state.article;
let team = this.state.team;
return (
<div>
{team.length ? (
<Header teamData={team} date={article.date} author={article.author} />
) : (
'Loading Data...'
)}
{JSON.stringify(article, team)}
</div>
);
}
Upvotes: 5
Reputation: 245
Because you have async request and when Header is being mounted you don't have this data yet.
Try this:
render(){
const article = this.state.article
const team = this.state.team
if(!article && !article.date && !article.author) {
return null;
}
if(!team) {
return null;
}
return(
<div>
<Header
teamData={ team }
date={ article.date }
author={ article.author }
/>
{ JSON.stringify(article,team) }
</div>
)
}
Upvotes: 10