Я новичок в React и Redux, и я не нашел ни одного примера того, как сделать какой-то экран загрузки, прежде чем я получу первый вызов API, чтобы получить некоторую информацию, необходимую для рендеринга приложения (например, если пользователь зарегистрирован, некоторые другие данные )
У меня уже есть приложение React, использующее Redux и React-Router. Мне нужно создать экран загрузки до того, как будет отображена домашняя страница. Этот экран загрузки будет активен, пока я не получу ответ от API. Получив ответ, я отправлю их в магазин и отключу экран загрузки.
Я нашел здесь пример того, как мне это нужно: https://boss.gg/ (они тоже используют React)



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Разделите свои действия на разные состояния: ожидание, успех, ошибка. Когда ваш запрос находится на рассмотрении, ваш компонент может отображать экран загрузки, который заменяется при выполнении запроса или выходе из строя. С помощью 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 еще до его запуска. Возможно ли это, или они могут использовать какой-то другой метод, и это не важно, потому что то, что вы мне прислали, будет работать нормально?
Есть множество способов решить эту проблему. Ответ Рафаэля на ваш исходный вопрос - хороший способ справиться с начальной загрузкой вашего приложения, в то время как это решение будет более универсальным для реализации в последующих состояниях загрузки.
Проверьте этот вопрос, я полагаю, это может помочь: stackoverflow.com/questions/40987309/…