上午review 代码的时候, 发现一些问题, 关于逻辑复用的一些小技巧。 而后就花点时间整理了下, 作了个例子, 聊一下 render props.html
简单点讲, render props 就一种在组件间共享逻辑的技巧。 把一些渲染逻辑以prop 的形式传递给 Component, 把注意力集中在渲染逻辑上。react
处理组件的渲染逻辑。git
当你发现组件中有重复的逻辑或者模式的时候。好比:github
光说不练假把式, 一块儿看个例子。this
想了想, 写个表吧, 会动的那种(年会毛都没中,给个手环也好啊..)。spa
一番操做以后, 咱们花了一个表:code
如今咱们又想换个表带, 改怎么作? 重写一个吗? 显然不是。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.
若是咱们啥也不传, 获得的将是一个空空如也的表盘:
这时候能够给他加个 DefaultFace, 显示 HH:mm
static defaultProps = { face: date => <DefaultFace date={date} />, }
很赞。
如今给他换个样子, 骚黄色:
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;
心满意足。
这时候咱们的render 是这样的:
class App extends Component { render() { return ( <Watch /> <Watch face={date => <SecondsFace date={date} />} /> </div> ); } }
如此这般, 能够把其余款式的表都写了:
舒服~
年会又又又又啥也没中的心情放佛获得了安抚。
完整代码在这里: 代码 ,喜欢的能够给个星星。
Live Demo : codeOpen
Dos 👍
Dont's 👎
Notes ⚠️
children
。:)
若有纰漏, 欢迎指正,谢谢。
更多参考: