W tym Redux: Colocating Selectors with Reducers egghead samouczku Dan Abramov sugeruje użycie selektorów, które akceptują drzewa państwowej pełny zamiast plasterków państwa, do hermetyzacji wiedzy o stanie dala od komponentów. Twierdzi, że to ułatwia zmianę struktury państwa, ponieważ komponenty nie mają o tym pojęcia, z czym całkowicie się zgadzam.Redux: lokalizowania Selektory z Reduktory
Jednak sugeruje podejście, że dla każdego selektora odpowiadającego konkretnemu wycinkowi stanu, definiujemy go ponownie obok reduktora głównego, aby mógł zaakceptować pełny stan. Z pewnością to obciążenie związane z implementacją podważa to, co próbuje osiągnąć ... upraszczając proces zmiany struktury państwa w przyszłości.
W dużej aplikacji z wieloma reduktorami, z których każdy ma wiele selektorów, czy nie będziemy nieuchronnie napotykać na nazwy kolizji, jeśli definiujemy wszystkie nasze selektory w pliku reduktora root? Co jest nie tak z importowaniem selektora bezpośrednio z powiązanego z nim reduktora i przejściem w stan globalny zamiast odpowiadającego fragmentu stanu? na przykład
const todos = (state = [], action) => {
switch (action.type) {
case 'ADD_TODO':
return [...state, todo(undefined, action)];
case 'TOGGLE_TODO':
return state.map(t => todo(t, action));
default:
return state;
}
};
export default todos;
export const getVisibleTodos = (globalState, filter) => {
switch (filter) {
case 'all':
return globalState.todos;
case 'completed':
return globalState.todos.filter(t => t.completed);
case 'active':
return globalState.todos.filter(t => !t.completed);
default:
throw new Error(`Unknown filter: ${filter}.`);
}
};
Czy jest jakaś wada, aby zrobić to w ten sposób?
Tak, właśnie obejrzałem ten film i widzę, jak raz aplikacja zaczyna się rozwijać, mając 3 źródła prawdy na jedno działanie, wydaje się okropne. Od tej jednej akcji w pliku jsx wywołujemy plik reduktora/indeksu, który ma teraz odniesienie do pliku reduktora, który przechowuje stan. Nie wiem, to dla mnie - wydaje się dużo narzutów i aby wytworzyć jedną metodę, która potrzebuje kawałka danych, musimy teraz odczuwać jego obecność w 3 różnych plikach. Teraz wiele, że przez 50 lub 100 ... Być może w bardzo podstawowej aplikacji, takiej jak "todos", jest w porządku. Ale to nie jest prawdziwy świat. –
Wiele rzeczy w Redux sugeruje najlepsze praktyki, ale to niekoniecznie oznacza, że są najlepsze we wszystkich przypadkach lub w przypadku użycia. Robię rzeczy w taki sam sposób, jak robisz: ustaw selektory za pomocą reduktora, z którym się zgadzają. Myślę, że to ma większy sens, ponieważ wiedza na temat dostępu do części państwa znajduje się obok funkcji, które definiują tę część państwa. Naprawdę chodzi o to, co jest najlepsze dla Ciebie, a wielu ludzi w społeczności Redux przyjmuje pogląd, że właśnie o to powinieneś. –
W dużej aplikacji nie sądzę, że struktura proponowana w tutorialach już działa. Musisz podzielić swoje reduktory/selektory/akcje w oparciu o konkretny obiekt domeny, na który są kierowane. Aby odpowiedzieć na twoje pytanie, nie ma w tym żadnych wad, poza faktem, że wprowadzasz wiele zależności między swoimi komponentami a konkretnymi reduktorami. –