HOC는 코드 재사용 문제를 해결하기 위해 고안되었습니다. createClass 패러다임에서는 이러한 문제를 mixins으로 해결하였습니다. ES6 classes 가 등장하고 createClass는 사라지기 시작했습니다. 하지만 ES6 클래스는 mixins을 지원하지 않는다는 문제점이 있었습니다. 그 결과 HOC가 등장하였으며 재사용에 대한 이슈를 해결한 듯 보였지만, 기존 mixins이 가지고 있던 모든 이슈들을 해결한 건 아니였습니다. Render Props를 사용하면 mixins과 HOC가 가지고 있는 문제점들을 해결할 수 있습니다.
번역/참고
https://cdb.reacttraining.com/use-a-render-prop-50de598f11ce
https://hackernoon.com/do-more-with-less-using-render-props-de5bcdfbe74c
Render Props 패턴은 함수로 이루어진 props를 이용하여
컴포넌트 간 코드를 공유하는 방법입니다.
<DataProvider render={data => (
<h1>Hello {data.target}</h1>
)}/>
import React from 'react'
import ReactDOM from 'react-dom'
import PropTypes from 'prop-types'
// Instead of using a HOC, we can share code using a
// regular component with a render prop!
class Mouse extends React.Component {
static propTypes = {
render: PropTypes.func.isRequired
}
state = { x: 0, y: 0 }
handleMouseMove = (event) => {
this.setState({
x: event.clientX,
y: event.clientY
})
}
render() {
return (
<div style={{ height: '100%' }} onMouseMove={this.handleMouseMove}>
{this.props.render(this.state)}
</div>
)
}
}
const App = React.createClass({
render() {
return (
<div style={{ height: '100%' }}>
<Mouse render={({ x, y }) => (
// The render prop gives us the state we need
// to render whatever we want here.
<h1>The mouse position is ({x}, {y})</h1>
)}/>
</div>
)
}
})
ReactDOM.render(<App/>, document.getElementById('app'))
여기서 핵심은 <Mouse> 컴포넌트는 스스로 render prop를 불러서 자신의 state를 <App> 컴포넌트에 노출시키고 있습니다.번역/참고
https://cdb.reacttraining.com/use-a-render-prop-50de598f11ce
https://hackernoon.com/do-more-with-less-using-render-props-de5bcdfbe74c
Comments
Post a Comment