I Zustand meiner Komponente als solche übergeben:Redux mapStateToProps: Dispatch Aktion schließen Popup nach async Update
const mapStateToProps = (state, ownProps) => {
return {
pageState: state.pageState
}
}
Die pageState enthält Informationen über die ‚Seite‘, dh Seite Metadaten (wie Seitenname), und es empfängt auch die Methode, die verwendet wurde, wenn eine asynchrone CRUD-Operation die Seitendaten ("PUT") aktualisiert hat.
Die React-Komponente ist ein modales Fenster, das der Benutzer anruft, wenn er den Seitennamen aktualisieren und speichern möchte.
Die asynchrone PUT-Operation funktioniert gut und der PageState wird ordnungsgemäß aktualisiert (kein Problem hier), aber ich verstehe nicht, wo ich die Aktion "hideModal", die nach der Async-Aufruf ausgeführt werden soll.
Optionen sind:
- mapStateToProps: hier prüfen, ob die pageState "PUT" enthält, dann die enge Aktion versenden;
- Von der Rendermethode: aber dies wird abgeraten;
- Von
shouldComponentUpdate
. Beim Testen stieß ich jedoch auf einen seltsamen Fehler. DiemapStateToProps
scheint diethis.props.pageState
bei der ersten Anfrage nicht korrekt zu aktualisieren. Es funktioniert nur auf dem zweiten (?). Außerdem habe ich nicht das Gefühl, dass ich es hier irgendwie schreiben sollte; sollte nicht so aussehen
Mein Code der Komponente aus dem Behälter zu verbinden:
const renameModal = connect(
mapStateToProps,
mapDispatchToProps
)(RenameModal);
Jede Hilfe?
Für Info: Ich verwende Redux-Saga für den asynchronen Anruf. Dies sollte jedoch keine Rolle spielen. Aktualisierungen von Seiteninformationen können von verschiedenen Orten in meiner App aus erfolgen, und diese bestimmte Aktion (Schließen des Modals) sollte von der Implementierung getrennt bleiben, die sich um die Serveranforderungen kümmert.
Redux-Saga, hört für Asynchron-Update-Anfragen:
function* updatePage(action){
try{
const page = yield call(Api.updatePage, action.payload.siteSlug, action.payload.pageId, action.payload.page);
yield put({type: 'PUT_PAGE_SUCCEEDED', page});
}catch(error){
yield put({type: 'PUT_PAGE_FAILED', error});
}
}
export function* watchUpdatePage(){
yield* takeLatest('PUT_PAGE_REQ', updatePage);
}
Das Minderer:
const asyncReducer = (state = pageState, action) => {
switch(action.type){
case 'GET_PAGE_SUCCEEDED':
console.log("get page succeeded");
return Immutable.fromJS({
type: "GET_PAGE_SUCCEEDED",
method: "GET",
pageState: action.page
});
case 'PUT_PAGE_SUCCEEDED':
console.log("put page succeeded");
return Immutable.fromJS({
type: "PUT_PAGE_SUCCEEDED",
method: "PUT",
pageState: action.page
});
default:
return state;
}
}
Bitte fügen Sie den Code für den asynchronen Anruf –
@OriDrori Aktualisierte Frage – Trace