โ๏ธ Props
- ๋ถ๋ชจ ์ปดํฌ๋ํธ์ state๋ฅผ props ๋ฌธ๋ฒ์ ์ด์ฉํด ์์ ์ปดํฌ๋ํธ๋ก ์ ์กํ๋ฉด ์์๋ ์ฌ์ฉ ๊ฐ๋ฅ.
โ๏ธ props๋ก ๋ถ๋ชจ → ์์ state ์ ์กํ๋ ๋ฒ
1. ์์ ์ปดํฌ๋ํธ ์ฌ์ฉํ๋ ๊ณณ์ ๊ฐ์ <์์์ปดํฌ๋ํธ ์๋ช
= { state ์ด๋ฆ} />
2. ์์ ์ปดํฌ๋ํธ ๋ง๋๋ function์ผ๋ก ๊ฐ์ props๋ผ๋ ํ๋ผ๋ฏธํฐ ๋ฑ๋ก ํ props. ์๋ช
์ด์ฉ
๐โ๏ธ ์์
function App (){
let [๊ธ์ ๋ชฉ, ๊ธ์ ๋ชฉ๋ณ๊ฒฝ] = useState(['๋จ์์ฝํธ ์ถ์ฒ', '๊ฐ๋จ ์ฐ๋๋ง์ง', 'ํ์ด์ฌ๋
ํ']);
return (
<div>
<Modal ๊ธ์ ๋ชฉ={๊ธ์ ๋ชฉ}></Modal> <!-- < ์์์ปดํฌ๋ํธ ์๋ช
={state ์ด๋ฆ} /> -->
</div>
)
}
// props ๋ฑ๋ก
function Modal(props){
return (
<div className="modal">
<h4>{ props.๊ธ์ ๋ชฉ[0] }</h4> <!-- props.์๋ช
-->
<p>๋ ์ง</p>
<p>์์ธ๋ด์ฉ</p>
</div>
)
}
โ๏ธ props๋ ํจ์ ํ๋ผ๋ฏธํฐ ๋ฌธ๋ฒ๊ณผ ๋๊ฐ๋ค!
function Modal(props){
return (
<div className="modal" style={{ background : props.color }}>
<h4>{ props.๊ธ์ ๋ชฉ[0] }</h4>
<p>๋ ์ง</p>
<p>์์ธ๋ด์ฉ</p>
</div>
)
}
- props.color ์ด๋ฐ ์์ผ๋ก ๊ตฌ๋ฉ์ ๋ซ์ด๋์ผ๋ฉด ์ด์ ์ปดํฌ๋ํธ ์ฌ์ฉํ ๋ <Modal color={'red'} /> ์ด๋ฌ๋ฉด ํ๋์ ๋ชจ๋ฌ์ฐฝ์ด ์์ฑ๋๋ค!
๐โ๏ธ ํด๋ฆญํ ๊ธ์ ๋ชฉ์ด ๋ชจ๋ฌ์ฐฝ ์์ ๋จ๊ฒ ํ๊ธฐ!
1. html css๋ก ๋ฏธ๋ฆฌ ๋์์ธ
2. ํ์ฌ UI์ ์ํ๋ฅผ state๋ก ๋ง๋ค๊ธฐ
3. state ์ข
๋ฅ์ ๋ฐ๋ผ UI๊ฐ ์ด๋ป๊ฒ ๋ณด์ผ์ง ์์ฑ
function App (){
let [๊ธ์ ๋ชฉ, ๊ธ์ ๋ชฉ๋ณ๊ฒฝ ] = useState(['์ฝํธ ์ถ์ฒ', '์ฐ๋ ๋ง์ง ์ถ์ฒ']);
let [๋ฐ๋ด, ๋ฐ๋ด๋ณ๊ฒฝ] = useState(0);
let [modal, setModal] = useState(false);
let [title, setTitle] = useState(0);
return (
<div>
{
๊ธ์ ๋ชฉ.map(function(a, i){
return (
<div className="list">
<h4 onClick={()=>{ setModal(true); setTitle(i); }}>{ ๊ธ์ ๋ชฉ[i] }</h4>
<p>2์ 18์ผ ๋ฐํ</p>
</div> )
})
}
</div>
)
}
function Modal(props){
return (
<div className="modal">
<h4>{ props.๊ธ์ ๋ชฉ[props.title] }</h4> <!-- title์ ๋ถ๋ชจ๊ฐ ๊ฐ์ง state์ด๋ฏ๋ก ์์์ด ์ฌ์ฉํ ๋ props๋ก ์ ์ก -->
<p>๋ ์ง</p>
<p>์์ธ๋ด์ฉ</p>
</div>
)
}
โ๏ธ state๋ฅผ ์์ ์ปดํฌ๋ํธ์ ๋ง๋ค์ด๋ฒ๋ฆฌ๋ฉด props ์ ์ก์ด ํ์ํ๊ฐ?
ํ์ํ์ง ์๋ค! title๊ฐ์ state๋ ์์์ปดํฌ๋ํธ ์์ ๋ง๋ค๋ฉด ํธ๋ฆฌํ๊ฒ ์ง๋ง ์ง๊ธ title์ด๋ผ๋ state๋ App๋ ์ฐ๊ณ Modal๋ ์ฐ๊ณ ์๋ค.
๊ทธ๋ ๊ฒ ๋ค์ํ ์ปดํฌ๋ํธ์์ ์ฐ์ด๋ state๋ ์ปดํฌ๋ํธ๋ค ์ค ์ต๊ณ ๋ก ๋์ ๋ถ๋ชจ์๊ฒ ๋ง๋ค์ด๋์ผํ๋ค.
โ๏ธ <input> ํ๊ทธ ์ฌ์ฉํ๊ธฐ
<input type="text"/>
<input type="range"/>
<input type="date"/>
<input type="number"/>
<textarea></textarea>
<select></select>
- ์ ์ ์ ์ ๋ ฅ์ ๋ฐ์ ์ ์๋ ๋ฐ์ค๋ฅผ ์์ฑํ๊ณ ์ถ์ผ๋ฉด HTML์์๋ ์์ ๊ฐ์ ํ๊ทธ ์ด์ฉ ๊ฐ๋ฅ
โ๏ธ <input>์ ๋ญ๊ฐ ์
๋ ฅ์ ์ฝ๋๋ฅผ ์คํํ๋ ค๋ฉด
- onChange, onInput ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ถ์ฐฉ
<input onChange={()=>{ ์คํํ ์ฝ๋ }}/>
โ๏ธ <input>์ ์
๋ ฅํ ๊ฐ ๊ฐ์ ธ์ค๋ ๋ฒ
- e๋ผ๋ ํ๋ผ๋ฏธํฐ ์ถ๊ฐ, e.target.value๋ผ๊ณ ์ ๊ธฐ.
- ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ๋ค์ด๊ฐ๋ ํจ์์ ์ ๋ ๊ฒ ํ๋ผ๋ฏธํฐ e๋ฅผ ์ถ๊ฐํ๋ฉด e๋ ์ด๋ฒคํธ ๊ฐ์ฒด.,๋ผ๊ณ ๋ถ๋ฅด๋๋ฐ ํ๋ ๋ฐ์ํ๋ ์ด๋ฒคํธ์ ๊ด๋ จ๋ ์ ์ฉํ ๊ธฐ๋ฅ๋ค์ ์ ๊ณตํ๋ ์ผ์ข
์ ๋ณ์๋ค! ( ์๋ช
์ e ๋ง๊ณ ์์ ๋กญ๊ฒ ๊ฐ๋ฅ)
- e.target: ํ์ฌ ์ด๋ฒคํธ ๋ฐ์ํ ๊ณณ ์๋ ค์ฃผ๊ธฐ
- e.preventDefault(): ์ด๋ฒคํธ ๊ธฐ๋ณธ ๋์ ๋ง๊ธฐ
- e.stopPropagation(): ์ด๋ฒคํธ ๋ฒ๋ธ๋ง ๋ง๊ธฐ ( ์๋ฅผ ๋ค๋ฉด ์ข์์ ๋ฒํผ ๋๋ฅผ ๋ ๋ชจ๋ฌ์ฐฝ๋ ๊ฐ์ด ๋ ๋ฒ๋ฆฌ๋ ๋ฒ๊ทธ ํด๊ฒฐ ๊ฐ๋ฅ)
<input onChange={(e)=>{ console.log(e.target.value) }}/>
โ๏ธ ์ฌ์ฉ์๊ฐ input์ ์
๋ ฅํ ๋ฐ์ดํฐ ์ ์ฅํ๊ธฐ
- ์ฌ์ฉ์๊ฐ input์ ์
๋ ฅํ ๋ฐ์ดํฐ๋ state ์๋๋ฉด ๋ณ์์ ์ ์ฅํด์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ .
function App (){
let [์
๋ ฅ๊ฐ, ์
๋ ฅ๊ฐ๋ณ๊ฒฝ] = useState(''); // ๋ฐ์ํ 2๊ฐ๋ ๋น๋ฌธ์๋ฅผ ๋ปํจ
return (
<input onChange={(e)=>{
์
๋ ฅ๊ฐ๋ณ๊ฒฝ(e.target.value)
console.log(์
๋ ฅ๊ฐ)
}} />
)
}
- ์ฐธ๊ณ ! state ๋ณ๊ฒฝํจ์๋ ๋น๋์ (async)์ด๊ฒ ์ฒ๋ฆฌ๋์ ์ฒ๋ฆฌ ์๋๊ฐ ์ฝ๊ฐ ๋ฆ๋ค. ๊ทธ๋ฆฌ๊ณ js์์ ๋ฆ๊ฒ ์ฒ๋ฆฌ๋๋ ์ฝ๋๋ค์ ์ ๊น ์ ์น๊ณ ๋ฐ๋ก ๋ค์์ค์ ์คํํ๋ค. ๋ฐ๋ผ์ console.log(์ ๋ ฅ๊ฐ) ์ด๊ฒ ๋จผ์ ์คํ๋๋ค.
โ๏ธ ์ค์ต
๐โ๏ธ ๊ธ ๋ฐํ ๊ธฐ๋ฅ
function App (){
let [๊ธ์ ๋ชฉ, ๊ธ์ ๋ชฉ๋ณ๊ฒฝ] = useState(['๋จ์์ฝํธ์ถ์ฒ', '๊ฐ๋จ์ฐ๋๋ง์ง', 'ํ์ด์ฌ๋
ํ']);
let [์
๋ ฅ๊ฐ, ์
๋ ฅ๊ฐ๋ณ๊ฒฝ] = useState('');
return (
<div>
<input onChange={ (e)=>{ ์
๋ ฅ๊ฐ๋ณ๊ฒฝ(e.target.value) } } />
<button onClick={()=>{
let copy = [...๊ธ์ ๋ชฉ]; <!-- ๋ฒํผ ๋๋ฅด๋ฉด ์ผ๋จ ๊ธ์ ๋ชฉ state ์นดํผ -->
copy.unshift(์
๋ ฅ๊ฐ); <!-- unshift: array ์๋ฃ ๋งจ ์์ ์๋ฃ ์ถ๊ฐ -->
๊ธ์ ๋ชฉ๋ณ๊ฒฝ(copy) <!-- state ๋ณ๊ฒฝ ํจ์ ์ฌ์ฉ -->
}}>๊ธ๋ฐํ</button>
</div>
)
}
โ๏ธ์ฐธ๊ณ : ์๋ ๋ธ๋ผ์ฐ์ ๋ ์๋ก๊ณ ์นจํ๋ฉด html, js ํ์ผ์ ๋ค์ ์ฝ๋๋ค. ๋ค์ ์ฝ๊ฒ ๋๋ฉด state๋ ๋ณ์๊ฐ์ ๊ฒ๋ค๋ ์ด๊ธฐ๊ฐ์ผ๋ก ๋ณ๊ฒฝ๋จ. ๋ฐ๋ผ์ ํ๋ก ํธ์๋๋ง ๊ตฌํํ์ ๊ฒฝ์ฐ ์๋ก๊ณ ์นจํ๋ฉด ์ฌ๋ผ์ง๋ค.
๐โ๏ธ ๊ธ๋ง๋ค ์ญ์ ๋ฒํผ๊ณผ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ
function App (){
let [๊ธ์ ๋ชฉ, ๊ธ์ ๋ชฉ๋ณ๊ฒฝ] = useState(['๋จ์์ฝํธ์ถ์ฒ', '๊ฐ๋จ์ฐ๋๋ง์ง', 'ํ์ด์ฌ๋
ํ']);
let [์
๋ ฅ๊ฐ, ์
๋ ฅ๊ฐ๋ณ๊ฒฝ] = useState('');
return (
<div>
{
๊ธ์ ๋ชฉ.map(function(a, i){
return (
<div className="list">
<h4>{ ๊ธ์ ๋ชฉ[i] }</h4>
<p>2์ 18์ผ ๋ฐํ</p>
<button onClick={()=>{
let copy = [...๊ธ์ ๋ชฉ]; <!-- ๋ฒํผ ๋๋ฅด๋ฉด ๊ธ์ ๋ชฉ state ๋ณต์ฌ -->
copy.splice(i, 1); <!-- array์๋ฃ์์ x๋ฒ์งธ ๋ฐ์ดํฐ ์ญ์ -->
๊ธ์ ๋ชฉ๋ณ๊ฒฝ(copy);
}}>์ญ์ </button>
</div>
)
})
}
</div>
)
}
๋ณธ ํฌ์คํ ์ << React ๋ฆฌ์กํธ ๊ธฐ์ด๋ถํฐ ์ผํ๋ชฐ ํ๋ก์ ํธ๊น์ง! >> ๊ฐ์๋ฅผ ์ฐธ๊ณ ํฉ๋๋ค.
'Frontend ๐ > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ฝ๋ฉ์ ํ] ์ผํ๋ชฐ ํ๋ก์ ํธ Part1 - React Bootstrap ๋ผ์ด๋ธ๋ฌ๋ฆฌ, export default / import ๋ฌธ๋ฒ (0) | 2023.10.16 |
---|---|
[ ์ฝ๋ฉ์ ํ ] React ๋ฆฌ์กํธ ๊ธฐ์ด Part5 (1) | 2023.10.14 |
[ ์ฝ๋ฉ์ ํ ] React ๋ฆฌ์กํธ ๊ธฐ์ด Part3 (0) | 2023.10.14 |
[ ์ฝ๋ฉ์ ํ ] React ๋ฆฌ์กํธ ๊ธฐ์ด Part2 (1) | 2023.10.11 |
[ ์ฝ๋ฉ์ ํ ] React ๋ฆฌ์กํธ ๊ธฐ์ด Part1 (2) | 2023.10.11 |