Props (์์ฑ)
๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์์ ์ปดํฌ๋ํธ๋ก ์ ๋ฌํ๊ธฐ ์ํ ๋ฐ์ดํฐ
properties ์ ์ค์๋ง
์ธ๋ถ์์ ์ ๋ฌ๋๋ ๋งค๊ฐ๋ณ์. ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์์ ์ปดํฌ๋ํธ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
์ด๊ฒ์ด React ์ปดํฌ๋ํธ ๊ฐ์ ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ์ฃผ์ ๋ฉ์ปค๋์ฆ ์ค ํ๋์
๋๋ค. ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ ์์ ์ปดํฌ๋ํธ์๊ฒ props๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ณ , ์์ ์ปดํฌ๋ํธ๋ ์ด๋ฅผ ํ์ฉํ์ฌ ํ๋ฉด์ ์ ๋ณด๋ฅผ ํ์ํ๊ฑฐ๋ ํน์ ๋์์ ์ํํ ์ ์์ต๋๋ค.
React์์๋ props๋ฅผ ํตํ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ์ ๋ฌ์ด ์ฃผ์ํ ํจํด์
๋๋ค.
๋จ, ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ Redux, Context API ๋ฑ์ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ ๊ฐ์ ๋ฐ์ดํฐ ํ๋ฆ์ ์กฐ๊ธ ๋ ์ ์ฐํ๊ฒ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
์์ ์ปดํฌ๋ํธ์์ ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก ๋ฐ์ดํฐ๋ฅผ ๋๊ธฐ๋ ๋ฒ
- ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ props ๋ก ํจ์๋ฅผ ๋ด๋ ค์ฃผ๊ณ , ์์ ์ปดํฌ๋ํธ์์ ๊ทธ ํจ์๋ฅผ ํธ์ถํ๋ฉด์ ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ ํ ์ ์์ต๋๋ค.
์ค์ต ์ฝ๋
โข
์ค์ต1 : โ์ํ ์์ธ UI ๋ง๋ค๊ธฐ - propsโ
โข
์ค์ต2 : โ์ํ ๋ชฉ๋ก UI ๋ง๋ค๊ธฐโ
์ค์ต1
โ์ํ ์์ธ UI ๋ง๋ค๊ธฐ - propsโ
โ์ํ ์์ธ UI ๋ง๋ค๊ธฐ - propsโ ์์๋ ์ฌ์ ์ค์ต ํ ์ด์ด์ ์ค์ตํฉ๋๋ค.
์ฌ์ ์ค์ต - State
์ฌ์ ์ค์ต์์ ์์ ์ปดํฌ๋ํธ์์ ์ ์ํ ์ํ ์ ๋ณด ๊ฐ์ฒด(product) ๋ฅผ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์ ์ํ๊ณ ์ด๋ฅผ props ๋ก ์ ๋ฌํ๋ ์ค์ต์ ํด๋ด
๋๋ค.
์ฌ์ ์ค์ต
์์ ํ ํ์ผ
โข
componets/ProductDetail.jsx
โข
App.js
์ปดํฌ๋ํธ ๊ตฌ์กฐ
โข
App
โฆ
ProductDetail
App, ProductDetail ์ปดํฌ๋ํธ - props ์ฌ์ฉ
componets/ProductDetail.jsx
import React, { useState } from 'react'
const ProductDetail = ({ product }) => { // โ
props โก { product } ๐ฉโ๐ซ ๊ฐ์ฒด ๊ตฌ์กฐ๋ถํดํ ๋น
// state ์ถ๊ฐ
const [quantity, setQuntity] = useState(1)
// product{} โก App.js ์ด๋
// ์ต์ข
๊ฐ๊ฒฉ ๊ณ์ฐ
const totalPrice = product.price * quantity
// ์ด๋ฒคํธ ์ ์ - ์ฆ๊ฐ
const onIncrease = () => {
console.log(quantity);
setQuntity(quantity + 1)
}
// ์ด๋ฒคํธ ์ ์ - ๊ฐ์
const onDecrease = () => {
console.log(quantity);
setQuntity(quantity - 1)
}
return (
<div className='product-detail'>
<div className="item img">
<img src={product.img} alt={product.name} />
</div>
<div className="item info">
<div className="title">
<h1>{product.name}</h1>
</div>
<p>
<span className='txt-pt'>INFO</span><br />
-ํธ์ํ ์ฐฉ์ฉ์ด ๊ฐ๋ฅํ ํด๋ผ ๋์์ธ <br />
-์ฒดํ ์ปค๋ฒ๊ฐ ๊ฐ๋ฅํ ๋ฒ ์ด์งํ ์ค๋ฃจ์ฃ <br />
</p>
<p>
<span className="txt-pt">Color & Size</span> <br />
Black, Navy, Red <br />
85, 90, 95, 100, 110 <br />
- ์ด๊นจ 53, ๊ฐ์ด 59, ์ํ 23, ์๋งค 62, ์ด์ฅ 68 <br />
(์ธก์ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ 1~3cm ์ค์ฐจ๊ฐ ์์ ์ ์์ต๋๋ค) <br />
</p>
<span className='line-lg'></span>
<div className="text-group">
<div className="item">
<span className='txt-pt'>ํ๋งค๊ฐ</span>
</div>
<div className="item">
<span className='txt-pt'>{product.price.toLocaleString()} ์</span>
</div>
</div>
<div className="text-group">
<div className="item">
<span>๋ฐฐ์ก๋น</span>
</div>
<div className="item">
<span>3,000</span> ์
</div>
</div>
<span className="line-lg"></span>
<div className="text-group">
<div className="item">
<span>Color</span>
</div>
<div className="item">
<select name="color" id="color">
<option value="Black">Black</option>
<option value="Navy">Navy</option>
<option value="Red">Red</option>
</select>
</div>
</div>
<div className="text-group">
<div className="item">
<span>Size</span>
</div>
<div className="item">
<select name="color" id="color">
<option value="85">85</option>
<option value="90">90</option>
<option value="95">95</option>
<option value="100">100</option>
<option value="110">110</option>
</select>
</div>
</div>
<div className="text-group">
<div className="item">
<span>์๋</span>
</div>
<div className="item flex">
<input type="text" className='quantity' value={quantity} min={1} max={100} /> {/* value ๋ฅผ state ๋ก ๋ณ๊ฒฝ */}
<button className='btn btn-xs' onClick={ onIncrease }>+</button> {/* ์ด๋ฒคํธ ์ถ๊ฐ */}
<button className='btn btn-xs' onClick={ onDecrease }>-</button> {/* ์ด๋ฒคํธ ์ถ๊ฐ */}
</div>
</div>
<span className="line-lg"></span>
<div className="text-group">
<div className="item">
<span className='txt-pt'>์ต์ข
๊ฐ๊ฒฉ</span>
</div>
<div className="item">
<span className='txt-pt'>{totalPrice.toLocaleString()} ์</span>
</div>
</div>
<div className="text-group flex gap-1">
<div className="item">
<button className="btn btn-lg">๊ตฌ๋งคํ๊ธฐ</button>
</div>
<div className="item flex">
<button className="btn btn-lg btn-outline">์ฅ๋ฐ๊ตฌ๋</button>
<button className="btn btn-lg btn-outline">๊ด์ฌ์ํ</button>
</div>
</div>
</div>
</div>
)
}
export default ProductDetail
JavaScript
๋ณต์ฌ
App.js
import logo from './logo.svg';
import './App.css';
import ProductDetail from './components/ProductDetail';
function App() {
// โ
๊ฐ์ฒด ๊ฐ์ ธ์ด
const product = {
productId : 'p000001',
name : '๋ฒ ์ด์ง ํด๋ผ ๋ํธ',
price : 42000,
quantity : 1,
img: 'https://i.imgur.com/1vpSkbW.png',
}
return (
<div>
<ProductDetail product={product} />
</div>
);
}
export default App;
JavaScript
๋ณต์ฌ