Monday, May 20, 2024
 Popular · Latest · Hot · Upcoming
76
rated 0 times [  83] [ 7]  / answers: 1 / hits: 38057  / 7 Years ago, wed, december 13, 2017, 12:00:00

I'll preface this by stating that I'm a complete beginner at React.js


I've created an example of a project I'm working on where I call an API in componentDidMount() and get an array of objects back, setting it in state. Here's what it looks like:


class App extends React.Component {
constructor(props) {
super(props)
this.state = {
thing: []
}
}
componentDidMount() {
// Fake API
const apiCall = () => ({
data: "test"
})

// Fake call
const data = apiCall()

this.setState({
thing: [
...this.state.thing,
data
]
})
}
render() {
return (
<div>
<h1>{ this.state.thing[0].data }</h1>
</div>
)
}

}


I'm aware that setState isn't guaranteed to update when it's used according to the documentation. I also found "forceUpdate()," and the docs recommends using it as little as possible. Nevertheless, I attempted to use it, but to no avail.


I'm able to console.log the new state during the componentDidMount() run and in the render's h1 element, but I'm unable to actually show it in the render since it's rendering an empty state array at first.


My question is:
Is there a way to force my state to update before the render is run by my program so that I can see it, and if not, how would I be able to see my new state reflected in the JSX?


More From » reactjs

 Answers
10

componentDidMount is called after the initial render and hence, at the time of initial render this.state.thing[0] is undefined and hence it would cause an error, you need to perform a conditional check before using this.state.thing[0].status



componentDidMount() {
this.setState({
thing: [
{
status: running,
test: testing
}
]
});
}

render() {
return (
<div>
{this.state.thing.length > 0? <h1 className=mt-5 mb-5>{ this.state.thing[0].status }</h1>: null
}
<button className=mt-5 onClick={ this.handleUpdate } value=not running>
Click to change
</button>
</div>
);
}

[#55696] Friday, December 8, 2017, 7 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
calicinthias

Total Points: 447
Total Questions: 101
Total Answers: 118

Location: Botswana
Member since Sat, Dec 31, 2022
1 Year ago
calicinthias questions
Sun, Jan 2, 22, 00:00, 2 Years ago
Wed, Jan 13, 21, 00:00, 3 Years ago
Mon, Aug 10, 20, 00:00, 4 Years ago
;