2017-10-03 3 views
1

Ich übermittle eine Löschanforderung an mein Backend onClick und wenn ich die Antwort vom Server erhalte, versuche ich eine Dispatch-Funktion aufzurufen, um den Redux-Store zu aktualisieren. Die Back-End-Daten können die Anfrage effektiv löschen. aber wenn ich den Dispatch-Anruf enthalten, Reaktion gibt mir diese Fehlermeldung:Funktion sendet Redux Dispatch nicht nach einem Fetch Delete Request in Reagieren

./src/actions/questions.js 
    Line 68: 'dispatch' is not defined no-undef 

ich Unmengen an verschiedenen Syntax versucht haben und .then Kombinationen nach Antwort empfangen wird, aber nichts funktioniert. Das ist verwirrend für mich, weil ich in den Thunk-Fetch-Anrufen, die ich mache, den Dispatch aufrufen kann, wenn ich die Antwort bekomme. Ich kann die traditionelle Thunk-Syntax nicht verwenden, da die Anfrage nicht ausgelöst wird, da sie ursprünglich in einem OnClick-Ereignis in einer Komponente ausgelöst wurde. Also, holen die Löschanfrage Ich mache sieht wie folgt aus:

export function deleteQuestion(questionId, routerHistory) { 
    return fetch(`${API_URL}/questions/${questionId}`, { 
     method: 'DELETE', 
    }).then(res => 
    dispatch(removeQuestion(questionId))) 
    } 

dachte ich habe über nur removeQuestion Dispatching außerhalb des Verfahrens, aber dann mache ich mir Sorgen, dass die Redux Speicher nicht synchron mit dem Back-End-Daten werden würde und später Probleme verursachen. Ich würde mich über jede Einsicht freuen, die jemand zur Verfügung stellen kann. Ich glaube nicht, dass das Löschen eines Artikels und das Aktualisieren des Redux-Shops so herausfordernd sein sollte.

Dies ist Github auch: https://github.com/jwolfe890/react_project1/blob/master/stumped-app-client/src/actions/questions.js

Sie wieder danken.

Antwort

0

Ihre Syntax ist deaktiviert. Ein Thunk gibt eine Funktion zurück, die dispatch als Parameter einnimmt. dispatch wird von der Middleware übernommen. Deshalb ist ihre Wirkung Schöpfer sollte wie folgt lauten:

export function deleteQuestion(questionId, routerHistory) { 
    return (dispatch) => { 
    fetch(`${API_URL}/questions/${questionId}`, { 
     method: 'DELETE', 
    }).then(res => { 
     dispatch(removeQuestion(questionId)) 
    }) 
    } 
} 
+0

Ich habe diesen Ansatz zunächst versucht, aber in einem onClick-Handler gibt es mir Probleme. Um den Fetch-Aufruf sogar zum Laufen zu bringen, muss ich folgendes in die onClick-Methode einschließen: – Dog

+0

handleDelete =() => { const {questionId} = this.props.match.params const {history} = this.props deleteQuestion (questionId, Verlauf) (deleteQuestion); } – Dog

+0

Im Grunde, Aufruf der Methode zweimal. Und beim zweiten Aufruf wird die Dispatch-Funktion nicht ausgeführt. – Dog

0

Sehen Sie das Problem in Ihrer deleteQuestion Funktion ist, weder Sie haben festgelegt, welche dispatch ist noch Sie haben die dispatch als Argument an die Funktion übergeben. Sie erhalten also den Fehler dispatch is not defined.

In redux-thunk geben Sie eine Funktion zurück, die dispatch als Argument verwendet, das von der redux-thunk Middleware bereitgestellt wird. Und deshalb funktioniert es perfekt.

+0

aber die Funktion deleteQuestion wird in eine Komponente exportiert und mit Parametern aus dieser Komponente aufgerufen, so dass ich den Versand nicht als Argument übergeben kann, denke ich nicht. und da der deleteQuestion-Versand durch ein onClick-Ereignis ausgelöst wird, scheint es nicht möglich zu sein, den traditionellen Thunk-Weg zu definieren/zurückzusenden. – Dog

+0

Dies könnte Ihnen helfen. http://redux.js.org/docs/advanced/AsyncActions.html. – vs1682

Verwandte Themen