码迷,mamicode.com
首页 > Web开发 > 详细

[Recompose] Stream Props to React Children with RxJS

时间:2017-12-22 20:53:49      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:order   down   back   star   involve   ssi   post   rom   ntb   

You can decouple the parent stream Component from the mapped React Component by using props.children instead. This process involves mapping the stream to React’s cloneElement with the children then passing the props in manually.

 

We have the code below:

import React from "react"
import { render } from "react-dom"
import { Observable } from "rxjs"
import config from "recompose/rxjsObservableConfig"
import {
  setObservableConfig,
  componentFromStream,
  createEventHandler
} from "recompose"

setObservableConfig(config)

const Counter = ({ value, onInc, onDec }) => (
  <div>
    <button onClick={onInc}>+</button>
    <h2>{value}</h2>
    <button onClick={onDec}>-</button>
  </div>
)

const CounterStream = componentFromStream(
  props$ => {

    const { stream: onInc$, handler: onInc } = createEventHandler();
    const { stream: onDec$, handler: onDec } = createEventHandler();

    return props$
      .switchMap(
      propos => Observable.merge(
        onInc$.mapTo(1),
        onDec$.mapTo(-1)
      )
        .startWith(propos.value)
        .scan((acc, curr) => acc + curr)
        .map((value) => ({ value, onInc, onDec })))
      .map(
      Counter
      )
  }
);


const App = () => (
  <div>
    <CounterStream value={3} />
  </div>
)

render(<App />, document.getElementById("root"))

 

Now inside we use:

<CounterStream value={4} />

We want pass child into it:

const App = () => (
  <div>
    <CounterStream value={3}>
      <Counter />
    </CounterStream>
  </div>
)

 

So now, instead we map to Counter map in the JXS, we want to clone the child elemenet and pass down new props:

const CounterStream = componentFromStream(
  props$ => {

    const { stream: onInc$, handler: onInc } = createEventHandler();
    const { stream: onDec$, handler: onDec } = createEventHandler();

    return props$
      .switchMap(
      props => Observable.merge(
        onInc$.mapTo(1),
        onDec$.mapTo(-1)
      )
        .startWith(props.value)
        .scan((acc, curr) => acc + curr)
        .map((value) => ({ ...props, value, onInc, onDec }))
      ).map(props =>
        cloneElement(props.children, props)
      )
  }
);

 

 

[Recompose] Stream Props to React Children with RxJS

标签:order   down   back   star   involve   ssi   post   rom   ntb   

原文地址:http://www.cnblogs.com/Answer1215/p/8087390.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!