Last active
November 28, 2024 00:44
-
-
Save bvaughn/89700e525ff423a75ffb63b1b1e30a8f to your computer and use it in GitHub Desktop.
Advanced example for eagerly prefetching async data in a React component.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// This is an advanced example! It is not intended for use in application code. | |
// Libraries like Relay may make use of this technique to save some time on low-end mobile devices. | |
// Most components should just initiate async requests in componentDidMount. | |
class ExampleComponent extends React.Component { | |
_hasUnmounted = false; | |
state = { | |
externalData: null, | |
}; | |
constructor(props) { | |
super(props); | |
// Prime an external cache as early as possible. | |
// Async requests are unlikely to complete before render anyway, | |
// So we aren't missing out by not providing a callback here. | |
asyncLoadData(this.props.someId); | |
} | |
componentDidMount() { | |
// Now that this component has mounted, | |
// Wait for earlier pre-fetch to complete and update its state. | |
// (This assumes some kind of external cache to avoid duplicate requests.) | |
asyncLoadData(this.props.someId).then(externalData => { | |
if (!this._hasUnmounted) { | |
this.setState({ externalData }); | |
} | |
}); | |
} | |
componentWillUnmount() { | |
this._hasUnmounted = true; | |
} | |
render() { | |
if (this.state.externalData === null) { | |
// Render loading state ... | |
} else { | |
// Render real UI ... | |
} | |
} | |
} |
@kushalmahajan I think that should avoid caching since you have a pending Promise to be fulfilled with your data;
Whay if we do like this???
constructor(props) {
super(props);
asyncLoadData(this.props.someId).then(externalData => {
if (!this._hasUnmounted) {
this.setState({ externalData });
}
});
}
Why context is not available in the constructor level? I think it makes sense to have this.context available in the constructor level.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
To avoid caching, what if we did @bvaughn