Я просто хотел добавить некоторые прагматические отличия от того, когда я делал RxJS-код, вдохновленный Redux.
Я сопоставил каждый тип действия с экземпляром Subject. Каждый компонент с отслеживанием состояния будет иметь субъект, который затем отображается в функцию-редуктор. Все потоки редуктора объединяются merge
и затем scan
выводят состояние. Значение по умолчанию устанавливается startWith
непосредственно перед scan
. Я использовал publishReplay(1)
для состояний, но могу удалить его позже.
Функция react pure render будет только в том месте, где вы производите данные события, отправляя всех производителей / субъектов.
Если у вас есть дочерние компоненты, вам нужно описать, как эти состояния объединяются в ваше. combineLatest
может быть хорошей отправной точкой для этого.
Заметные отличия в реализации:
Никакого промежуточного ПО, только операторы rxjs. Я считаю, что это самая большая сила и слабость. Вы все еще можете позаимствовать концепции, но мне трудно получить помощь от родственных сообществ, таких как redux и cycle.js, поскольку это еще одно нестандартное решение. Поэтому в этом тексте мне нужно писать «я» вместо «мы».
Нет переключателя / регистра или строк для типов действий. У вас есть более динамичный способ разделения действий.
rxjs можно использовать как инструмент в другом месте и не входит в управление состоянием.
Меньшее количество производителей, чем типов действий (?). Я не уверен в этом, но у вас может быть много реакций в родительских компонентах, которые слушают дочерние компоненты. Это означает меньше императивного кода и меньшую сложность.
Решение принадлежит вам. Никаких рамок не требуется. Хорошо и плохо. В любом случае вы в конечном итоге напишете свой собственный фреймворк.
Это гораздо более фрактально, и вы можете легко подписаться на изменения из поддерева или нескольких частей дерева состояний приложения.
- Угадайте, насколько легко делать эпосы, как это делают redux-obseravble? Действительно просто.
Я также работаю над гораздо большими преимуществами, когда дочерние компоненты описываются как потоки. Это означает, что нам не нужно собирать родительское и дочернее состояние в редукторах, поскольку мы можем просто («просто») рекурсивно комбинировать состояния на основе структуры компонентов.
Я также думаю о том, чтобы пропустить реакцию и пойти на снаббдом или что-то еще, пока React не будет лучше справляться с реактивными состояниями. Почему мы должны строить свое состояние вверх только для того, чтобы снова разбить его через свойства? Итак, я попробую создать вторую версию этого шаблона с помощью Snabbdom.
Вот более продвинутый, но небольшой фрагмент, в котором файл state.ts создает поток состояний. Это состояние компонента ajax-формы, которое получает объект полей (входов) с правилами проверки и стилями css. В этом файле мы просто используем имена полей (ключи объектов) для объединения всех дочерних состояний в состояние формы.
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
}
}
Хотя код может мало что сказать по отдельности, он показывает, как вы можете построить состояние вверх и как вы можете легко создавать динамические события. Цена, которую придется заплатить, состоит в том, что вам нужно понимать другой стиль кода. И я люблю платить эту цену.