javascript - 如何使用 Rxjs 实现切换

标签 javascript reactjs rxjs recompose

我正在学习 rxjs。我为 Dropdown 组件创建装饰器“toggleable”。一切正常,但我不喜欢它。如何删除条件“切换/隐藏”。

使用 rxjs、react.js、重构。 它是 Dropdown 组件的可切换装饰器。

export const toggleable = Wrapped => componentFromStream((props$) => {
// toogleHandler  called  with onClick
  const { handler: toogleHandler, stream: toogle$ } = createEventHandler();
// hideHandler called with code below
  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}
        />
      ));
});

它是下拉按钮的装饰器

  // hideHandler caller
        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;
            }
        }

最佳答案

您可以通过将 toggle$/hide$ 映射到先前状态的函数来实现无条件显示 $:

const show$ = Observable.merge(
    toggle$.mapTo(prev => !prev),
    hide$.mapTo(prev => false))
        .startWith(false)
        .scan((state, changeState) => changeState(state));

您可以做的另一项改进是可切换的实现。您可以使用 recompose mapPropsStream 而不是使用 recompose componentFromStream| :

export const toggleable = mapPropsStream(props$ => {
    const { handler: toogleHandler, stream: toogle$ } = createEventHandler();
    const { handler: hideHandler, stream: hide$ } = createEventHandler();
    const show$ = Observable.merge(
        toggle$.map(() => prev => !prev),
        hide$.map(() => prev => false))
            .startWith(false)
            .scan((state, changeState) => changeState(state));

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

关于javascript - 如何使用 Rxjs 实现切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43950064/

相关文章:

javascript - jQuery : Access data-link attribute

reactjs - React Redux : More containers v. 秒。更少的容器

angular - 在 typescript 函数中返回 2 种不同类型的最佳实践?

video - 如何使用 react-native-camera 录制视频

angular - 除了异步管道之外,还有另一种自动订阅/取消订阅可观察对象的方法吗?

javascript - 了解 RxJS 的 Flatmap,C# 术语中的 FlatmapLatest

javascript - Sencha Touch 2 + PhoneGap + iPad : Video with base64 encoded data: "The Operation could not be completed"

javascript - 如何防止在移动 View 中截取网页?

javascript - React Query - useInfiniteQuery,如何在获取下一页时避免组件刷新

javascript - 购物车实现 React-Redux