三分钟掌握 React render props

栏目: 服务器 · 发布时间: 6年前

内容简介:上午review 代码的时候, 发现一些问题, 关于逻辑复用的一些小技巧。 然后就花点时间整理了下, 做了个例子, 聊一下 render props.简单点讲, render props 就一种在组件间共享逻辑的技巧。 把一些渲染逻辑以prop 的形式传递给 Component, 把注意力集中在渲染逻辑上。

三分钟掌握 React render props

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

what is it ?

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

What do render props do?

处理组件的渲染逻辑。

When to use ?

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

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

A live demo

光说不练假把式, 一起看个例子。

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

一番操作之后, 我们花了一个表:

三分钟掌握 React render props

现在我们又想换个表带, 改怎么做? 重写一个吗? 显然不是。

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

我们可以把一个个部分独立出来, 把有差异的部分当作prop 传入就可以了。

上代码:

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.

如果我们啥也不传, 得到的将是一个空空如也的表盘:

三分钟掌握 React render props

这时候可以给他加个 DefaultFace, 显示 HH:mm

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

三分钟掌握 React render props

很赞。

现在给他换个样子, 骚黄色:

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;

三分钟掌握 React render props

心满意足。

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

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

如此这般, 可以把其他款式的表都写了:

三分钟掌握 React render props

舒服~

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

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

Live Demo : codeOpen

Tips

  • Dos :+1:

    • 当有组件可以共享或者部分渲染逻辑重复的时候
  • Dont's :-1:

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

    children
    

That's it.

:)

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

更多参考:

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


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

软利器

软利器

保罗·莱文森 / 何道宽 / 复旦大学出版社 / 2011-5 / 35.00元

《软利器:信息革命的自然历史与未来》内容简介:何谓“软利器”?一种轻盈、透明、无质无形、难以把握的力量,由信息和物理载体构成,这就是媒介。了解媒介的属性和演化规律的人,常占尽优势:反之则身处险境。是不是有些危言耸听? 如果你看过保罗•莱文森的这本《软利器:信息革命的自然历史与未来》,或许就会深信不疑。在书中,莱文森如同一位经验丰富的航海家,带领你穿越媒介时空——你将邂逅古埃及的法老、古希腊的......一起来看看 《软利器》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

随机密码生成器
随机密码生成器

多种字符组合密码