С приведенным выше кодом все в порядке. Но есть несколько моментов, на которые следует обратить внимание.
- Если вы хотите показать пользователю Loader для вызова API, вам могут потребоваться некоторые изменения.
- Вы можете использовать async / await, синтаксис намного чище.
- Также при успешном / неудачном выполнении API вы можете захотеть показать некоторое уведомление пользователю. В качестве альтернативы, вы можете включить в componentWillReceiveProps показ уведомлений, но недостатком будет то, что он будет проверять все изменения реквизита. Так что я в основном избегаю его.
Для решения этой проблемы вы можете сделать:
import { createAction } from 'redux-actions';
const getDataRequest = createAction('GET_DATA_REQUEST');
const getDataFailed = createAction('GET_DATA_FAILURE');
const getDataSuccess = createAction('GET_DATA_SUCCESS');
export function getData(endpoint) {
return async (dispatch) => {
dispatch(getDataRequest());
const { error, response } = await fetch('http://localhost:8000/api/getdata');
if (response) {
dispatch(getDataSuccess(response.data));
//This is required only if you want to do something at component level
return true;
} else if (error) {
dispatch(getDataFailure(error));
//This is required only if you want to do something at component level
return false;
}
};
}
В вашем компоненте:
this.props.getData(endpoint)
.then((apiStatus) => {
if (!apiStatus) {
// Show some notification or toast here
}
});
Ваш редуктор будет выглядеть так:
case 'GET_DATA_REQUEST': {
return {...state, status: 'fetching'}
}
case 'GET_DATA_SUCCESS': {
return {...state, status: 'success'}
}
case 'GET_DATA_FAILURE': {
return {...state, status: 'failure'}
}