Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Как правильно произвести декомпозицию редьюсеров, то есть создать несколько независимых редьюсеров, которые преобразуют независимые состояния, и затем объединить их в один редьюсер? Если создать несколько редьюсеров через redux-symbiote и объединить их через combineReducers, то возникнет риск коллизии названий типов действий (потому что они не записаны в коде явно).
const { actions, reducers } = createSymbiote(
initialState, symbiotes, 'prefix/namespace'
)
// or
const { actions, reducers } = createSymbiote(
initialState,
symbiotes,
{ namespace: 'prefix/namespace' },
)
const initialState: CounterState = {
current: 0
}
const next = ({ }) => (s: MyState) => ({ ...s, current: s.current + 1 });
const set = (a: { value: number}) => (s: MyState) => ({ ...s, current: s.current + a.value });
const { actionCreators, bindActions, reducer } = buildReducer(
initialState,
{
next,
set,
},
{ prefix: "COUNTER" }
);
Итак имеем:Я так и не нашел ответа на вопрос зачем нужны эти псевдоабстракции.
— Глобальный стор (обычно все глобальное — плохо, а тут вдруг — хорошо).
— Кучу экшенов где action.type уникален в пределах приложения.
— Кучу action creator-ов c названием, в большинстве случаев, таким же как action.type, записанным в другом регистре.
— reducer-ы — по сути обычный switch case.
Теоретически, для уменьшения бойлерплейта вы даже использовали какую-нибудь свистоперделку.
Вопрос:
Где в этом хозяйстве архитектура, абстракции и изоляции и чем оно координально лучше, чем обычные методы хранилища? ЗЫ: Методы хотя бы можно комбинировать в отличии от словоблудия внутри switch case.
yield takeEvery(actions.open.success.name, loadAdditional) будет работать?Разбить на слои, где с каждым слоем работала бы команда.
Я не понимаю, почему люди не переходят на elm, если вам так важно убрать бойлерплейт код, что вы готовы создовать либы вокруг редакса чтоб от него избавится. Ведь редакс пришел именно из ельма, и там те же экшены и редюсер выглядит наиболее выгодно и локанично. Вот тот же пример на elm:
type alias Model =
{ loading : Bool
, error : Just String
, popupsOpened : List String
}
init : Model
init =
{ loading = True
, error = Nothing
, popupsOpened = ["popup1", "popup2", "popup3"]
}
type FetchingStatus
= Start String
| Fail String
| Success String
type Msg
= Open FetchingStatus
| Close FetchingStatus
update : Msg -> Model -> Model
update msg model =
case msg of
Open status ->
case status of
Start ->
{ model | loading = True, error = Nothing }
Fail error ->
{ model | error = Just error }
Success popupName ->
{ model | popupsOpened = model.popupsOpened :: popupName }
Close status ->
case status of
Start ->
{ model | loading = True, error = Nothing }
Fail error ->
{ model | error = Just error }
Success popupName ->
{ model | popupsOpened = List.filter (\x -> x not popupName) model.popupsOpened }
Redux-symbiote — пишем действия и редьюсеры почти без боли