1. Render Props
Render Props = ๋ฌด์์ ๋ ๋๋ง ํ ์ง ์ปดํฌ๋ํธ์ ์๋ ค์ฃผ๋ ํจ์
-
React ์ปดํฌ๋ํธ ๊ฐ์ ์ฝ๋๋ฅผ ๊ณต์ ํ๊ธฐ ์ํด ํจ์ props๋ฅผ ์ด์ฉํ๋ ๋ฒ
-
์ฝ๋ ์ฌ์ฌ์ฉ์ ์ํ ๋ฐฉ๋ฒ ์ค ํ๋
( Composition | HOC | Render Props ... ) -
Render = (๋ญ๊ฐ) ์ ๊ณต, ์ฃผ๋ค
-
Render Props๋ฅผ ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ React Router, Downshift, Formik
1<DataProvider render={data => <h1>Hello {data.target}</h1>} />
Render Props ํจํด์ผ๋ก ๊ตฌํ๋ ์ปดํฌ๋ํธ๋ ์์ฒด์ ์ผ๋ก ๋ ๋๋ง ๋ก์ง์ ๊ตฌํํ๋ ๋์ , React ์๋ฆฌ๋จผํธ ์์๋ฅผ ๋ฐํํ๊ณ ์ด๋ฅผ ํธ์ถํ๋ ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
2. ํก๋จ ๊ด์ฌ์ฌ(Cross-Cutting Concerns)
Cross-Cutting Concerns
- ์ปดํฌ๋ํธ A, B, C ๊ฐ์ ๊ณตํต๋ ๊ธฐ๋ฅ์ ํ ๋, ํต์ฌ ์ ์ธ ๊ธฐ๋ฅ์ด ์๋ ์ค๊ฐ์ค๊ฐ ์ฝ์ ๋์ด์ผ ํ ๊ธฐ๋ฅ๋ค
- e.g. ๋ก๊น , ๋ณด์, ํธ๋์ญ์ ์ฒ๋ฆฌ ๋ฑ ๋น์ฆ๋์ค ํต์ฌ์ ์ธ ๊ธฐ๋ฅ์ด ์๋ ๋ค์ํ ํก๋จ ๊ด์ฌ์ด ๋ฐ์
- c.f.
๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ(Aspect Oriented Programming; AOP)- ํก๋จ ๊ด์ฌ์ฌ(cross-cutting concern)์ ๋ถ๋ฆฌ๋ฅผ ํ์ฉํจ์ผ๋ก์จ, ๋ชจ๋์ฑ์ ์ฆ๊ฐ์ํค๋ ๊ฒ์ด ๋ชฉ์ ์ธ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์
- ๋ค์ ๋งํด, ์ฝ๋ ์์์ ๊ฐ๊ฐ์ ๊ด์ ์ ํต์ฌ์ ์ธ ๊ด์ ๊ณผ, ๋ถ๊ฐ์ ์ธ ๊ด์ ์ผ๋ก ๋๋์ด๋ณด๊ณ ,
- ๊ทธ ๊ด์ ์ ๊ธฐ์ค์ผ๋ก ๊ฐ๊ฐ ๋ถ๋ฆฌํ๋ ๊ฒ์ ์๋ฏธ
3. ์์
๋ง์ฐ์ค๋ฅผ ๋ฐ๋ผ๋ค๋๋ ์ด๋ฏธ์ง๋ฅผ ๋ถ์ด๊ณ ์ถ์ผ๋ฉด?
1import React, { useState } from 'react'2import styled from 'styled-components'34// ๋ง์ฐ์ค๊ฐ ์์ง์ผ ๋๋ง๋ค ์ขํ๋ฅผ ์ ์ ์๋ Mouse ์ปดํฌ๋ํธ5export default function Mouse() {6const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 })78const handleMouseMove = event => {9setMousePosition({ x: event.clientX, y: event.clientY })10}1112return (13<div style={{ height: '100vh' }} onMouseMove={handleMouseMove}>14<Image position={mousePosition} />15Mouse X = {mousePosition.x} Y = {mousePosition.y}16</div>17)18}1920// styled components ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ ์ด๋ฏธ์ง ๋์ ์ฌ์ฉํจ21const Image = styled.div`22width: 30px;23height: 30px;24background-color: red;25position: absolute;26left: ${({ position }) => position.x}px;27top: ${({ position }) => position.y}px;28`
์์ ๊ฐ์ด ํ๋์ฝ๋ฉํ๋ฉด, ๋ค๋ฅธ ์ด๋ฏธ์ง๋ฅผ ๋ ๋๋ง ํ๊ณ ์ถ์ ๋ ๋๋ค์ ํ๋์ฝ๋ฉ์ผ๋ก ๋ฐ๊ฟ์ผ ํ๋ค.
1import Mouse from './components/renderProps/Mouse'2import Image from './components/renderProps/Image'34export default function App() {5return (6<div>7{/* Mouse ์ปดํฌ๋ํธ์ render props๋ก ๋ ๋๋ง ํ ์ปดํฌ๋ํธ๋ฅผ ๋๊น */}8<Mouse render={position => <Image position={position} />} />9</div>10)11}
๊ทธ๋์ ์ฌ์ฌ์ฉ์ ์ํด์๋ Mouse ์ปดํฌ๋ํธ์ render props๋ก ๋ ๋๋ง ํ ์ปดํฌ๋ํธ๋ฅผ ๋๊ฒจ์ค๋ค.
1import React, { useState } from 'react'23// 1. props๋ก render๋ฅผ ๋ฐ์4export default function Mouse({ render }) {5const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 })67const handleMouseMove = event => {8setMousePosition({ x: event.clientX, y: event.clientY })9}1011return (12<div style={{ height: '100vh' }} onMouseMove={handleMouseMove}>13{render(mousePosition)}14๋ง์ฐ์ค์ X์ขํ = {mousePosition.x}, Y์ขํ = {mousePosition.y}15</div>16)17}
Mouse ์ปดํฌ๋ํธ์์ props๋ก render๋ฅผ ๋ฐ์์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์ด๋ค ์ด๋ฏธ์ง๋ฅผ ๋๊ฒจ์ฃผ์ด๋ ์ฌ์ฉ ๊ฐ๋ฅ