三分钟掌握 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...


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

查看所有标签

猜你喜欢:

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

第三次工业革命

第三次工业革命

[美] 杰里米•里夫金(Jeremy Rifkin) / 张体伟 / 中信出版社 / 2012-5 / 45.00元

第一次工业革命使19世纪的世界发生了翻天覆地的变化 第二次工业革命为20世纪的人们开创了新世界 第三次工业革命同样也将在21世纪从根本上改变人们的生活和工作 在这本书中,作者为我们描绘了一个宏伟的蓝图:数亿计的人们将在自己家里、办公室里、工厂里生产出自己的绿色能源,并在“能源互联网”上与大家分享,这就好像现在我们在网上发布、分享消息一样。能源民主化将从根本上重塑人际关系,它将影响......一起来看看 《第三次工业革命》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

SHA 加密
SHA 加密

SHA 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器