Общий вызов API с использованием Redux-Middleware и Redux-Thunk
Я пытался создать промежуточное программное обеспечение, которое заботится обо всех моих APIS.
Конфигурация магазина
В моем магазине я добавляю apiMiddleware для использования [CALL_API]
, Наряду с этим я добавляю redux-thunk, используя extraArgument для доступа к универсальному API, который я создаю в своем методе отправки.
export default function configureStore(initialState) {
const store=createStore(
rootReducer,
initialState,
compose(
applyMiddleware(apiMiddleware,thunk.withExtraArgument(api))))
return store
}
редуктор
const initialState = {
data : []
}
export default function users(state=initialState,action){
switch(action.type){
case 'RECEIVE_USER_DATA':
return Object.assign({},state,{
data : action.payload
})
case 'FAILURE_USER_DATA':
return state
default:
return state;
}
}
действие
export function fetchUserData(){
return (dispatch,getState,api) => {
const url = 'https://jsonplaceholder.typicode.com/users/';
const method = 'GET'
const actionTypes = ['REQUEST_USER_DATA','RECEIVE_USER_DATA','FAILURE_USER_DATA']
api(url,method,actionTypes)
}
}
Middleware API
export default function api(url,method,actions){
return {
[CALL_API] : {
endpoint : url,
method : method,
types: actions
}
}
}
Это не работает. Однако, если я добавлю код промежуточного программного обеспечения в свою функцию действия, он будет работать нормально.
1 ответ
Вам не нужно изобретать велосипед. Вы могли бы использовать redux-auto, чтобы сделать это
Вот вам пример: store / user / init.js
// Reducer
export default function (state, payload, stage, result) {
switch(stage){
case 'FULFILLED':
return Object.assign({},state,{ data : result })
break;
case 'REJECTED':
break;
case 'PENDING':
default :
break;
}
return user;
}
// Action
export function action (payload){
return fetch('https://jsonplaceholder.typicode.com/users/',{
method: 'GET'
}).then( data => data.json() );
}
Надеюсь это поможет