๊ณต๋ถ€ ๊ธฐ๋ก โœ๏ธ/React

[React] study (์กฐ๊ฑด๋ถ€๋ Œ๋”๋ง) #4์ผ์ฐจ

๋ฒ„๋‘˜ 2023. 4. 13. 20:31

๐Ÿ“– ์ฐธ๊ณ  ์„œ์ :

์†Œํ”Œ์˜ ์ฒ˜์Œ ๋งŒ๋‚œ ๋ฆฌ์•กํŠธ 

๐Ÿ“†  ์ง„ํ–‰

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;