三分钟掌握 React render props

clipboard.png

上午review 代码的时候, 发现一些问题, 关于逻辑复用的一些小技巧。 而后就花点时间整理了下, 作了个例子, 聊一下 render props.html


what is it ?

简单点讲, render props 就一种在组件间共享逻辑的技巧。 把一些渲染逻辑以prop 的形式传递给 Component, 把注意力集中在渲染逻辑上。react

What do render props do?

处理组件的渲染逻辑。git

When to use ?

当你发现组件中有重复的逻辑或者模式的时候。好比:github

  • 重复的UI结构
  • 共享某个数据源
  • 共享某个全局事件(好比scroll, resize, ...)

A live demo

光说不练假把式, 一块儿看个例子。this

想了想, 写个表吧, 会动的那种(年会毛都没中,给个手环也好啊..)。spa

一番操做以后, 咱们花了一个表:code

clipboard.png

如今咱们又想换个表带, 改怎么作? 重写一个吗? 显然不是。component

这时候就轮到 render props 登场了。orm

咱们能够把一个个部分独立出来, 把有差别的部分看成prop 传入就能够了。htm

上代码:

class Watch extends Component {
  state = {
    date: moment(),
  }
  
  static propTypes = {
    face: PropTypes.func,
  }
  
  static defaultProps = {
    face: date => <DefaultFace date={date} />,
  }
  
  componentDidMount = () => (this.TICK = setInterval(this.update, 1000))
  
  componentWillUnmount = () => clearInterval(this.TICK)
  
  update = () => this.setState({ date: moment() })
  
  render = () => (
    <Strap>
      <Bezel>
        <Screen>
          <Face>{this.props.face(this.state.date)}</Face>
        </Screen>
      </Bezel>
    </Strap>
  )
}

不用关注 Strap, Bezel, Screen 这些, 咱们只看关键点: Face.

若是咱们啥也不传, 获得的将是一个空空如也的表盘:

clipboard.png

这时候能够给他加个 DefaultFace, 显示 HH:mm

static defaultProps = {
    face: date => <DefaultFace date={date} />,
  }

clipboard.png

很赞。

如今给他换个样子, 骚黄色:

const SecondsFace = ({ date }) => {
  const hours = date.format('HH')
  const minutes = date.format('mm')
  const seconds = date.format('ss')
  return (
    <>
      <Value>{hours}</Value>
      <Value>{minutes}</Value>
      <Value>{seconds}</Value>
    </>
  )
}
SecondsFace.propTypes = watchfacePropTypes;

clipboard.png

心满意足。

这时候咱们的render 是这样的:

class App extends Component {
  render() {
    return (
        <Watch />
        <Watch face={date => <SecondsFace date={date} />} />
      </div>
    );
  }
}

如此这般, 能够把其余款式的表都写了:

clipboard.png

舒服~

年会又又又又啥也没中的心情放佛获得了安抚。

完整代码在这里: 代码 ,喜欢的能够给个星星。

Live Demo : codeOpen

Tips

  • Dos 👍

    • 当有组件能够共享或者部分渲染逻辑重复的时候
  • Dont's 👎

    • 宁肯不用也不要滥用
    • 避免在使用PureComponents 的时候用render Props. 除非你的prop 是静态定义的。
  • Notes ⚠️

    • Render Prop 只是一个技巧,名字啥均可以, 好比 children
    • 大部分能够用Render Prop的场景, 也能够用HOC 实现, 反之亦然。

That's it.

:)

若有纰漏, 欢迎指正,谢谢。

更多参考:

https://reactjs.org/docs/rend...

相关文章
相关标签/搜索