W Reakcie stan nie jest aktualizowany od razu, więc możemy użyć wywołania zwrotnego w setState(state, callback)
. Ale jak to zrobić w Redux?
Po wywołaniu this.props.dispatch(updateState(key, value))
muszę natychmiast coś zrobić ze zaktualizowanym stanem.
Czy jest jakiś sposób, żebym mógł wywołać oddzwonienie z najnowszym stanem, takim jak to, co robię w React?
javascript
reactjs
redux
Brick Yang
źródło
źródło
thunk
?dispatch()
jest to działanie synchroniczne. Zaktualizowany stan powinien być dostępny w następnej linii.thunk
.Odpowiedzi:
komponent powinien zostać zaktualizowany, aby otrzymać nowe rekwizyty.
są sposoby na osiągnięcie celu:
1. componentDidUpdate sprawdź, czy wartość została zmieniona, a następnie zrób coś ..
componentDidUpdate(prevProps){ if(prevProps.value !== this.props.value){ alert(prevProps.value) } }
2. obietnica redux (oprogramowanie pośredniczące prześle wartość obietnicy)
export const updateState = (key, value)=> Promise.resolve({ type:'UPDATE_STATE', key, value })
następnie w komponencie
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 komponencie
this.props.dispatch(updateState(key, value)).then(()=>{ alert(this.props.value) })
źródło
redux-thunk
przykładzie używaszdispatch
tak, jakby był synchroniczny. Czy tak jest?dispatch
nie jest synchroniczne. BezPromise.resolve()
,this.props.value
nadal zwróci starą wartość. Nadal potrzebne jest pewnego rodzaju odroczenie asynchronizacji (na przykład odniesienie z wewnątrzsetTimeout
może również działać).TypeError: _this.props.dispatch is not a function
?Najważniejszą kwestią dotyczącą Reacta jest jednokierunkowy przepływ danych. W twoim przykładzie oznacza to, że wysyłanie akcji i obsługa zmiany stanu powinny być rozdzielone.
Nie powinieneś myśleć w stylu „Zrobiłem
A
, teraz sięX
stajeY
i sobie z tym poradzę”, ale „Co mam zrobić, kiedyX
się stanieY
”, bez żadnego związkuA
. Stan sklepu może być aktualizowany z wielu źródeł, oprócz komponentu, Podróże w czasie mogą również zmieniać stan i nie będą przekazywane przez TwójA
punkt wysyłkowy.Zasadniczo oznacza to, że powinieneś używać tego,
componentWillReceiveProps
co zostało zaproponowane przez @Utroźródło
componentWillReceiveProps
jest przestarzałe?static getDerivedStateFromProps()
nie wydaje się odpowiednim zamiennikiem, ponieważ nie może oddzwonić, o ile wiemZ Hooks API:
useEffect
z prop jako danymi wejściowymi.import React, { useEffect} from 'react' import { useSelector } from 'react-redux' export default function ValueComponent() { const value = useSelectror(store => store.pathTo.value) useEffect(() => { console.log('New value', value) return () => { console.log('Prev value', value) } }, [value]) return <div> {value} </div> }
źródło
Możesz użyć
subscribe
listenera, a zostanie on wywołany, gdy zostanie uruchomiona akcja. Wewnątrz odbiornika znajdziesz najnowsze dane sklepu.http://redux.js.org/docs/api/Store.html#subscribelistener
źródło
subscribe
strzela tylko wtedy, gdy akcja jest wysyłana. Nie ma sposobusubscribe
, abyś wiedział, czy twoje wywołanie API zwróciło jakieś dane ... myślę! : DMożesz użyć thunk z oddzwonieniem
myThunk = cb => dispatch => myAsyncOp(...) .then(res => dispatch(res)) .then(() => cb()) // Do whatever you want here. .catch(err => handleError(err))
źródło
Jako proste rozwiązanie możesz użyć: redux-obietnica
Ale jeśli używasz redux-thunk , powinieneś zrobić coś w ten sposób:
function addCost(data) { return dispatch => { var promise1 = new Promise(function(resolve, reject) { dispatch(something); }); return promise1; } }
źródło