Chciałem tylko dodać pewne pragmatyczne różnice od kiedy stworzyłem kod RxJS inspirowany Redux.
Zmapowałem każdy typ akcji na instancję Temat. Każdy element stanowy będzie miał obiekt, który jest następnie zamapowany do funkcji reduktora. Wszystkie strumienie reduktora są połączone z merge
, a następnie scan
wyprowadza stan. Domyślną wartością jest startWith
tuż przed scan
. Użyłem publishReplay(1)
dla stanów, ale mogę go później usunąć.
Funkcja reagowania czystego renderowania będzie dotyczyć tylko miejsca, w którym tworzy się dane zdarzeń, wysyłając wszystkich producentów/podmioty.
Jeśli masz komponenty potomne, musisz opisać, jak te stany są połączone w twoje. combineLatest
może być dobrym punktem wyjścia do tego.
Wybitne różnice w realizacji:
Nie middleware, tylko rxjs operatorów. Myślę, że to jest największa siła i słabość. Nadal możesz pożyczyć koncepcje, ale trudno mi uzyskać pomoc od takich społeczności siostrzanych jak redux i cycle.js, ponieważ jest to kolejne niestandardowe rozwiązanie. Dlatego w tym tekście muszę napisać "ja" zamiast "my".
Brak przełącznika/przypadku lub ciągów znaków dla typów czynności. Masz bardziej dynamiczny sposób oddzielania działań.
rxjs może być używany jako narzędzie w innym miejscu i nie jest zawarty w zarządzaniu stanem.
Mniejsza liczba producentów niż typy czynności (?). Nie jestem tego pewien, ale możesz mieć wiele reakcji w komponentach nadrzędnych, które nasłuchują komponentów potomnych. Oznacza to mniej imperatywny kod i mniej złożoności.
Jesteś właścicielem rozwiązania. Żadne ramy nie są potrzebne. Dobry i zły. W końcu będziesz pisał własne ramy.
To znacznie więcej fraktali i można łatwo subskrybować zmiany z pod-drzewa lub wielu części drzewa stanu aplikacji.
- Zgadnij, jak łatwo jest robić eposy, jak redux-obseravble? Naprawdę proste.
Ja również pracuje na znacznie większe korzyści, gdzie elementy potomne są opisane jako strumienie. Oznacza to, że nie musimy dopasowywać stanu nadrzędnego i podrzędnego w reduktorach, ponieważ możemy po prostu ("po prostu") rekurencyjnie łączyć stany w oparciu o strukturę komponentów.
Też myślę o przeskakiwaniu reaguję i idę ze snabbdomem albo czymś innym dopóki React lepiej nie obsługuje stanów reaktywnych. Dlaczego mielibyśmy budować nasze państwo w górę, aby ponownie je rozbić za pomocą rekwizytów? Tak więc postaram się stworzyć wersję 2 tego wzorca z Snabbdom.
Oto bardziej zaawansowany, ale mały fragment, w którym plik state.ts tworzy strumień stanu.Jest to stan składnika formularza ajax, który pobiera obiekt pól (dane wejściowe) z regułami sprawdzania poprawności i stylami css. W tym pliku używamy tylko nazw pól (kluczy obiektów), aby połączyć wszystkie stany dzieci w stan formularza.
export default function create({
Observable,
ajaxInputs
}) {
const fieldStreams = Object.keys(ajaxInputs)
.map(function onMap(fieldName) {
return ajaxInputs[fieldName].state.stream
.map(function onMap(stateData) {
return {stateData, fieldName}
})
})
const stateStream = Observable.combineLatest(...fieldStreams)
.map(function onMap(fieldStreamDataArray) {
return fieldStreamDataArray.reduce(function onReduce(acc, fieldStreamData) {
acc[fieldStreamData.fieldName] = fieldStreamData.stateData
return acc
}, {})
})
return {
stream: stateStream
}
}
Podczas gdy kod nie może powiedzieć dużo w izolacji, to pokazuje, jak można zbudować stan w górę i jak można tworzyć dynamiczne wydarzenia z łatwością. Cena do zapłaty jest taka, że musisz zrozumieć inny styl kodu. I uwielbiam płacić tę cenę.
, więc nie powinny być używane razem, prawda? – Oswaldo
Nie, nie powinieneś używać ich razem. Ludzie emulowali Redux używając Rx. Szybkie Google znajdzie przykłady dla Ciebie. Jeśli chcesz używać Rx do swojego reaktywnego interfejsu użytkownika, sprawdź Cycle.js, framework Andre. Używam go ostatnio i jest fantastyczny. API bardzo się ostatnio zmieniło, ale uważam, że w końcu zaczyna zamrozić jego część. –
według [oficjalne dokumenty redux] (http://redux.js.org/docs/introduction/PriorArt.html), "Działają wspaniale razem". – galki