2016-06-16 10 views
9

Buduję aplikację Anglar 2 ngrx/store i staram się zrozumieć najlepsze praktyki.Redux/ngrx/store architecture: dlaczego nie wysyłać akcji z głupich komponentów?

  • Uwielbiam mieć niezmienny stan, który zmienia się tylko na podstawie wysłanych działań, dzięki czemu stan aplikacji jest bardzo przejrzysty i możliwy do debugowania.
  • Uwielbiam jednostronny przepływ danych z "inteligentnych" kontenerów, ponieważ pozwala nam to używać rury asynchronicznej do mniejszej kontroli stanu.

Ale nie rozumiem, dlaczego chcielibyśmy "spaprać" wydarzenia od głupich komponentów do inteligentnych komponentów przed wysłaniem akcji do sklepu. Czy jest to jedyny powód, aby mieć elementy, które można ponownie wykorzystać? Wydaje mi się, że większość komponentów nie jest ponownie wykorzystywana, ponieważ nie ma wielu sytuacji, w których chciałbym mieć wszystko identyczne, w tym CSS. Czy są jakieś inne korzyści, których mi brakuje? Z punktu widzenia łatwości konserwacji/czytelności, czy nie jest przyjemniej móc zobaczyć działanie wysłane bezpośrednio w komponencie, w którym odbywa się interakcja?

+1

Po użyciu ng> 2 przez pewien czas zdałem sobie sprawę, że ngrx/effect i smart-container to dwa wybory projektowe jakie posiadasz. Jeśli używasz ngrx/effects, wtedy nie masz zbyt dużej potrzeby używania Smart-Dumb Components. –

+0

