czy możliwe jest wysłanie akcji do samego reduktora? Mam pasek postępu i element audio. Celem jest aktualizacja paska postępu, gdy czas zostanie zaktualizowany w elemencie audio. Ale nie wiem, gdzie umieścić moduł obsługi zdarzeń ontimeupdate ani jak wysłać akcji w wywołaniu zwrotnym programu ontimeupdate, aby zaktualizować pasek postępu. Oto mój kod:
//reducer
const initialState = {
audioElement: new AudioElement('test.mp3'),
progress: 0.0
}
initialState.audioElement.audio.ontimeupdate = () => {
console.log('progress', initialState.audioElement.currentTime/initialState.audioElement.duration);
//how to dispatch 'SET_PROGRESS_VALUE' now?
};
const audio = (state=initialState, action) => {
switch(action.type){
case 'SET_PROGRESS_VALUE':
return Object.assign({}, state, {progress: action.progress});
default: return state;
}
}
export default audio;
AudioElement
? Wygląda na to, że to nie powinno być coś w porządku.Odpowiedzi:
Wywołanie akcji w reduktorze jest anty-wzorem . Twój reduktor powinien być bez efektów ubocznych, po prostu trawiąc ładunek akcji i zwracając nowy obiekt stanu. Dodanie detektorów i wysłanie akcji do reduktora może prowadzić do powiązanych akcji i innych efektów ubocznych.
Wygląda na to, że zainicjowana
AudioElement
klasa i detektor zdarzeń należą do komponentu, a nie do stanu. W ramach detektora zdarzeń możesz wysłać akcję, która zostanie zaktualizowanaprogress
w stanie.Możesz zainicjować
AudioElement
obiekt klasy w nowym składniku React lub po prostu przekonwertować tę klasę na składnik React.Pamiętaj, że
updateProgressAction
jest on automatycznie pakowany,dispatch
więc nie musisz bezpośrednio dzwonić do wysyłki.źródło
MyAudioPlayer
komponentu z kontenera nadrzędnego, który jestconnect
edytowany za pomocąreact-redux
. Sprawdź, jak to zrobićmapDispatchToProps
tutaj: github.com/reactjs/react-redux/blob/master/docs/…updateProgressAction
zdefiniowany symbol w twoim przykładzie?redux-thunk
wysyłanie akcji z innej akcji, a nie z reduktora. stackoverflow.com/questions/35411423/...Rozpoczęcie kolejnej wysyłki przed ukończeniem reduktora jest anty-wzorcem , ponieważ stan, który otrzymałeś na początku reduktora, nie będzie już bieżącym stanem aplikacji po zakończeniu reduktora. Ale planowanie kolejnej wysyłki z poziomu reduktora NIE jest anty-wzorem . W rzeczywistości to właśnie robi język Elm, a jak wiadomo Redux jest próbą przeniesienia architektury Elm do JavaScript.
Oto oprogramowanie pośrednie, które doda właściwość
asyncDispatch
do wszystkich twoich działań. Gdy twój reduktor zakończy działanie i zwróci nowy stan aplikacji,asyncDispatch
uruchomi sięstore.dispatch
z każdym działaniem, jakie mu podasz.Teraz twój reduktor może to zrobić:
źródło
dispatch
które powinny zwrócić akcję. Zmieniłem ostatnie wiersze na:const res = next(actionWithAsyncDispatch); syncActivityFinished = true; flushQueue(); return res;
i działało świetnie.Możesz spróbować użyć biblioteki takiej jak redux-saga . Pozwala to na bardzo czysty sposób na sekwencjonowanie funkcji asynchronicznych, uruchamianie akcji, używanie opóźnień i wiele więcej. Jest bardzo potężny!
źródło
supplier
informacje, gdy użytkownik próbuje odwiedzićitem
stronę szczegółów. TwójcomponentDidMount()
by wystrzelić funkcję, która wywołuje akcję, powiedzmyFETCH_SUPPLIER
. W obrębie reduktora możesz zaznaczyć coś takiego jak a,loading: true
aby pokazać spinner podczas składania wniosku.redux-saga
wysłucha tej akcji, aw odpowiedzi odpali faktyczne żądanie. Korzystając z funkcji generatora, może wtedy poczekać na odpowiedź i wrzucić ją doFETCH_SUPPLIER_SUCCEEDED
. Reduktor następnie aktualizuje sklep o informacje o dostawcy.pętla redux pobiera sygnał z Wiązu i zapewnia ten wzorzec.
źródło