Экран загрузки React перед вызовом API

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

У меня уже есть приложение React, использующее Redux и React-Router. Мне нужно создать экран загрузки до того, как будет отображена домашняя страница. Этот экран загрузки будет активен, пока я не получу ответ от API. Получив ответ, я отправлю их в магазин и отключу экран загрузки.

Я нашел здесь пример того, как мне это нужно: https://boss.gg/ (они тоже используют React)

Проверьте этот вопрос, я полагаю, это может помочь: stackoverflow.com/questions/40987309/…

Rafael 26.08.2018 23:33
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
5 344
1

Ответы 1

Разделите свои действия на разные состояния: ожидание, успех, ошибка. Когда ваш запрос находится на рассмотрении, ваш компонент может отображать экран загрузки, который заменяется при выполнении запроса или выходе из строя. С помощью redux-thunk вы можете создавать асинхронные действия.

В несколько псевдокоде это будет работать так:

Ваш actionTypes:

export const GET_EXAMPLE_ERROR = 'GET_EXAMPLE_ERROR':
export const GET_EXAMPLE_SUCCESS = 'GET_EXAMPLE_SUCCESS':
export const GET_EXAMPLE_PENDING = 'GET_EXAMPLE_PENDING':

Ваши действия:

export function getExampleSuccess(payload) {
  return {
    type: exampleActionTypes.GET_EXAMPLE_SUCCESS,
    payload,
  };
}
export function getExampleError(error) {
  return {
    type: exampleActionTypes.GET_EXAMPLE_ERROR,
    error,
  };
}
export function getExamplePending() {
  return {
    type: exampleActionTypes.GET_EXAMPLE_PENDING,
  };
}
export function getExample() {
  return async dispatch => {
    dispatch(getExamplePending());
    try {
      const result = await exampleService.getData();
      dispatch(getExampleSuccess(result));
    } catch (error) {
      dispatch(getExampleError(error));
    }
  };
}

Ваш редуктор:

export default function exampleReducer(state = initialState.example, action) {
  switch (action.type) {
    case exampleActionTypes.GET_EXAMPLE_ERROR:
      return {
        ...state,
        example: {
          ...state.example,
          error: action.error,
          pending: false,
        },
      };
    case exampleActionTypes.GET_EXAMPLE_SUCCESS:
      return {
        ...state,
        example: {
          ...state.example,
          result: action.payload,
          pending: false,
        },
      };
    case exampleActionTypes.GET_EXAMPLE_PENDING:
      return {
        ...state,
        example: {
          ...state.example,
          error: null,
          pending: true,
        },
      };

    default:
      return state;
  }
}

Ваш компонент:

class ExampleComponent extends React.Component {

    componentDidMount() {
        this.props.getExample();
    }

    render() {
        if ( this.props.pending ) {
            return <Loader />;
        }

        return <div>Your component</div>
    }
}

const mapStateToProps => ({
    pending: state.example.pending
});

const mapDispatchToProps => ({
    getExample
})

export default connect(mapStateToProps, mapDispatchToProps)(ExampleComponent)

Обратите внимание, что это пример одиночного звонка. Ваше состояние ожидания может быть комбинацией нескольких состояний ожидания в разных частях вашего хранилища redux.

Хороший! Спасибо, выглядит хорошо. Думаю, я сделаю так, но я вижу этот пример веб-сайта, который я отправил другим способом. Я просматривал их запросы и обнаружил, что их загрузчик находится над приложением React вдали от корня приложения, и кажется, что вызов API выполняется еще до того, как React просыпается, поэтому полученные данные могут быть введены в React еще до его запуска. Возможно ли это, или они могут использовать какой-то другой метод, и это не важно, потому что то, что вы мне прислали, будет работать нормально?

David Bubeník 26.08.2018 22:44

Есть множество способов решить эту проблему. Ответ Рафаэля на ваш исходный вопрос - хороший способ справиться с начальной загрузкой вашего приложения, в то время как это решение будет более универсальным для реализации в последующих состояниях загрузки.

ChezFre 27.08.2018 11:27

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