Ho un'app React, ho bisogno di fare una chiamata ajax (per imparare) a un servizio online (async) con Redux.Azioni asincrone in Redux
Questo è il mio negozio:
import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
import duedates from './reducers/duedates'
export default applyMiddleware(thunk)(createStore)(duedates);
Si tratta di azioni:
import rest from '../Utils/rest';
export function getDueDatesOptimistic(dueDates){
console.log("FINISH FETCH");
console.log(dueDates);
return {
type: 'getDueDate',
dueDates
}
}
export function waiting() {
console.log("IN WAIT");
return {
type: 'waiting'
}
}
function fetchDueDates() {
console.log("IN FETCH");
return rest({method: 'GET', path: '/api/dueDates'});
}
export function getDueDates(dispatch) {
console.log("IN ACTION");
return fetchDueDates().done(
dueDates => dispatch(getDueDatesOptimistic(dueDates.entity._embedded.dueDates))
)
}
e questo è il riduttore:
export default (state = {}, action) => {
switch(action.type) {
case 'getDueDate':
console.log("IN REDUCER")
return state.dueDates = action.dueDates;
default:
return state
}
}
non ottengo quello che sto facendo male . L'azione viene chiamata perfettamente dal componente. Ma ottengo questo errore:
Error: Actions must be plain objects. Use custom middleware for async actions.
Suppongo che sto usando male il middleware react-thunk. Cosa sto sbagliando?
EDIT
Ora l'azione sta chiamando al riduttore, ma il riduttore, dopo aver cambiato lo stato, non è ri-eseguire il metodo Render
case 'getDueDate':
console.log("IN REDUCER")
return state.dueDates = action.dueDates;
Grande, sembra funzionare ora. ma nel riduttore, quando restituisco lo stato 'return state.dueDates = action.dueDates;', non chiama di nuovo il rendering .. Devo aggiungere qualcos'altro? – Pablo
Al momento, nell'esempio di codice, entrambe le azioni non cambiano stato. Si restituisce lo stato stesso. Puoi aggiornare le tue domande in modo che io (o chiunque altro) possa vedere la situazione attuale? –
aggiornato, ora I 'return state.dueDates = action.dueDates;' – Pablo