Możliwy duplikat [React/Redux - zapisz wybraną wartość na Zmień] (https://stackoverflow.com/questions/44549916/react-redux-save-select-value-onchange) –

Odpowiedz

2

Całkowicie się z tobą zgadzam i mam takie same wątpliwości.

Oczekuję, że komponent wyśle ​​akcję za pomocą programu rozsyłającego (który dla ngrx/store jest samym magazynem) zamiast przenosić tę logikę do kontenera (rzeczywista aplikacja).

W ten sposób komponent jest odłączony od kontenera, a kontener nie musi wiedzieć o akcjach: będzie tylko słuchał zmiany stanu i przekazywał ewentualne dane.

Z drugiej strony, Introduction to ngrx/store promuje projekt dzięki inteligentniejszemu pojemnikowi, który wiele wie o podstawowych elementach.

Szczerze nie mogę jeszcze zobaczyć zwycięzcę: Po prostu myślę, że akcje wysyłkowe z komponentu jest prostsze, czystsze i bliżej Elm Architecture która była jedną z inspiracji na Redux za.

+1

Zobacz artykuł Dan Abramov (jeden z twórców Redux) https: // medium.com/@ dan_abramov/smart-and-dumb-components-7ca2f9a7c7d0 Stwierdził, że zmienił już swoje podejście i chętnie umieszcza "inteligentne" komponenty w "głupich" komponentach (chociaż używa teraz różnych imion), cytując spryt jako szczegół implementacji –

+0

dziękuję, faktycznie ja przeczytałem to. Ale w międzyczasie całkowicie przeniosłem się do Elma i do React Native, a ja się odrodziłem: D – pietro909

0

Nie znalazłem żadnych odniesień dotyczących zdarzeń "bubble up" do najlepszych komponentów w ngrx/example-app. Również w rozmowach Roba nie dostałem tego (mógłbym coś przeoczyć).

Po prostu używam wszystkich ngrx, jak w przykładzie, a teraz wydaje się dobrze. ngrx/store do przechowywania danych, ngrx/effects do akcji łańcuchowych (co mogę uprościć) i "middleware" w obrazie "działań" opisujących wszystko, co możesz zrobić z jedną z części sklepu.

A potem, gdy wydaje się najbardziej wygodne, używam akcji (po prostu upewniając się, że wszystkie akcje użyte w pliku są istotne dla aktualnej klasy).

+1

Na przykład w book-detail.ts, emituje dodawanie i usuwanie wydarzenia. Następnie w jego komponencie nadrzędnym (book-view.ts), bierze to zdarzenie i wywołuje akcję. Dlaczego nie po prostu wysłać bezpośrednio w szczegółach książki? Ta sprawa nie jest taka zła, bo to tylko jeden poziom. Ale gdybyś miał wiele poziomów komponentów w bardziej złożonej aplikacji, mogłem zobaczyć "bulgotanie" zdarzeń wyjściowych jako dość denerwujące. – David

+1

Wygląda na to, że wszystkie głupie komponenty są czymś w rodzaju wejścia/przycisku md lub przycisku lub elementów simples, które można uzyskać. Nie chcesz powiązać logiki sklepu z tymi komponentami, ponieważ jeśli zdecydujesz się zmienić coś na temat swoich działań, reduktorów lub efektów lub innej logiki sklepu, będziesz musiał zaktualizować każdy głupi komponent, który posiadasz. Jeśli zachowasz całą logikę w komponentach "root" (takich jak strony - elementy wyświetlane bezpośrednio przez router), będziesz musiał zaktualizować tylko kilka z nich (łatwy dostęp). Więc to w zasadzie utrzymanie zdrowej aplikacji. –

+0

Nie zgadzam się z tobą @ PiotrGrużewski: Myślę, że logika, która należy do przekazywania komunikatów (a następnie działań) powinna być jak najbardziej ukryta, aby kontenery mogły skupić się tylko na rzeczywistej logice aplikacji, a nie na infrastrukturze. Odsłanianie zdarzeń w kontenerze, który następnie przekłada je na działania, jest, moim zdaniem, zbędne. Z drugiej strony uważam, że również pozwalanie komponentowi na bezpośrednie korzystanie ze sklepu nie jest jeszcze idealnym rozwiązaniem: może potrzebować odpowiedniego kontrolera? – pietro909

2

Jednym z głównych powodów jest ponowne użycie.

Pod względem MVC pomyśl o swoim inteligentnym komponencie jako kontrolerze i głupi komponencie jako o widoku.

Wyobraź sobie głupi komponent, który renderuje formularz edycji dla jednej z twoich jednostek (model). Głupi komponent obsługuje wyświetlanie formularzy i komunikatów sprawdzania poprawności, jednak można ponownie użyć tego komponentu na ekranie dodawania elementów, ekranie encji edycji, a może na przykład w wyskakującym okienku dialogowym w innym miejscu aplikacji. Każdy z tych przypadków użycia wymaga tej samej formy z takim samym sprawdzaniem poprawności, ale najprawdopodobniej wykonasz bardzo różne akcje w "przesłaniu".Inteligentny komponent, który wywołał głupi komponent, jest w każdym przypadku innym inteligentnym komponentem. Podnosząc wydarzenie i przekazując wartości do inteligentnego komponentu, możesz wykonywać bardzo różne akcje, jednocześnie tylko kodując swój "widok".

+0

Dobra odpowiedź, to dobry przykład ponownego użycia tego samego formularza w różnych przypadkach użycia. –

4

Po pierwsze, nie jestem ekspertem w kwestii wyłączenia odpowiedzialności.

  • czuję, że inteligentne elementy sterujące dumb składników jest rzeczywiście to, co nazywa się wzór mediatora. Korzystanie z tego wzoru zapewnia, że ​​mniej komponentów musi sobie poradzić z store, zwiększając tym samym łączenie wszy.
  • Łatwa konserwacja: Jeśli musisz refaktoryzować i zmieniać nazwy akcji, to łatwiej, gdy akcja jest obecna w mniejszej liczbie miejsc.
  • Posiadanie centralnego miejsca, które zajmuje się actions, umożliwia szybki przegląd architektury pod numerem. Również zmiana logiki dostępu w trybie hot-swap może być łatwiejsza.
  • Jak już wspomniano: ponowne użycie. Możesz dzielić i wykorzystywać głupie komponenty pomiędzy projektami, które mają lub nie mają architektury ngrx.
  • Również do ponownego wykorzystania w tym samym projekcie, po prostu przez podłączenie różnych inputs i outputs. Przykład: dropdownComponent może mieć wiele zastosowań, które wymagają różnych wejść i wyjść.
Powiązane problemy