2016-09-16 24 views
14

W React stan nie jest natychmiast aktualizowany, więc możemy użyć wywołania zwrotnego w setState(state, callback). Ale jak to zrobić w Redux?Jak wywołać wywołanie zwrotne po aktualizacji stanu w Redux?

Po wywołaniu this.props.dispatch(updateState(key, value)), muszę natychmiast zrobić coś ze zaktualizowanym stanem.

Czy istnieje sposób, w jaki mogę zadzwonić do callbacku z najnowszym stanem, jak to, co robię w React?

+0

Używasz 'thunk'? –

+0

Myślę, że 'dispatch()' jest działaniem synchronicznym. Zaktualizowany stan powinien być dostępny w następnym wierszu. –

+1

@PraneshRavi Tak myślałem. Ale mam stary stan. Nie użyłem 'thunk'. –

Odpowiedz

1

Można użyć detektora subscribe i zostanie wywołany po wywołaniu akcji. Wewnątrz słuchacza otrzymasz najnowsze dane sklepu.

http://redux.js.org/docs/api/Store.html#subscribelistener

+0

'subscribe' uruchamia się tylko po wysłaniu akcji. Nie ma mowy, żeby "subscribe" dałoby ci znać, gdyby twoje wywołanie API zwróciło jakiekolwiek dane ... myślę! : D – Mihir

+0

Możesz wysłać następną akcję po zakończeniu twojego żądania (pomyślnie lub bez powodzenia). – Jam

21

komponent powinien być aktualizowany nowe rekwizyty.

istnieją sposoby, aby osiągnąć swój cel: LIVE DEMO for examples

1. componentWillReceiveProps/componentDidUpdate sprawdzić, czy wartość zostanie zmieniona, wówczas coś zrobić ..

componentWillReceiveProps(nextProps){ 
    if(nextProps.value!==this.props.value){alert(nextProps.value)} 
    } 

2. Redux-obietnica (oprogramowanie pośrednie wyśle ​​rozstrzygniętą wartość obietnicy)

export const updateState = (key, value)=> 
Promise.resolve({ 
    type:'UPDATE_STATE', 
    key, value 
}) 

następnie w składniku

this.props.dispatch(updateState(key, value)).then(()=>{ 
    alert(this.props.value) 
}) 

2. Redux-thunk

export const updateState = (key, value)=> dispatch=>{ 
dispatch({ 
     type:'UPDATE_STATE', 
     key, value 
    }) 
return Promise.resolve() 
} 

następnie w składniku

this.props.dispatch(updateState(key, value)).then(()=>{ 
    alert(this.props.value) 
}) 
+0

W twoim przykładzie 'redux-thunk' używasz' dispatch' tak, jakby był synchroniczny. Czy tak jest? –

1

Najważniejsze o React jednokierunkowy przepływ danych. W twoim przykładzie oznacza to, że wysyłka akcji i zmiana stanu powinny zostać odłączone.

Nie należy myśleć jak „Zrobiłem A, teraz X staje Y i poradzić”, ale „Co mam zrobić, gdy X staje Y”, bez jakiegokolwiek związku A. Stan magazynu można aktualizować z wielu źródeł, oprócz elementu, podróż w czasie również może zmienić stan i nie zostanie przekazana przez punkt wysyłkowy A.

Zasadniczo oznacza to, że należy użyć componentWillReceiveProps jak to zostało zaproponowane przez @Utro

+0

Jest to odpowiedź, której naprawdę szuka (chociaż wygląda na to, że nie jest tego świadomy). –

Powiązane problemy