Redux & RxJS, есть сходства?


Я знаю, что Redux-это лучшая "реализация" Flux, или лучше сказать, что это редизайн для упрощения вещей (управление состоянием приложения).

Я много слышал о реактивном программировании (RxJS), но я еще не нырнул, чтобы узнать его.

Итак, мой вопрос: есть ли какое-либо пересечение (что-то общее) между этими двумя технологиями или они дополняют друг друга? ...или совсем другой?

5 75

5 ответов:

короче говоря, они очень разные библиотеки для очень разных целей, но да есть некоторые смутные сходства.

Redux-это инструмент для управления состоянием во всем приложении. Он обычно используется в качестве архитектуры для UIs. Подумайте об этом как об альтернативе (половине) углового.

RxJS-это реактивная библиотека программирования. Обычно он используется в качестве инструмента для выполнения асинхронных задач в JavaScript. Думаю, это как альтернатива Обещает выделить.


реактивное программирование-парадигма (способ работы и мышления), где изменения данных наблюдал издалека. Данных нет изменено на расстоянии.

вот пример изменено на расстоянии:

// In the controller.js file
model.set('name', 'George');

The модель изменяется от контроллера.

вот пример наблюдается с расстояние:

// logger.js
store.subscribe(function (data) {
    console.log(data);
});

в регистраторе мы наблюдаем изменения данных, которые происходят в хранилище (на расстоянии), и записываем в консоль.


Redux использует реактивную парадигму только немного: магазин является реактивным. Вы не устанавливаете его содержание на расстоянии. Вот почему нет store.set() in Redux. Магазин наблюдает за действиями на расстоянии и изменяет себя. И магазин позволяет другим наблюдать его данные на расстоянии.

RxJS также использует реактивную парадигму, но вместо того, чтобы быть архитектурой, она дает вам основные строительные блоки,параметры, чтобы выполнить это" наблюдение на расстоянии " шаблон.

В заключение, очень разные вещи для разных целей, но поделиться некоторыми идеями.

Это очень разные вещи.

RxJS может использоваться для реактивного программирования и представляет собой очень тщательную библиотеку с 250+ операторами.

и Redux, как описано в репозитории github "Redux-это предсказуемый контейнер состояний для приложений JavaScript".

Redux-это просто инструмент для обработки состояния в приложениях. Но для сравнения вы можете построить полное приложение только в RxJS.

надеюсь, что это помогает :)

короче говоря:

Redux: Flux вдохновил библиотека используется для Государственного Управления.

RxJS: это еще одна библиотека Javascript, основанная на философии реактивного программирования, используемая для работы с "потоками" (наблюдаемыми и т. д.) [Прочитайте о реактивном программировании, чтобы понять концепции потока].

Я просто хотел добавить некоторые прагматические отличия от того, когда я делал Redux-вдохновленный RxJS-код.

я сопоставил каждый тип действия с экземпляром субъекта. Каждый компонент с отслеживанием состояния будет иметь субъект, который затем отображается в функцию редуктора. Все потоки редуктора совмещены с merge а то scan выводит состояние. Значение по умолчанию устанавливается с startWith перед scan. Я использовал publishReplay(1) для государства, но может удалить его позже.

реакция чистая функция рендеринга будет только в том месте, где вы производите данные о событиях, отправляя всех производителей/субъектов.

если у вас есть дочерние компоненты, вам нужно описать, как эти государства объединяются в твое. combineLatest может быть хорошей отправной точкой для этого.

заметные различия в реализации:

  • нет промежуточного ПО, только операторы rxjs. Я думаю, что это самая большая сила и слабость. Вы все еще можете заимствовать концепции, но мне трудно получите помощь от сестринских сообществ, таких как redux и cycle.js, так как это еще одно пользовательское решение. Вот почему мне нужно написать "я "вместо" Мы " в этом тексте.

  • нет переключатель / случай или строки для типов действий. У вас есть более динамичный способ разделения действий.

  • rxjs может быть использован в качестве инструмента в другом месте, и не содержится в управлении состоянием.

  • меньше производителей, чем типы действий(?). Я не уверен об этом, но вы можете иметь много реакций в родительских компонентах, которые слушают дочерние компоненты. Это означает меньший императивный код и меньшую сложность.

  • вы владеете решением. Никаких рамок не требуется. Хорошо и плохо. Вы в конечном итоге напишете свою собственную структуру в любом случае.

  • это гораздо более фрактально, и вы можете легко подписаться на изменения из поддерева или нескольких частей дерева состояний приложения.

    • угадайте, как это просто это делать эпики, как redux-obseravble делать? Действительно простой.

Я также работаю над гораздо большими преимуществами, где дочерние компоненты описываются как потоки. Это означает, что нам не нужно дополнять родительское и дочернее состояния в редукторах, поскольку мы можем просто ("просто") рекурсивно объединять состояния на основе структуры компонентов.

Я также думаю о пропуск реагировать и идти с snabbdom или что-то еще, пока React обрабатывает реактивные состояния лучше. Почему мы должны строить наше государство вверх, чтобы снова сломать его с помощью реквизита? Поэтому я постараюсь сделать версию 2 этого шаблона с Snabbdom.

вот более продвинутый, но небольшой фрагмент, где государство.файл ts создает поток состояний. Это состояние компонента ajax-form, который получает объект полей (входов) с правилами проверки и стилями 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
  }
}

хотя код не может сказать много в изоляции, он показывает, как вы можете построить состояние вверх, и как вы можете легко создавать динамические события. Цена, которую нужно заплатить, заключается в том, что вам нужно понять другой стиль кода. И я люблю платить эту цену.

вы можете "реализовать" Redux в одной строке RxJS. Если вы думаете о Rx по другим причинам (для обещаний кожи, чтобы использовать его на сервере и клиенте), то пропустите Redux и перейдите на все Rx.