Как стать автором
Обновить

Комментарии 26

У вас в примерах используются декораторы, хотя можно написать тоже самое обычными функциями. Вот ссылка на официальную позицию по поводу декораторов и react. Да и в целом, чем меньше экзотики в документации, тем лучше.

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

Ясно. В любом случае спасибо за статью, материал хороший!

ладно декораторы, но bind operator — это очень очень плохо

А можно аргументацию чем это плохо?:)

Тем что это не стабильная фича и не факт что она вообще будет добавлена

У меня она работает стабильно. И разве early adoption и массовое использовние не есть путь к принятию фичи? :)

+1, я даже и не заметил, что там используется bind-оператор.


Конечно, как и с декораторами, лучше по возможности показывать примеры с минимум синтаксического сахара.

Еще не очень понятно зачем rxConnect знает про redux store.
Можно же использовать redux-connect и rx-connect вместе


function MyComponent({value}) {}

const mapStateToProps = state => {user: state.user};

const mapObservable = props$ => {
    const user$ = props$.pluck("user").distinctUntilChanged();

    return Rx.Observable.merge(
        Rx.Observable::ofActions({
          logout: props$.logout
        }),

        user$.map(user => ({ user })),
    );
}

connect(mapStateToProps, {logout})(rxConnect(mapObservable)(MyComponent));

connect сложит все необходимые данные и действия в props, откуда их сможет достать rxConnect. И не нужно лазить в контекст и зависеть от деталей реализации react-redux.

Вы правы, можно и так :) Правда это даст чуть больше оверхеда за счёт ещё одного HoC по пути к Вашему компоненту плюс немного синтаксической перегрузки, хотя идея мне нравится :)
На самом деле мне на столько понравилась идея, что скорей всего я так и поступлю и уберу поддержку Redux в след. версии. HoC обещали оптимизировать в след. версиях React и свести оверхед почти что к нулю, а вот композиция коннекторов — это мне прям очень нравится. Спасибо за идею :)
А можно еще просто это взять https://github.com/redux-observable/redux-observable
Вот только общего у них — только зависимость на RxJS.

Redux-Observable — это middleware, в то время как RxConnect — это Higher Order Component для написания реактивных компонент. Причём никто не мешает использовать оба — Redux-Observable для обработки глобальных action-ов и RxConnect чтобы состояние связывать с компонентом и обработки локального состояния
О, привет, неожиданно видеть тебя в реакте ;)
По теме, у нас как раз одной из целей идет внедрение Rx, так что ты как нельзя вовремя.
Решение отличное, но первое, что бросается в глаза — ручная сборка/разборка ключей (угу, тот самый $). Неубедительно как-то.
Но, как уже упомянули выше, очевидно напрашивается отрезание redux-логики, что даст возможность считать все входные ключи в декораторе за стримы без дополнительной фильтрации.
Привет привет :)

Стучись в скайп ( bsideup ) если будут вопросы :)

Ручная сборка\разборка ключей? о_О Чё то я не понял, можешь пояснить? Вроде как минимум ручного в либе :)
Ну я имел в виду добавление $ в конец ключа, т.е. указываю я в декораторе search$, но пропса в компонент придет search. Неконсистентно чёт.

так… это ж… фича! :D


Суть в том, что ты объявляешь Subject search$, а в компонент придёт search = (...args) => search$.onNext(args), т.е. это не 1 к 1.

Эм… но… зачем? :)
Ну правда, указываю search — приходит search, вроде проще некуда ) ну а если нужно указать тип, то для этого лучше взять ts/flow
Да видел я код )
Сам говоришь, что наличие $ — это соглашение в Rx, то есть «своего рода тип», и я тут действительно не про типизацию.
Я к тому, что не вижу наличие еще одного контракта действительно оправданным. Ну, т.е. на текущий момент, этот доллар нужен для отделения обычных пропсов от стримов и, как следствие, различной их обработки. Но ведь если не хэндлить все пропсы в rx-connect, а отдать это редаксу, то это доллары станут не нужны.
Либо я упускаю из виду какую-то основную идею, либо просто не люблю доллары :D
Код погонять сейчас нет возможности.

Если писать без долларов, то тогда тот же самый код будет выглядеть примерно так:


@rxConnect(() => {
    const search = new Rx.Subject();

    const articles$ = search
        .pluck(0) // нас интересует первый переданный аргумент
        .flatMapLatest(searchWikipedia)

    return Rx.Observable.merge(
        Rx.Observable.of({ search: (...args) => search.onNext(args) }),

        articles$.map(articles => ({ articles }))
    )
})

что имхо гораздо грязней

Блин, не могу тебе сейчас накидать пример, чего хотелось бы достичь, с телефона не удобно :(
Но, в целом, стало понятно, зачем это соглашение.
Ага, чет затупил :D
Вот только появилась другая проблема — стало сложно делать простые вещи, а каждый чих (такой как поле ввода логина) должен проходить через action creator-ы, reducer-ы, и храниться в глобальном состоянии.

Можно просто изначально использовать mobx и всё. Никаких проблем нет — код проще, обновления компонентов атомарнее.

Можно же переложить локальный стейт в стор редакса, и не будет изначальной проблемы.

Есть возможность отписаться от подписки, используя функциональные компоненты?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории