Как вы показываете контент до того, как запрос будет обработан с помощью React?


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

Как вы показываете контент до того, как запрос будет обработан с помощью React?

Как мне это реализовать?

Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
2
0
74
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Есть несколько способов справиться с этим (я считаю, что это называется «ленивая загрузка»).

Вот один способ.

Предполагая, что вы используете метод загрузки данных из вашего API на основе Promise, я бы сделал следующее:

  1. В конструкторе компонентов установите this.state = { loading: true }.
  2. Объявите и инициализируйте два стилевых объекта: const normalStyles = {}, const greyStyles = {} с выбранными вами ключами / значениями CSS.
  3. В каждом <p> или любых других элементах, которые вы хотите изменить, добавьте опору style, например style = {this.state.loading ? greyStyles : normalStyles}.
  4. Когда ваше обещание исполнится, позвоните в 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>
  )
}

Итак, если он загружается, загрузите пользовательский компонент загрузки, когда данные вернутся, делайте все, что хотите.

Кажется, это лучше всего написано и ближе всего к тому, что я ищу, спасибо. :)

user7885981 18.04.2018 22:46

Другие вопросы по теме