javascript - 使用 RxJS 在 cycle.js 中进行条件渲染

标签 javascript rxjs reactive-programming jsx rxjs5

我有一个非常简单的条件渲染场景,如果 props.showCalc 为 true,我将渲染 calculator,如果为 false,我将渲染 标题:

function view(sources) {
  const props$ = sources.props
  const titleVDom$ = Title(sources).DOM
  const calcVDom$ = Calculator(sources).DOM
  const vdom$ = props$
    .map((props) =>
      <section className="hero is-fullheight is-primary">
        <div className="hero-head">
        </div>
        <div className="hero-body">
          {props.showCalc ? {calcVDom$} : {titleVDom$}}
        </div>
        <div className="hero-foot">
        </div>
      </section>
    )
  return vdom$
}

这行不通,因为您无法将流 DOM 传递给 JSX 进行渲染。我总是必须映射流 DOM 才能渲染它。

在这种情况下,我如何呈现 {calcVDom$}{titleVDom$}?照原样,它们都呈现“未定义”,因为它们是流。

我尝试将 calcVDom$/titleVDom$ 映射到渲染函数的一半,但它变得非常困惑。

最佳答案

在将它们映射到 JSX 之前,您可以链接流并合并结果吗?有点像

function view(sources) {

  const props$ = sources.props;
  const titleVDom$ = Title(sources).DOM;
  const calcVDom$ = Calculator(sources).DOM;

  const vdom$ = props$
    .mergeMap((props) => titleVDom$.map((title) => [ props, title ]))
    .mergeMap((data) => calcVDom$.map((calc) => data.push(calc)))
    .map((data) =>
      <section className="hero is-fullheight is-primary">
      <div className="hero-head">
      </div>
      <div className="hero-body">
        {data[0].showCalc ? {data[2]} : {data[1]}}
      </div>
      <div className="hero-foot">
      </div>
    </section>
  );

  return vdom$;
}

您也可以使用 forkJoin 实现相同的目的:

function view(sources) {

  const props$ = sources.props;
  const titleVDom$ = Title(sources).DOM;
  const calcVDom$ = Calculator(sources).DOM;

  return Rx.Observable.forkJoin([
    props$,
    titleVDom$,
    calcVDom$
  ]).map((data) =>
      <section className="hero is-fullheight is-primary">
      <div className="hero-head">
      </div>
      <div className="hero-body">
        {data[0].showCalc ? {data[2]} : {data[1]}}
      </div>
      <div className="hero-foot">
      </div>
    </section>
  );
}

不同之处在于 forkJoin 将同时订阅所有 Observable(触发任何操作),而 mergeMap 方法将它们链接起来,仅在(如果)前面的 Observable 发出值时触发第二个和第三个。

关于javascript - 使用 RxJS 在 cycle.js 中进行条件渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42640065/

相关文章:

javascript - reSTLet、suitelet、suite talk 之间有什么区别

javascript - 如何创建一个 redux-observable 史诗,它在做任何事情之前等待 2 个 Action

java - 如何在 RxJava Vert.x 中结束链式 http 请求?

java - 在while循环中构建Flux对象

javascript - 需要获取所有子组件实例的所有值并在父方法: ReactJS中使用它

javascript - HTML <select> 元素是否可以在不运行页面范围的 javascript 的情况下将默认的 selectedIndex 设置为 -1?

Angular2,systemjs,无法使用 Rx.umd.js

javascript - Rx订阅方法如何在不传递上下文的情况下保留上下文

system.reactive - Reactive Extensions Switch() 在搜索中

javascript - 图像字段的 Css 正常大小