Я создаю веб-сайт, используя ReactJS, и хотел бы, чтобы контент выглядел так, как показано ниже, пока страница получает данные с моей конечной точки (например, медленное соединение). Я ищу решение, которое можно легко реализовать для таких элементов, как p, во время загрузки данных.
Как мне это реализовать?






Есть несколько способов справиться с этим (я считаю, что это называется «ленивая загрузка»).
Вот один способ.
Предполагая, что вы используете метод загрузки данных из вашего API на основе Promise, я бы сделал следующее:
this.state = { loading: true }.const normalStyles = {}, const greyStyles = {} с выбранными вами ключами / значениями CSS.<p> или любых других элементах, которые вы хотите изменить, добавьте опору style, например style = {this.state.loading ? greyStyles : normalStyles}.this.setState({loading: false}).Если бы мне пришлось делать это самому, я бы создал два компонента - один «настоящий» компонент, а второй будет служить заполнителем для будущего контента:
//this component is like a loader, it will display silver square blocks in place of content that is not yet present.
const SectionPlaceholder = () => (
<section>
<span className = "avatar-placeholder" />
<span className = "gray-bar" />
<span className = "gray-bar" />
</section>
)
//this components is a "real" component that will render data when they're available
const Section = (props) => (
<section>
<img src = {props.user.image} />
<p>{props.user.username}</p>
<p>{props.user.user_email}</p>
</section>
)
Теперь, имея эти два компонента и зная, что данные будут доступны в какой-то момент в будущем, мы можем просто показывать заполнители, пока данные не будут получены:
render() {
return (
<div>
{this.props.userData ?
<Section user = {this.props.userData} />
:
<SectionPlaceholder />
}
</div>
)
}
Это должно дать вам желаемый эффект.
Я бы, вероятно, создал компонент, который выглядел бы как снимок экрана, который вы указали в вопросе, или изображение, которое выглядит так, в зависимости от того, что вы предпочитаете. И сделай что-нибудь подобное.
state = {
isFetching: true,
data: {},
isError: false
}
componentDidMount() {
//doing the fetch
fetch('api').then(
response => {
this.setState({ data: response.json(), isFetching: false });//finish with fetch
},
error => {
this.setState({ isError: true, isFetching: false });//finish with fetch but error
}
);
}
render() {
if (this.state.isFetching)
return <CustomLoadingComponent />;
return(
<div>
whatever you wanna show!
</div>
)
}
Итак, если он загружается, загрузите пользовательский компонент загрузки, когда данные вернутся, делайте все, что хотите.
Кажется, это лучше всего написано и ближе всего к тому, что я ищу, спасибо. :)