Ну, вы можете добавить еще два действия в ваш существующий список действий. Один для получения статуса начала вызова API и один для любой ошибки. Вроде как это:
import * as types from "./actionTypes";
export function beginApiCall() {
return { type: types.BEGIN_API_CALL };
}
export function apiCallError() {
return { type: types.API_CALL_ERROR };
}
Затем вы можете использовать эти действия, отправляя их в нужное время.
export const getWorkexperience = () => dispatch => {
dispatch(beginApiCall());
axios
.get('/api/workexperiences')
.then(res =>
dispatch({
type: GET_WORKEXPERIENCE,
payload: res.data
})
).catch (err => dispatch(apiCallError(error)););
};
Затем вы должны создать новый редуктор для этого действия , Написание редуктора для этого немного сложно. Вам необходимо хранить количество выполняемых вызовов API и увеличивать или уменьшать их в зависимости от их статуса. Для этого вы можете добавить _SUCCESS
к существующему типу действия во всех создателях и редукторах действий.
import * as types from "../actions/actionTypes";
import initialState from "./initialState";
function actionTypeEndsInSuccess(type) {
return type.substring(type.length - 8) === "_SUCCESS";
}
export default function apiCallStatusReducer(
state = initialState.apiCallsInProgress,
action
) {
if (action.type == types.BEGIN_API_CALL) {
return state + 1;
} else if (
action.type === types.API_CALL_ERROR ||
actionTypeEndsInSuccess(action.type)
) {
return state - 1;
}
return state;
}
//initialState.js
export default {
state1: [],
state2: [],
apiCallsInProgress: 0
};
Оказавшись внутри компонента, после выполнения запроса на выборку вы можете использовать состояние этого редуктора для рендеринга счетчика или чего-либо, что вам нужно, просто извлекая его из редуктора.
const loading = useSelector((state) => state.apiCallsInProgress > 0);
или вы можете получить к нему доступ через mapStateToProps
, как это, которое, как я вижу, вы использовали для получения реквизита в вашем компоненте.
const mapStateToProps = (state) => ({
resume: state.resume,
isAuthenticated : state.auth.isAuthenticated,
auth: state.auth,
loading: state.apiCallsInProgress > 0
});
И вы можете вернуть содержимое функции следующим образом.
{loading ? (
Loading...
) : (
<div>My component</div>
)}