
๐ ์ฐธ๊ณ ์์ :
์ํ์ ์ฒ์ ๋ง๋ ๋ฆฌ์กํธ
๐ ์งํ
chapter 9 ์กฐ๊ฑด๋ถ ๋ ๋๋ง โ
chapter 10 ๋ฆฌ์คํธ์ ํค โ
chapter 11 ํผ โ
09.์กฐ๊ฑด๋ถ ๋ ๋๋ง
์กฐ๊ฑด๋ถ ๋ ๋๋ง
์กฐ๊ฑด์ ๋ฐ๋ผ ๋ ๋๋ง์ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋๋ก ํ๋ ๊ฒ
์๋ฆฌ๋จผํธ ๋ณ์
๋ฆฌ์กํธ ์๋ฆฌ๋จผํธ๋ฅผ ๋ณ์์ฒ๋ผ ์ ์ฅํด์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
์ธ๋ผ์ธ ์กฐ๊ฑด
์กฐ๊ฑด๋ฌธ์ ์ฝ๋ ์์ ์ง์ด๋ฃ๋ ๊ฒ
- ์ธ๋ผ์ธif : &&์ฌ์ฉ
- ์ธ๋ผ์ธif-else : ์ผํญ์ฐ์ฐ์ ์ฌ์ฉ
์ปดํฌ๋ํธ ๋ ๋๋ง ๋ง๊ธฐ
null์ ๋ฆฌํดํ๋ค.
์ค์ต์ฝ๋
toolbar.jsx
import React from "react";
const styles={
wrapper:{
padding:16,
display:"flex",
flexDirection:"row",
borderBottom:"1px solid grey"
},
greeting:{
marginRight:0
}
};
function Toolbar(props){
const {isLoggedIn,onClickLogin,onClickLogout}=props;
return(
<div style={styles.wrapper}>
{isLoggedIn && <span style={styles.greeting}>ํ์ํฉ๋๋ค</span>}
{isLoggedIn?(<button onClick={onClickLogout}>๋ก๊ทธ์์</button>):
(<button onClick={onClickLogin}>๋ก๊ทธ์ธ</button>)}
</div>
);
}
export default Toolbar;
LandingPage.jsx
import React,{useState} from "react";
import Toolbar from "./Toolbar";
function LandingPage(props){
const [isLoggedIn,setIsLoggedIn]=useState(false);
const onClickLogin=()=>{
setIsLoggedIn(true);
};
const onClickLogout=()=>{
setIsLoggedIn(false);
};
return(
<div>
<Toolbar
isLoggedIn={isLoggedIn}
onClickLogin={onClickLogin}
onClickLogout={onClickLogout}
/>
<div style={{padding:16}}>sh์ ํจ๊ปํ๋ ๋ฆฌ์กํธ ๊ณต๋ถ!</div>
</div>
);
}
export default LandingPage;
10 ๋ฆฌ์คํธ์ ํค
๋ฆฌ์คํธ
๊ฐ์ ์์ดํ ์ ์์๋๋ก ๋ชจ์๋์ ๊ฒ
ํค
๊ฐ ๊ฐ์ฒด๋ ์์ดํ ์ ๊ตฌ๋ถํ ์ ์๋ ๊ณ ์ ํ ๊ฐ
์ฌ๋ฌ ๊ฐ์ ์ปดํฌ๋ํธ ๋ ๋๋ง
์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฐ์ด์ map()ํจ์ ์ฌ์ฉ
- ๋ฐฐ์ด์ ๋ค์ด์๋ ๊ฐ ๋ณ์์ ์ด๋ค ์ฒ๋ฆฌ๋ฅผ ํ ๋ค ๊ฒฐ๊ณผ(์๋ฆฌ๋จผํธ)๋ฅผ ๋ฐฐ์ด๋ก ๋ง๋ค์ด์ ๋ฆฌํดํจ
- map()ํจ์ ์์ ์๋ ์๋ฆฌ๋จผํธ๋ ๊ผญ ํค๊ฐ ํ์ํจ
*map()ํจ์
ํ์ชฝ์ ์๋ ์์ดํ ๊ณผ ๋ค๋ฅธ ํ์ชฝ์ ์๋ ์์ดํ ์ ์ง์ง์ด ์ค๋ค๋ ์๋ฏธ
๋ฐฐ์ด์ ๋ค์ด์๋ ๊ฐ ๋ณ์์ ์ด๋ค ์ฒ๋ฆฌ๋ฅผ ํ ๋ค ๋ฆฌํดํ๋ ๊ฒ
๋ฆฌ์คํธ์ ํค
๋ฆฌ์คํธ์์ ์์ดํ ์ ๊ตฌ๋ถํ๊ธฐ ์ํ ๊ณ ์ ํ ๋ฌธ์์ด
๋ฆฌ์คํธ์์ ์ด๋ค ์์ดํ ์ด ๋ณ๊ฒฝ,์ถ๊ฐ ๋๋ ์ ๊ฑฐ๋์๋์ง ๊ตฌ๋ถํ๊ธฐ ์ํด ์ฌ์ฉ
๋ฆฌ์กํธ์์๋ ํค์ ๊ฐ์ ๊ฐ์ ๋ฆฌ์คํธ์ ์๋ ์๋ฆฌ๋จผํธ ์ฌ์ด์์๋ง ๊ณ ์ ํ ๊ฐ์ด๋ฉด ๋จ
์ค์ต์ฝ๋
import React from "react";
const students=[
{
id:1,
name:"James"
},
{
id:2,
name:"Steve"
},
{
id:3,
name:"Mina"
},
{
id:4,
name:"Stella"
}
];
function AttendanceBook(props){
return(
<ul>
{students.map((student)=>{
return <li key={student.id}>{student.name}</li>
})}
</ul>
);
}
export default AttendanceBook;
11 ํผ
ํผ์ด๋?
์ฌ์ฉ์๋ก๋ถํฐ ์ ๋ ฅ์ ๋ฐ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์์
๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ ๋ด๋ถ์์ state๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌ
์ ์ด ์ปดํฌ๋ํธ
์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๊ฐ์ ์ ๊ทผํ๊ณ ์ ์ดํ ์ ์๋๋ก ํด์ฃผ๋ ์ปดํฌ๋ํธ
์ฆ, ๊ทธ ๊ฐ์ด ๋ฆฌ์กํธ์ ํต์ ๋ฅผ ๋ฐ๋ ์ ๋ ฅ ํผ ์๋ฆฌ๋จผํธ
input type="text" ํ๊ทธ
ํ ์ค๋ก ํ ์คํธ๋ฅผ ์ ๋ ฅ๋ฐ๊ธฐ ์ํ HTMLํ๊ทธ
value๋ผ๋ attribute๋ก ์ ๋ ฅ๋ ๊ฐ์ ๊ด๋ฆฌ
textateaํ๊ทธ
์ฌ๋ฌ ์ค์ ๊ฑธ์ณ์ ๋์ฌ ์ ๋๋ก ๊ธด ํ ์คํธ๋ฅผ ์ ๋ ฅ๋ฐ๊ธฐ ์ํ HTMLํ๊ทธ
<textatea value={value} onChange={handleChange}/>
state๋ก๋ value๊ฐ ์๊ณ , ์ด ๊ฐ์ textareaํ๊ทธ์ value ๋ผ๋ attribute์ ๋ฃ์ด์ค์ผ๋ก์จ ํ๋ฉด์ ๋ํ๋๊ฒ ๋๋ค.
value๋ผ๋ attribute๋ก ์ ๋ ฅ๋ ๊ฐ์ ๊ด๋ฆฌ
selectํ๊ทธ
๋๋กญ๋ค์ด ๋ชฉ๋ก์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํ HTMLxorm
์ฌ๋ฌ ์ต์ ์ค ํ๋๋ฅผ ์ ํํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค
๋ฆฌ์กํธ์์๋ selectํ๊ทธ์ value๋ผ๋ attribute๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ํ์ํ๋ค
value๋ผ๋ attribute๋ก ์ ํ๋ ์ต์ ์ ๊ฐ์ ๊ด๋ฆฌ
<select value={value} onChange={handleChange}>
<option value="dog">๊ฐ์์ง</option>
<option value="cat">๊ณ ์์ด</option>
<option value="pig">๋ผ์ง</option>
</select>
๋ชฉ๋ก์์ ๋ค์ค์ผ๋ก ์ ํ์ด ๋๋๋ก ํ๋ ค๋ฉด multiple์ด๋ผ๋ ์์ฑ๊ฐ์ true๋ก ํ๊ณ , value๋ก ์ ํ๋ ์ต์ ์ ๊ฐ์ด ๋ค์ด์๋ ๋ฐฐ์ด์ ๋ฃ๋๋ค
<select multiple={true} value={['dog','pig']}>
File inputํ๊ทธ
<input type="file/>
์ฝ๊ธฐ์ ์ฉ, ์ฆ ๋น์ ์ด ์ปดํฌ๋ํธ
๋๋ฐ์ด์ค์ ์ ์ฅ ์ฅ์น๋ก๋ถํฐ ์ฌ์ฉ์๊ฐ ํ๋ ๋๋ ์ฌ๋ฌ ๊ฐ์ ํ์ผ์ ์ ํํ ์ ์๊ฒ ํด์ฃผ๋ HTMLํ๊ทธ
์๋ฒ๋ก ํ์ผ์ ์ ๋ก๋ํ๊ฑฐ๋ JS์ FileAPI๋ฅผ ์ฌ์ฉํด์ ํ์ผ์ ๋ค๋ฃฐ๋ ์ฌ์ฉ
์ฌ๋ฌ ๊ฐ์ ์ ๋ ฅ ๋ค๋ฃจ๊ธฐ
์ฌ๋ฌ ๊ฐ์ state๋ฅผ ์ ์ธํ์ฌ ๊ฐ๊ฐ์ ์ ๋ ฅ์ ๋ํด ์ฌ์ฉํ๋ค.
์์ค์ฝ๋
import React,{useState} from "react";
function Reservation(props){
const [haveBreakfast,setHaveBreakfast]=useState(true);
const [numberOfGuest,setNumberOfGuest]=useState(2);
const handleSubmit=(e)=>{
alert(`์์นจ์์ฌ ์ฌ๋ถ:${haveBreakfast},๋ฐฉ๋ฌธ๊ฐ ์:${numberOfGuest}`);
e.preventDeafault();
}
return(
<div>
<form onSubmit={handleSubmit}>
<label>
์์นจ์์ฌ ์ฌ๋ถ:
<input
type="checkbox"
checked={haveBreakfast}
onChange={(e)=>{
setHaveBreakfast(e.target.checked);
}}/>
</label>
<br/>
<label>
๋ฐฉ๋ฌธ๊ฐ ์:
<input
type="number"
value={numberOfGuest}
onChange={(e)=>{
setNumberOfGuest(e.target.value);
}}/>
</label>
<button type="submit">์ ์ถ</button>
</form>
</div>
);
}
export default Reservation;
input Null value
prop์ ๋ฃ๋, ์์ ๋กญ๊ฒ ์ ๋ ฅํ ์ ์๊ฒ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด ๊ฐ์ undefined ๋๋ null์ ๋ฃ๋๋ค.
<input value={null} />
์ค์ต์ฝ๋ (์ฌ์ฉ์ ์ ๋ณด ์ ๋ ฅ๋ฐ๊ธฐ)
import React,{useState} from "react";
function SignUp(props){
const[name,setName]=useState("");
const[gender,setGender]=useState("์ฌ์");
const handleChangeName=(event)=>{
setName(event.target.value);
};
const handleSubmit=(event)=>{
alert(`์ด๋ฆ : ${name} ์ฑ๋ณ : ${gender}`);
event.preventDeafault();
};
const handleChangeGender=(event)=>{
setGender(event.target.value);
}
return(
<div>
<form onSubmit={handleSubmit}>
<label>
์ด๋ฆ:
<input type="text" value={name} onChange={handleChangeName}/>
</label>
<br/>
<label>
์ฑ๋ณ:
<select value={gender} onChange={handleChangeGender}>
<option value="๋จ์">๋จ์</option>
<option value="์ฌ์">์ฌ์</option>
</select>
</label>
<button type="submit">์ ์ถ</button>
</form>
</div>
);
}
export default SignUp;'๊ณต๋ถ ๊ธฐ๋ก โ๏ธ > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [React] study (Context) #5์ผ์ฐจ (0) | 2023.04.15 |
|---|---|
| [React] study (state,) #3์ผ์ฐจ (0) | 2023.04.12 |
| [React] study (JSX,์๋ฆฌ๋จผํธ) #2์ผ์ฐจ (0) | 2023.04.11 |
| [React] study (๋ฆฌ์กํธ ์์ํ๊ธฐ) #1์ผ์ฐจ (0) | 2023.04.10 |
| [React] React study #0 (0) | 2023.04.10 |