zoukankan      html  css  js  c++  java
  • [Recompose] Stream Props to React Children with RxJS

    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)
          )
      }
    );

  • 相关阅读:
    弹性盒布局(Flexbox布局)
    CSS子元素在父元素中水平垂直居中的几种方法
    Vue中watch用法详解
    深入理解vue中的slot与slot-scope
    Spring 源码学习 03:创建 IoC 容器的几种方式
    Spring 源码学习 02:关于 Spring IoC 和 Bean 的概念
    Spring 源码阅读环境的搭建
    DocView 现在支持自定义 Markdown 模版了!
    Dubbo 接口,导出 Markdown ,这些功能 DocView 现在都有了!
    线程池 ThreadPoolExecutor 原理及源码笔记
  • 原文地址:https://www.cnblogs.com/Answer1215/p/8087390.html
Copyright © 2011-2022 走看看