Search

Props

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
볡사

μ‹€μŠ΅2

β€œμƒν’ˆ λͺ©λ‘ UI λ§Œλ“€κΈ°β€