ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [React] State & Props & ๋ Œ๋”๋ง ์ •์˜
    codeStates front-end/React 2023. 1. 25. 23:11
    ๋ฐ˜์‘ํ˜•

     

     

     

     

     

     

    ๐Ÿ“Œ๋ฆฌ์•กํŠธ ๊ฐœ๋…

     

     

    ๐Ÿ“State & Props

     

    State : ์‚ด๋ฉด์„œ ๋ณ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’(์ƒํƒœ)

                ์ปดํฌ๋„ŒํŠธ์˜ ์‚ฌ์šฉ ์ค‘ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๋ณ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’

     

    Props : ์„ฑ๋ณ„์ด๋‚˜ ์ด๋ฆ„์ฒ˜๋Ÿผ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’

     

    ex) ์–ด๋–ค๊ฒƒ์ด Props ๋˜๋Š” State์— ์ ํ•ฉํ• ๊นŒ?

     

    • ์ด๋ฆ„
    • ์„ฑ๋ณ„
    • ๋‚˜์ด
    • ํ˜„์žฌ ์‚ฌ๋Š” ๊ณณ
    • ์ทจ์—… ์—ฌ๋ถ€
    • ๊ฒฐํ˜ผ/์—ฐ์•  ์—ฌ๋ถ€

    ์ •๋‹ต : Props - ์ด๋ฆ„, ์„ฑ๋ณ„ State - ์„ฑ๋ณ„, ๋‚˜์ด, ์ด๋ฆ„, ํ˜„์žฌ ์‚ฌ๋Š” ๊ณณ, ์ทจ์—… ์—ฌ๋ถ€, ๊ฒฐํ˜ผ/์—ฐ์•  ์—ฌ๋ถ€

     

     

    props์˜ ํŠน์ง•

     

    ์ปดํฌ๋„ŒํŠธ ์†์„ฑ(property)

    ์›น์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ€์ง„ ์†์„ฑ์— ํ•ด๋‹น

    ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ(์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ)๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’

    ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ตœ์ดˆ ๋ Œ๋”๋ง ๋  ๋•Œ ํ™”๋ฉด์— ์ถœ๋ ฅํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์€ ์ดˆ๊นƒ๊ฐ’

    ๊ฐ์ฒด ํ˜•ํƒœ

    ์ฝ๊ธฐ ์ „์šฉ์ด๋‹ค

    -> ํ•จ๋ถ€๋กœ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์—†๋Š” ์ฝ๊ธฐ ์ „์šฉ ๊ฐ์ฒด

     

    ๐Ÿ’ก๋ Œ๋”๋ง์ด ๋ฌด์—‡์ธ๊ฐ€์š”? ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ HTML ํŒŒ์ผ์„ ๋ฐ›์•„ ๋ธŒ๋ผ์šฐ์ €์— ๋ฟŒ๋ ค์ฃผ๋Š” ๊ณผ์ •

    • HTML์„ ํŒŒ์‹ฑํ•˜์—ฌ DOM ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ ๋‹ค.
    • CSS๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ CSSOM ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ ๋‹ค.
    • DOM ๊ณผ CSSOM ์„ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ Œ๋”๋ง ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ ๋‹ค.
    • ๋ Œ๋”๋ง ํŠธ๋ฆฌ์—์„œ ๊ฐ ๋…ธ๋“œ์˜ ํฌ๊ธฐ์™€ ์œ„์น˜๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.
    • ๊ฐœ๋ณ„ ๋…ธ๋“œ๋ฅผ ํ™”๋ฉด์— ๊ทธ๋ฆฐ๋‹ค.

     

    How to use props1

     

    1. ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’(data)๊ณผ ์†์„ฑ์„ ์ •์˜ํ•œ๋‹ค.
    2. props๋ฅผ ์ด์šฉํ•˜์—ฌ ์ •์˜๋œ ๊ฐ’๊ณผ ์†์„ฑ์„ ์ „๋‹ฌํ•œ๋‹ค.
    3. ์ „๋‹ฌ๋ฐ›์€ props๋ฅผ ๋ Œ๋”๋งํ•œ๋‹ค.

     

    ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ(Parent) / ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ(child)

     

    function Parent() {
      return (
        <div className="parent">
          <h1>I'm the parent</h1>
          <Child />
        </div>
      );
    };
    
    function Child() {
      return (
        <div className="child"></div>
      );
    };

     

    ์ „๋‹ฌํ•˜๊ณ ์žํ•˜๋Š” ์†์„ฑ์„ ์ •์˜

     

    function Parent() {
      return (
        <div className="parent">
          <h1>I'm the parent</h1>
          <a href="www.codestates.com">Click me to visit Code States</a>
    	<Child attribute={value} /> // React์—์„œ JSX ์†์„ฑ ๋ฐ ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ๋ฐฉ๋ฒ• 1
    	<Child text={"I'm the eldest child"} /> // React์—์„œ JSX ์†์„ฑ ๋ฐ ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ๋ฐฉ๋ฒ• 2
        </div>
      );
    };

     

    ์ „๋‹ฌ๋œ ์ปดํฌ๋„ŒํŠธ ๋ฐ›๊ธฐ

     

    function Child(props) { // ํ•จ์ˆ˜์— ์ธ์ž๋ฅผ ์ „๋‹ฌํ•˜๋“ฏ react ์ปดํฌ๋„ŒํŠธ์— props๋ฅผ ์ „๋‹ฌ
      return (
        <div className="child"></div> // ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ด
      );
    };

     

     

    props ๋ Œ๋”๋ง

     

    function Child(props) {
      return (
        <div className="child">
          <p>{props.text}</p> // { attribute : value }์˜ ํ˜•ํƒœ๋ฅผ  dot notation์œผ๋กœ ์ ‘๊ทผ
        </div>
      );
    };

     

     

    ์‹คํ–‰ ๊ฒฐ๊ณผ

     

    import "./styles.css";
    
    function Parent() {
      return (
        <div className="parent">
          <h1>I'm the parent</h1>
          <Child text={"I'm the eldest child"} />
          {/* Child ์ปดํฌ๋„ŒํŠธ์— ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ž์—ด์„ props ๋กœ ์ „๋‹ฌํ•ด ๋ณด์„ธ์š” */}
          <Child />
        </div>
      );
    }
    
    function Child(props) {
      // console ์„ ์—ด์–ด props ์˜ ํ˜•ํƒœ๋ฅผ ์ง์ ‘ ํ™•์ธํ•˜์„ธ์š”.
      console.log("props : ", props);
      return (
        <div className="child">
          <p>{props.text}</p>
        </div>
      );
    }
    
    export default Parent;

     

     

    props ์ „๋‹ฌ๋œ ๊ฒƒ์ด ํ™•์ธ๊ฐ€๋Šฅํ•˜๋‹ค

     

     

     

     

    How to use props2

     

     

    props๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์—ฌ๋Š” ํƒœ๊ทธ์™€ ๋‹ซ๋Š” ํƒœ๊ทธ์˜ ์‚ฌ์ด์— value๋ฅผ ๋„ฃ์–ด ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•

     

    function Parent() {
      return (
        <div className="parent">
            <h1>I'm the parent</h1>
            <Child>I'm the eldest child</Child>
        </div>
      );
    };
    
    function Child(props) {
      return (
        <div className="child">
            <p>{props.children}</p>
        </div>
      );
    };

     

     

     

    ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ• ๋ชจ๋‘ ์‹ค์Šต

     

     

    App ์ปดํฌ๋„ŒํŠธ์— ์žˆ๋Š” itemOne๊ณผ itemTwo๋ฅผ Learn ์ปดํฌ๋„ŒํŠธ์— props๋กœ ์ „๋‹ฌํ•˜์—ฌ, "React๋ฅผ ๋ฐฐ์šฐ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค"

    ๋ผ๋Š” ๋ฌธ์ž์—ด์ด rendering ๋˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์™„์„ฑํ•˜์„ธ์š”.

     

    import "./styles.css";
    
    const App = () => {
    const itemOne = "React๋ฅผ";
    const itemTwo = "๋ฐฐ์šฐ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.";
    
    return (
    <div className="App">
    {/* Learn ์ปดํฌ๋„ŒํŠธ์— itemOne ๊ณผ itemTwo ๋ฅผ
    props ๋กœ ์ „๋‹ฌํ•˜์„ธ์š” */}
    <Learn>{itemOne} </Learn>
    <Learn text = {itemTwo} />
    </div>
    );
    };
    
    const Learn = (props) => {
    // ์ „๋‹ฌ๋ฐ›์€ props ๋ฅผ ์•„๋ž˜ <div> tag ์‚ฌ์ด์— ์‚ฌ์šฉํ•˜์—ฌ
    // "React๋ฅผ ๋ฐฐ์šฐ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค" ๋ผ๋Š” ๋ฌธ์žฅ์ด ๋ Œ๋”๋ง๋˜๋„๋ก ์ปดํฌ๋„ŒํŠธ๋ฅผ ์™„์„ฑํ•˜์„ธ์š”
    return <div className="Learn">
    {props.children}{props.text}
    </div>;
    };
    
    export default App;

     

     

    ์‹คํ–‰ ๊ฒฐ๊ณผ

     

     

     

     

     

     

    ๐Ÿ“ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ "์ƒํƒœ"

    ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ๋ณ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’, ์ฆ‰ ์ƒํƒœ๋Š” React state๋กœ ๋‹ค๋ค„์•ผ ํ•œ๋‹ค

     

    import React, { useState } from "react";
    import "./styles.css";
    
    function CheckboxExample() {
      const [isChecked, setIsChecked] = useState(false);
    
      const handleChecked = (event) => {
        setIsChecked(event.target.checked);
      };
      return (
        <div className="App">
          <input type="checkbox" checked={isChecked} onChange={handleChecked} />
          <span>{isChecked ? "Checked!!" : "Unchecked"}</span>
        </div>
      );
    }
    
    export default CheckboxExample;

     

    State hook, useState

     

    useState ์‚ฌ์šฉ๋ฒ•

     

    React ์—์„œ๋Š” state ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋กœ useState ๋ผ๋Š” ํŠน๋ณ„ํ•œ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณต

     

    useState๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜

    ๋ฐฐ์—ด 0๋ฒˆ์งธ -> ํ˜„์žฌ state ๋ณ€์ˆ˜, ๋ฐฐ์—ด 1๋ฒˆ์งธ -> ์ด ๋ณ€์ˆ˜๋ฅผ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜

    useState์˜ ์ธ์ž๋กœ ๋„˜๊ฒจ์ฃผ๋Š” ๊ฐ’ -> state์˜ ์ดˆ๊นƒ๊ฐ’

     

    const [state ์ €์žฅ ๋ณ€์ˆ˜, state ๊ฐฑ์‹  ํ•จ์ˆ˜] = useState(์ƒํƒœ ์ดˆ๊ธฐ ๊ฐ’);

     

    • isChecked : state๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜
    • setIsChecked : state isChecked ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜
    • useState : state hook
    • false : state ์ดˆ๊นƒ๊ฐ’
    import { useState } from "react"; //useState ํ•จ์ˆ˜ react์—์„œ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
    
    function CheckboxExample() {
      // 1๋ฒˆ ์ฝ”๋“œ๋ฅผ ํ’€์–ด์“ฐ๋ฉด
      const [isChecked, setIsChecked] = useState(false); // 1๋ฒˆ
    
      //...
    
      // 2๋ฒˆ ์ฝ”๋“œ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
      const stateHookArray = useState(false); // 2๋ฒˆ
      const isChecked = stateHookArray[0];
      const setIsChecked = stateHookArray[1];
    }

     

    isChecked ๊ฐ€ boolean ๊ฐ’์„ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— true or false ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋ณด์ด๋„๋ก ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉ

     

     

    <span>{isChecked ? "Checked!!" : "Unchecked"}</span>

     

     

    state ๊ฐฑ์‹ ํ•˜๊ธฐ

     

    state๋ฅผ ๊ฐฑ์‹ ํ•˜๋ ค๋ฉด state ๋ณ€์ˆ˜๋ฅผ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์ธ setIsChecked ๋ฅผ ํ˜ธ์ถœ

    ์‚ฌ์šฉ์ž๊ฐ€ ์ฒดํฌ๋ฐ•์Šค ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด onChange ์ด๋ฒคํŠธ๊ฐ€ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜์ธ handleChecked ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ์ด ํ•จ์ˆ˜๊ฐ€ setIsChecked ๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. setIsChecked ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ํ˜ธ์ถœ๋œ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ isChecked ๋ณ€์ˆ˜๊ฐ€ ๊ฐฑ์‹ ๋˜๋ฉฐ, React๋Š” ์ƒˆ๋กœ์šด isChecked ๋ณ€์ˆ˜๋ฅผ CheckboxExample ์ปดํฌ๋„ŒํŠธ์— ๋„˜๊ฒจ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋ง

     

     

    function CheckboxExample() {
      const [isChecked, setIsChecked] = useState(false);
    
      const handleChecked = (event) => {
        setIsChecked(event.target.checked);
      };
    
      return (
        <div className="App">
          <input type="checkbox" checked={isChecked} onChange={handleChecked} />
          <span>{isChecked ? "Checked!!" : "Unchecked"}</span>
        </div>
      );
    }

     

     

     

    React state ์ฃผ์˜์ 

     

    React ์ปดํฌ๋„ŒํŠธ๋Š” state๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ƒˆ๋กญ๊ฒŒ ํ˜ธ์ถœ๋˜๊ณ , ๋ฆฌ๋ Œ๋”๋ง ๋ฉ๋‹ˆ๋‹ค.

    React state๋Š” ์ƒํƒœ ๋ณ€๊ฒฝ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ•์ œ๋กœ ๋ณ€๊ฒฝ์„ ์‹œ๋„ํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ƒํƒœ ๋ณ€๊ฒฝ ํ•จ์ˆ˜ ์‚ฌ์šฉ์€ React์™€ ๊ฐœ๋ฐœ์ž์˜ ์•ฝ์†์ด๊ธฐ ๋•Œ๋ฌธ์— ์ง€์ผœ์ฃผ์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ•์ œ๋กœ ๋ณ€๊ฒฝ์„ ์‹œ๋„ํ•˜๋ฉด, ๋ฆฌ๋ Œ๋”๋ง์ด ๋˜์ง€ ์•Š๋Š”๋‹ค๊ฑฐ๋‚˜, state๊ฐ€ ์ œ๋Œ€๋กœ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€

Designed by Tistory.