Wait For Data To Be Fetched In Child Components, Then Render
Solution 1:
...how to wait for all of the child components to fetch data, then render the Homepage component
You don't. Instead, you move the fetches to the Homepage component's parent, and then have that parent only render the Homepage component when it has all of the necessary information to do so. In React parlance, this is "lifting state up" (e.g., up the hierarchy to the parent).
While you could render the Homepage in a "loading" form, and have it render its child components in a "loading" form, and have the child components call back to the Home page to say they have their information now, that's more complicated than simply lifting the state up to the highest component that actually needs it (so it knows it can render the Homepage).
Solution 2:
As @TJCrowder mentioned in his answer, You'll need to lift your state up and keep it in the parent component. Make a network request there and pass the data to your child component as props. You can read more about lifting-state-up here
classYourComponentextendsReact.Component {
state = {isLoading: true, isError: false, banner: null, services: null, about: null};
asynccomponentDidMount() {
try {
const [banner, services, about] = awaitPromise.all([
// all calls
]);
this.setState({ isLoading: false, banner, services, about });
} catch (error) {
this.setState({ isError: true, isLoading: false });
}
}
render() {
if (this.state.isLoading) {
return<div>Loading...</div>
}
return (
<React.Fragment><Bannerdata={this.state.banner} /><Servicesdata={this.state.services} /><Aboutdata={this.state.about} /></React.Fragment>
)
}
}
Solution 3:
using promises in fetch you could, as suggested, have a isLoaded
property state determine whether or not a component should render or not.
classShouldRenderextendsReact.Component {
constructor(props) {
super(props);
this.state = {
data: [],
isLoaded: false,
}
}
componentDidMount() {
fetch('http://someresource.com/api/resource')
.then(res => res.json())
.then(data => {
this.state({
data,
isLoaded: true,
});
})
}
render() {
const { isLoaded } = this.state;
if (isLoaded) {
return<MyAwesomeReactComponent />
}
returnnull;
}
}
So once the state is updated it will trigger a rerendering of the component with the new state that will render the if statement true and you're JSX will appear.
Solution 4:
if move the fetching to the parent or main component so what's the point of the child component anyways and can you imagine how that parent component will look like after keep adding to it, it is going to be a big pile of mess, there must be another way how to handle this
Post a Comment for "Wait For Data To Be Fetched In Child Components, Then Render"