nonlux
@nonlux

Как реализовать Rxjs toggle?

Вникаю в rxjs. Cделал toggle декоратор для Dropdown компонента. Все работает, но решение не нравится мне. Как-нибудь можно избежать условия "toggle/hide"

Используются Rxjs, React.js, Recompose

//file toogleable.js
export const toggleable = Wrapped => componentFromStream((props$) => {
// toogleHandler  привязывается на onClick
  const { handler: toogleHandler, stream: toogle$ } = createEventHandler();
// вызов hideHandler  нижек
  const { handler: hideHandler, stream: hide$ } = createEventHandler();

  const show$ = Observable.merge(
    toogle$.mapTo('toogle'),
    hide$.mapTo('hide'))
          .startWith(false)
          .scan((state, type) => {
            if (type === 'toogle') {
              return !state;
            }
            if (type === 'hide') {
              return false;
            }

            return state;
          });


  return props$
    .combineLatest(
      show$,
      (props, show) => (
        <Wrapped
          {...props}
          show={show}
          onToggle={toogleHandler}
          onHide={hideHandler}
        />
      ));
});

class Foo extends Component {
    constructor(props) {
      super(props);
      this.refButton.bind(this);
      this.documentClick$ = Observable.fromEvent(global.document, 'click')
        .filter(event => this.button !== event.target)
        .do((event) => { this.props.onHide(event); });
    }

    componentDidMount() {
      this.documentClick$.subscribe();
    }
    componentWillUnmount() {
      this.documentClick$.unsubscribe();
    }
    refButton = (ref) => {
      this.button = ref;
    }
}
  • Вопрос задан
  • 406 просмотров
Решения вопроса 1
Чтот типа:
const show$ = Observable.merge(
    toogle$.map(() => state => !state),
    hide$.startWith({}).map(() => () => false)
)
          .scan((state, action) => action(state), false);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
18 апр. 2024, в 21:56
2000 руб./за проект
18 апр. 2024, в 21:00
150 руб./за проект