2016-08-20 5 views
0

Also in meiner React Komponente, ich habe dies:Redux Thunk Rückruf nach dem Versenden einer Aktion?

this.props.updateAlertCallback('error', ERROR_MESSAGE) 

Meine updateAlertCallback Aktion ist:

export const updateAlert = (alert, message) => { 
    return { 
    type: 'UPDATE_ALERT', 
    alert, 
    message 
    } 
} 

export const updateAlertCallback = (alert, message) => { 
    return dispatch => { 
    return dispatch(updateAlert(alert, message)).then(() => { 
     console.log('Done!'); 
    }); 
    } 
} 

ich die folgende Fehlermeldung erhalten: Uncaught Typeerror: Versand (...). dann ist keine Funktion

Was ist der richtige Weg, um etwas zu protokollieren, nachdem updateAlert ausgeführt wird?

+0

Es ist viel falsch damit. Zunächst einmal ist nicht klar, was Sie erreichen möchten. Außerdem weisen Sie 'data' zu und prüfen sofort, ob es truthy ist. Es ist immer so, seit du es gerade zugewiesen hast. Dann gibt "updateAlert" nichts zurück. Es sollte eine Aktion zurückgeben, oder wenn Sie Redux Thunk für etwas benötigen, sollte es eine Funktion zurückgeben. – DDS

+0

Ich bemerke auch, dass Sie eine Callback-Funktion aufrufen, aber da Ihr gesamter Code synchron ist (Sie warten auf nichts), ist kein Rückruf erforderlich. – DDS

+0

hey @ DDS, ich ging voran und aktualisierte die Frage mit meiner letzten Situation. Ich habe versucht, einen Callback von meiner React-Komponente zu starten, nachdem ich this.props.updateAlert aufgerufen habe, anstatt einen Callback in der Aktion zu initiieren. Ich denke, ich komme näher - hast du irgendwelche Ideen mit diesem aktualisierten Code? – Drew

Antwort

2
function showAlert(message) { 
    return { 
    type: SHOW_ALERT, 
    message 
    }; 
} 

function hideAlert(message) { 
    return { 
    type: HIDE_ALERT, 
    }; 
} 

function flashAlert(message) { 
    return (dispatch) => { 
    dispatch(showAlert(message)); 
    setTimeout(() => { 
     dispatch(hideAlert()); 
    }, 5000); 
    } 
} 

Sie werden für diese arbeiten redux-Thunk müssen. Sie können dann this.props.flashAlert('Oh noes!!!!') mit der richtigen mapStateToProps verwenden. Außerdem werden Reduzierstücke und Reaktionskomponenten benötigt.

Fading ist nicht unbedingt eine einfache Reaktion. Ich schlage vor, Sie speichern das für später.

Was die flashAlert Funktion tut ist eine Funktion, die eine dispatch Funktion zurücknimmt. Diese Funktion macht allerlei lustige Dinge aber noch nicht. Zuerst wird diese Funktion an redux versandt. Diese Verteilung würde normalerweise ausgelöst, weil Aktionen einfache Objekte sein müssen. Aber weil du Redux-Thunk verwendest, wird es gut gehen. Redux-Thunk ruft diese Funktion auf und übergibt ihr die dispatch-Funktion von redux. Jetzt wird die Funktion endlich ausgeführt. Das erste, was es tut, ist eine Aktion zu versenden, die es unter showAlert() ruft. Diesmal ist es ein Objekt mit einer type Eigenschaft, was es zu einer richtigen Reduktion macht. Vermutlich wird redux diese Aktion an unseren Reducer weiterleiten, der den Status mit der neuen Nachricht aktualisieren wird, aber das wissen wir nicht genau, weil der Reducer aus dieser Antwort der Kürze halber weggelassen wurde. Wer weiß, welchen Code es enthält. Nachdem der Status geändert wurde, um die Nachricht irgendwie zu zeigen, machen wir eine setTimeout(). Wenn dieser Rückruf erfolgt, versenden wir eine weitere Aktion, die wir erhalten, indem wir hideAlert() unter Verwendung der gleichen dispatch Funktion aufrufen, die wir vorher verwendeten. Wir haben es immer noch. Dies wird vermutlich die Nachricht aus dem Zustand entfernen.

Redux wird reagieren, um die entsprechenden Komponenten erneut zu rendern, wenn sich der Status ändert. Vermutlich wird eine dieser Komponenten die Nachricht anzeigen oder nicht anzeigen, wie es der Fall sein mag.

+0

Danke @DDS! Ich weiß nicht, ob du es gesehen hast, aber ich habe dich in meinem Kern kommentiert, wo ich im Grunde nur das setTimeout aufgerufen habe, nachdem ich die property showAlert in meiner Komponente aufgerufen habe. Ist es angemessener redux-thunk zu verwenden und die Zeitüberschreitung zu haben, nachdem showAlert in dieser Aktion ausgelöst wurde? Zu diesem Zeitpunkt denke ich nur an Best Practices, da beide den Job erledigt haben. – Drew

+0

Die Verwendung von Redox-Thunk ist sauberer. Es verpackt die Absicht und macht sie wiederverwendbar. Stellen Sie außerdem sicher, dass Sie die vorherige Warnung löschen, sofern vorhanden. Wenn zwei Warnungen innerhalb von 5 Sekunden ausgelöst werden, wird die zweite Warnung durch den ersten 'setTimeout'-Befehl geschlossen. – DDS

0

Aktionen in Redux sind einfache Objekte. Redux thunk ermöglicht das Zurückgeben von Funktionen anstelle von Objekten. Diese Funktionen werden von der Thunk-Middleware ausgeführt, und letztendlich ist das endgültige Objekt, das den Speicher für den Versand erreicht, ein einfaches Objekt. Ein Beispiel für eine reduktive thunked Aktion ist unten.

export default class AccountActions { 

    static login(username, password) { 
    return (dispatch, getStore) => { 
     dispatch(AccountActions.loginRequest(username)); 
     fetch(apiUrls.signInUrl, { 
     method: 'POST', 
     headers: { 
      'Accept': 'application/json', 
      'Content-Type': 'application/json', 
     }, 
     body: JSON.stringify({ 
      user: { 
      email: username, 
      password: password, 
      } 
     }) 
     }) 
     .then(response => { 
     return response.json().then(responseJson => { 
      return dispatch(AccountActions.loginResponse(username, responseJson.token, response.status)); 
     }); 
     }) 
     .catch(err => { 
     console.error(err); 
     }); 
    }; 
    } 

    static loginRequest(username) { 
    return { 
     type: ActionTypes.loginRequest, 
     username, 
    }; 
    } 

    static loginResponse(username, token, status) { 
    return { 
     type: ActionTypes.loginResponse, 
     username, 
     token, 
     status, 
    }; 
    } 

} 
1

Redux-Thunk ist Ihre Antwort. In Ihrem Shop Codeänderung

const enhancers = compose(
    window.devToolsExtension ? window.devToolsExtension() : f => f 
); 

zu

const enhancers = compose(
    window.devToolsExtension ? window.devToolsExtension() : f => f, 
    applyMiddleware(thunk) 
); 

und Sie werden in der Lage sein Thunks Aktionen mit Ihrem redux zu verwenden.

Siehe https://github.com/gaearon/redux-thunk#installation

+0

Danke John. Was mache ich falsch? Hier ist ein Kern dessen, was ich versucht habe: https://gist.github.com/drewrawitz/231ccc56bd442dae0ce009d23cd28373 – Drew

+0

Macht nichts, das Problem war mit meinem Geschäft. Die Middleware wurde nie aufgerufen. Ich habe die ursprüngliche Frage mit meinem neuen Laden bearbeitet, der am Ende funktionierte. – Drew

0

Mit redux-Thunk, können Sie Aktion zurückkehren ein Versprechen machen:

export const updateAlert = (alert, message) => (dispatch, getState) => { 
    dispatch ({ 
    type: 'UPDATE_ALERT', 
    alert, 
    message 
    }); 
    return Promise.resolve(getState()); 
    // or just Promise.resolve(); 

jetzt können Sie rufen updatealert (xx, xx) .then (newState => {.....});

+0

Meinten Sie "Versand" in der zweiten Zeile statt – Swapnil

+0

@Swapnil, ja. Vielen Dank. – Phuhui

Verwandte Themen