React render props模式
render props
模式是封装组件的其中一种方式,由外部指定需要渲染的元素,组件内部把状态传递给它,外部声明一个函数式的props
,函数参数接收内部状态,返回需要渲染的元素
import React from 'react'
class Mouse extends React.Component {
constructor(props) {
super(props)
this.state = {
x: 0,
y: 0
}
}
moveHandle = e => {
this.setState({
x: e.clientX,
y: e.clientY
})
}
componentDidMount () {
window.addEventListener('mousemove', this.moveHandle)
}
componentWillUnmount() {
window.removeEventListener('mousemove', this.moveHandle)
}
render () {
// render props模式,这里渲染的是外面调用的时候传过来的函数的返回值,同时把组件内部的状态传递给外面的函数
// 外面的传递过来的函数不一定要叫render,任何名字都行,同时还可以把函数放在props.children里面
// 这种使用方式被称之为render props模式,实现组件的复用
return this.props.render(this.state)
}
}
export default Mouse
使用
<Mouse render={mouse => <h1>rendre props-鼠标位置:{mouse.x},{mouse.y}</h1>}></Mouse>
上面是一个简单的render props
例子,注意,我们并不是只能使用render
作为属性,随便叫什么属性都行,组件内部用法协商好就行
除了在属性上给定函数,还可以直接在children
中使用,例如
<Mouse>
{mouse => <h1>rendre props-鼠标位置:{mouse.x},{mouse.y}</h1>}
</Mouse>
此时组件内部就需要使用children
获取渲染函数
render () {
return this.props.children(this.state)
}
由于这一技术的特殊性,当你在设计一个类似的 API
时,你或许会要直接地在你的 propTypes
里声明 children
的类型应为一个函数。
Mouse.propTypes = {
children: PropTypes.func.isRequired
};
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 289211569@qq.com