JavaScript/React

[React] State

newkr 2024. 7. 16. 00:23
728x90

๐Ÿ“ข State.. useState!

 Java๋ฅผ ๋‹ค๋ฃจ๋‹ค๊ฐ€ JavaScript์˜ ํ•จ์ˆ˜๋“ค์„ ์ ‘ํ•˜๋ฉด ๊ฐ€๋”์”ฉ ๊นœ์ง ๋†€๋ž€๋‹ค. ํŠนํžˆ, React์™€ ๊ฐ™์€ ํ”„๋ก ํŠธ์—”๋“œ์ชฝ์— ๋Œ€ํ•œ ๊ณต๋ถ€๋ฅผ ํ•˜๋‹ค๋ณด๋ฉด ์ •๋ง ์ƒˆ๋กœ์šด ์„ธ์ƒ์„ ์ ‘ํ•˜๋Š” ๊ฒƒ ๊ฐ™์€ ๋А๋‚Œ์ด ๋“ ๋‹ค. ์˜ค๋Š˜ ๊ฐ„๋‹จํžˆ ํฌ์ŠคํŒ…ํ•  useState ํ•จ์ˆ˜๋„ ๊ทธ ์ค‘ ํ•˜๋‚˜๋‹ค.

 ๋‚œ State๋Š” ๋ณด๋‹ค ํŽธํ•œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์œ„ํ•œ React ๋‚ด ์ง€์› ํ•จ์ˆ˜๋ผ๊ณ  ์ •๋ฆฌํ–ˆ๋‹ค. ์ธํ„ฐ๋„ท์„ ๋’ค์ ธ๋ณด๋ฉด ๋” ์ •ํ™•ํ•œ ์ •์˜๋‚˜ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์„ค๋ช…์€ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๋‹ค๋งŒ, ๋‚˜๋Š” ๋‚˜์˜ ์–ธ์–ด๋กœ ๊ฐœ๋…์„ ์ •๋ฆฌํ•  ๋ฟ์ด๋‹ค. ๋ฌผ๋ก .. ์•„์ฃผ ๋งŽ์ด ์—‡๋‚˜๊ฐ”๋‹ค๋ฉด ๋ˆ„๊ตฐ๊ฐ€ ์ง€์ ํ•ด์ฃผ์‹œ๊ธธ ๋ฐ”๋ž„ ๋ฟ์ด๋‹ค.
 ๋ง์ด ์ž ๊น ๋‹ค๋ฅธ ๊ณณ์œผ๋กœ ์ƒœ๋‹ค. ๋ณด๋‹ค ํŽธํ•œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์œ„ํ•œ ํ•จ์ˆ˜๋ผ๋Š” ๊ฒƒ์€ ์–ด๋–ค ๊ฐ’์— ๋Œ€ํ•œ ์ƒํƒœ๋ฅผ ์ฃผ์‹œํ•˜๋‹ค๊ฐ€ ํ•ด๋‹น ๊ฐ’์— ๋Œ€ํ•œ ๋ณ€ํ™”๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์–ด๋– ํ•œ ๋™์ž‘์„ ํ•ด์ฃผ๊ฒ ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์ฆ‰, PC์˜ ์‹œ๊ณ„๋ฅผ ๋ณด๋ฉด ์‹œ, ๋ถ„, ์ดˆ๊ฐ€ ๋ณ€ํ™”ํ•  ๋•Œ๋งˆ๋‹ค ๋ณ€ํ™”๋˜๋Š” ์ˆซ์ž๋ฅผ ๊ฐ์ง€ํ•ด์„œ ํ™”๋ฉด์— ์ƒˆ๋กœ ๊ทธ๋ ค์ฃผ๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋Ÿฌํ•œ ๋™์ž‘์„ ์‰ฝ๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ์ดํ•ดํ•˜๋ฉด ํŽธํ•  ๊ฒƒ ๊ฐ™๋‹ค.

โŒจ๏ธ ์˜ˆ์ œ ์ฝ”๋“œ

์•„๋ž˜ ์ฝ”๋“œ๋Š” React ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ  ์žˆ๋Š” ๋…ธ๋งˆ๋“œ์ฝ”๋”์˜ React ๊ณผ์ • ํด๋ก  ์ฝ”๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์˜จ ๊ฒƒ์ด๋‹ค. (๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ๋‹ˆ๊ผฌ์Œค~)

// UseState๋ฅผ ํ†ตํ•ด ์ž‘์„ฑํ•œ JavaScript ์ปดํฌ๋„ŒํŠธ ์˜ˆ์ œ
function MinutesToHours() {
        const [amount, setAmount] = React.useState(0)
        const [inverted, setInverted] = React.useState(false)

        const onChange = (event) => {
            setAmount(event.target.value)
        }
        const reset = () => setAmount(0)
        const onInvert = () => {
            reset()
            setInverted((current) => !current)
        }

        return (
            <div>
                <div>
                    <label htmlFor="minutes">Minutes</label>
                    <input
                        value={inverted ? amount * 60 : amount}
                        id="minutes"
                        placeHolder="Minutes"
                        type="number"
                        onChange={onChange}
                        disabled={inverted}
                    />
                </div>
                <div>
                    <label htmlFor="hours">Hours</label>
                    <input
                        value={inverted ? amount : Math.floor(amount / 60)}
                        id="hours"
                        placeHolder="Hours"
                        type="number"
                        onChange={onChange}
                        disabled={!inverted}
                    />
                </div>
                <button onClick={reset}>Reset</button>
                <button onClick={onInvert}>
                    {inverted ? "Turn back" : "Invert"}
                </button>
            </div>
        )
    }

 return ๋ฌธ์€ JSX๋กœ ๋˜์–ด ์žˆ๋‹ค. ์ค‘๊ฐ„์ค‘๊ฐ„ ์ค‘๊ด„ํ˜ธ๋กœ ์ž…๋ ฅ๋˜์–ด ์žˆ๋Š” ๋ถ€๋ถ„๋“ค์€ JavaScript๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ํ•จ์ˆ˜ ๋‚ด ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜, ๊ฐ„๋‹จํ•œ ๋กœ์ง์„ ๋„ฃ์–ด๋†“์€ ์ฝ”๋“œ๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ๋„˜๊ธฐ๋ฉด ๋œ๋‹ค. ํฌ๊ฒŒ ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ๋ง์ด๋‹ค.

 ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ ๊ฐ€์žฅ ์ƒ๋‹จ์— const [] ๋กœ ์ง€์ •๋˜์–ด ์žˆ๋Š” ๋ณ€์ˆ˜์ด๋‹ค. const [x, y] = React.useState(0); ํ˜•ํƒœ๋กœ ๋˜์–ด ์žˆ๋Š” ๋ถ€๋ถ„์ด ๋ฐ”๋กœ ์˜ค๋Š˜์˜ ์ฃผ์ธ๊ณต์ด๋‹ค. x๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ฐ์‹œํ•  ์ƒํƒœ๊ฐ’์œผ๋กœ ์ดํ•ดํ•˜๋ฉด ๋˜๊ณ , y๋Š” x์˜ ๊ฐ’์„ ์ƒˆ๋กœ ๋ณ€ํ™”์‹œํ‚ค๋Š” setter๋กœ ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ ๋กœ์ง์„ ์ด์šฉํ•ด์„œ onChange๋‚˜ onInvert๋ผ๋Š” ํ•จ์ˆ˜ ๋‚ด์— ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ถ”๊ฐ€๋กœ useState() ์•ˆ์— ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” x์— ๋Œ€ํ•œ ์ดˆ๊ธฐ๊ฐ’์ด๋‹ค.

 ์ •๋ฆฌํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ œ๊ณตํ•˜๋Š” event์— ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ๊ฐ’๋“ค์„ setter ํ•จ์ˆ˜์— ๋„ฃ๊ณ , x๊ฐ’์„ event์— ๋งž์ถฐ์„œ ์ตœ์‹ ํ™”ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์š”์•ฝํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

728x90

'JavaScript > React' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[React] Props  (0) 2024.08.01
[React] JSX  (0) 2024.07.14