вообще без редукторов и без других шаблонов.
довал широко распространенному совету изучения разработки React по первому компоненту мастеринга.props
, инкапсулируя состояние пользовательского интерфейса на уровне компонентовthis.state
и передать его выборочно через дерево компонентов. Это был поучительный опыт. Я оценил всю мощь шаблона проектирования представлений без сохранения состояния и чувствую, что с помощью этих методов я смог достичь надежных и хорошо организованных результатов.
Продолжая, я сейчас пытаюсь включить более сложное управление состоянием, используяredux
, Но, как я пробираюсь через сложность и интегрироватьredux
в своих приложениях я сталкиваюсь со следующими наблюдениями о том, как развивался мой код. Некоторые из этих событий кажутся разумными, но другие заставляют меня задаться вопросом, правильно ли я поступаю.
1) Создатели действий как связь бизнеса и логики пользовательского интерфейса
Я считаю, что большая часть логики, которая была ранее реализована в функциях жизненного цикла ReactcomponentDidUpdate
и т. д., и вonTouch/onPress
обработчики, теперь реализовано всоздатели действий, Это, кажется, положительное развитие, поскольку оно «держит все в одном месте» и позволяет проводить модульное тестирование.
Вопрос: Лучше ли концентрировать бизнес-логику в сети довольно сложных создателей действий?
2) выдолбленныеreducers
Как следствие № 1 выше, я считаю, что мойreducers
и их соответствующиеaction
объекты превратились в де-факто список сеттеров, которые лишь немного обновляют хранилище состояний передаваемыми значениями следующим образом:
case types.SAVE_ORDER:
return Object.assign({}, state, {
order: action.order,
});
Большая часть причины этого заключается в том, чтоreducers
должны бытьчистые функции и поэтому я ограничен в том, что я могу с ними сделать (например, без асинхронной обработки). Кроме того, редукторам разрешено работать только в соответствующих подсекциях состояния магазина. Учитывая, что большая часть сложности моего приложения уже обязательно находится всоздатели действийМне трудно оправдать произвольную миграцию сложности вreducers
просто ради того, чтобы они выглядели полезными.
Вопрос: Нормально ли и приемлемо ли иметь шаблонreducers
эта функция просто как прославленные сеттеры в состояние избыточного хранилища?
3)redux-thunk
везде
Я спрашивал отдельно на ТАК, почемуredux-thunk
даже необходимо (в отличие от вызова создателей стандартных действий внутри асинхронных обратных вызовов / служебных функций). На меня указалиответ Дэном Абрамовым, который дает очень удовлетворительное объяснение (с точки зрения масштабируемости, рендеринга на стороне сервера и многих других причин).
Приняв необходимостьredux-thunk
Я считаю, что большинство моихсоздатели действий необходимо выполнить асинхронные действия, нужен доступ кgetState
, или жеdispatch
множественные изменения в состоянии. В результате я возвращаюсьthunks
'экстенсивно.
Вопрос: Нормально ли для приложения с избыточностью полагаться наthunk
Создатели действий ред, и редко, чтобы запустить стандартное действие объекта непосредственно?
4) Redux как глобальныйthis.state
В конечном итоге, кажется, мое приложениеredux
магазин эволюционировал, чтобы эффективно напоминать глобальныйthis.state
, Вы можете думать об этом как о сохранении всего состояния приложения вthis.state
в самом внешнем компоненте контейнера, но без неизбежного беспорядка, который идет с передачей указанногоstate
вниз через вложенные слоиprops
и любые изменения копируют дерево компонентов через крысиное гнездообработчик функции.
Вопрос: Являетсяперевождь c, orrect инструмент для использования в глобальном государственном хранилище? Есть ли альтернативы, которые ведут себя более сродниреагироватьвстроенныйthis.state
, позволяя распространять глобальное состояние приложения через компоненты реакции без учета состояния и обновлять его по всему приложению через централизованный «распределительный щит», без кажущейся бесконечной сети шаблонов, констант иswitch
заявления, которые приходят с принятиемперевождь?
5) Один единственный тип действия? Этот дополнительный вопрос основан на одном из опубликованных комментариев.
ВопросМожно ли на законных основаниях (со всей серьезностью, а не просто наглядно демонстрировать свою точку зрения) использовать излишки только с одним типом действия?
Пример - создатель действий:
export function someActionCreator(various_params){
return (dispatch, getState => {
// ... business logic here ....
asyncIfThisIfThat().then(val => {
dispatch({
// type: 'UPDATE_STATE', // Don't even bother setting a type
order: val
})
})
)
}
Один универсальный корпус редуктора:
export default function app(state = initialState, action = {}) {
return Object.assign({}, state, action)
// Just unconditionally merge into state!
}
Мне кажется, это обеспечило бы объект состояния глобальной области видимости, который автоматически сопоставляется сconnect
компоненты, и один, который извлекает выгоду из всех преимуществ неизменного состояния и совместим с Reactprops
, В этой схемеdispatch
эффективно становится глобальнымsetState
.
Примечание - Пожалуйста, не принимайте этот вопрос неправильно - это, конечно, не критикаперевождь, Как ученик, я, очевидно, не в состоянии судить о технологиях, опирающихся на опыт тысяч и поддержку миллионов. Я не сомневаюсь в его ценности в правильном контексте.
Я просто чувствую запах сомнительного шаблона в своем собственном коде и задаюсь вопросом, что, если что-то я делаю неправильно, или я использую правильный инструмент для этой задачи.