Я просто хотів додати деякі прагматичні відмінності від того, коли я робив натхненний Redux RxJS-код.
Я зіставив кожен тип дії в екземпляр Subject. Кожен стаціонарний компонент матиме Subject, який потім відображається у функцію редуктора. Всі потоки редуктора поєднуються з, merge
а потім scan
виводяться в стан. Значення за замовчуванням встановлюється startWith
безпосередньо перед scan
. Я використовував publishReplay(1)
для станів, але згодом може видалити його.
Функція чистого реагування буде реалізовуватися лише там, де ви створюєте дані про події, надсилаючи всіх виробників / Суб'єктів.
Якщо у вас є дочірні компоненти, вам потрібно описати, як ці стани поєднуються у ваше. combineLatest
може бути гарною відправною точкою для цього.
Помітні відмінності в реалізації:
Без проміжного програмного забезпечення, лише оператори rxjs. Я думаю, що це найбільша сила і слабкість. Ви все ще можете запозичити поняття, але мені важко отримати допомогу таких сестринських спільнот, як redux і cycl.js, оскільки це ще одне користувацьке рішення. Тому мені в цьому тексті потрібно написати «я» замість «ми».
Немає перемикача / корпусу чи рядків для типів дій. У вас є більш динамічний спосіб розділення дій.
rxjs може використовуватися як інструмент в іншому місці і не міститься в управлінні державою.
Менша кількість виробників, ніж типи дій (?). Я не впевнений у цьому, але ви можете мати багато реакцій у батьківських компонентах, які слухають дочірні компоненти. Це означає менше імперативного коду та меншу складність.
Ви володієте рішенням. Рамки не потрібні. Добре і погане. Ви все одно напишіть власну структуру.
Це набагато більше фрактал, і ви можете легко підписатись на зміни з під-дерева або з декількох частин дерева додатків.
- Здогадайтесь, наскільки легко робити епоси так, як це можна зробити редукційно-обтяжливим? Дійсно легко.
Я також працюю над набагато більшими перевагами, коли дочірні компоненти описуються як потоки. Це означає, що нам не доводиться доповнювати стан батьків і дочірніх у редукторах, оскільки ми можемо просто («просто») рекурсивно поєднувати стани на основі складової структури.
Я також замислююся про те, щоб пропустити реагування і піти з примхливою хворобою чи чимось іншим, поки React краще не впорається з реактивними станами. Чому ми повинні будувати нашу державу вгору просто для того, щоб знову її зруйнувати через реквізит? Тому я спробую зробити версію 2 цього зразка з 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
}
}
Незважаючи на те, що код може не відрізнятись поодиноко, він показує, як можна будувати стан вгору і як можна легко створювати динамічні події. Ціна, яку потрібно заплатити, полягає в тому, що вам потрібно зрозуміти інший стиль коду. І я люблю платити цю ціну.