[React] props, state

Updated:

Categories:

Tags: ,

๐Ÿ“Œ ๊ฐœ์ธ์ ์ธ ๊ณต๊ฐ„์œผ๋กœ ๊ณต๋ถ€๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ๋ณต์Šตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.
์ •ํ™•ํ•˜์ง€ ์•Š์€ ์ •๋ณด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ฐธ๊ณ ๋ฐ”๋ž๋‹ˆ๋‹ค :๐Ÿ˜ธ
[ํ‹€๋ฆฐ ๋‚ด์šฉ์€ ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์‹œ๋ฉด ๋ณต๋ฐ›์œผ์‹ค๊ฑฐ์—์š”]

React state & Props

state, props์˜ ๊ฐœ๋…

  1. State
    1. ์‚ด๋ฉด์„œ ๋ณ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’
    2. ์ปดํฌ๋„ŒํŠธ์˜ ์‚ฌ์šฉ ์ค‘ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๋ณ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’
  2. Props
    1. ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ ๋ฐ›์€ ๊ฐ’
  3. State vs Props
    1. Tweeter์— ์žˆ๋Š” ์†์„ฑ๊ฐ’๋“ค์€ State์ผ๊นŒ? Props์ผ๊นŒ?
      1. ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ์— ๊ท€์†๋œ ๊ฐ’์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— Props์— ํ•ด๋‹น.
    2. [์ด๋ฆ„/์„ฑ๋ณ„/๋‚˜์ด/ํ˜„์žฌ์‚ฌ๋Š” ๊ณณ/์ทจ์—…์—ฌ๋ถ€/๊ฒฐํ˜ผ-์—ฐ์•  ์—ฌ๋ถ€] - ์–ด๋–ค ๊ฒƒ์ด Props or State์— ์ ํ•ฉํ•œ์ง€?

      Props State
      ์ด๋ฆ„ ๋‚˜์ด
      ์„ฑ๋ณ„ ํ˜„์žฌ ์‚ฌ๋Š” ๊ณณ
      ย  ์ทจ์—…์—ฌ๋ถ€
      ย  ๊ฒฐํ˜ผ-์—ฐ์•  ์—ฌ๋ถ€
    3. Toggle Switch
      1. On / Off ์—ฌ๋ถ€๋กœ ๊ฐ’์ด ๋ณ€๊ฒฝ๋จ
      2. State์— ํ•ด๋‹น
    4. Couter

      image

      1. State ํ•ด๋‹น

Props

  1. Props์˜ ํŠน์ง•
    1. ์ปดํฌ๋„ŒํŠธ์˜ ์†์„ฑ(property)์„ ์˜๋ฏธ
      1. props๋Š” ์„ฑ๋ณ„์ด๋‚˜ ์ด๋ฆ„์ฒ˜๋Ÿผ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’
      2. ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ€์ง„ ์†์„ฑ์— ํ•ด๋‹น
    2. ๐Ÿ’๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ(์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ)๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’โœจโœจโœจโœจโœจโœจโœจ
      1. ๋ฌด์กฐ๊ฑด ๋‚ด ์ƒ์œ„์˜ ์ปดํฌ๋„ŒํŠธ๋งŒ ๊ฐ€๋Šฅํ•จ ์กฐ์ƒ์€ ์•ˆ๋จ.
      2. React ์ปดํฌ๋„ŒํŠธ๋Š” JavaScript ํ•จ์ˆ˜์™€ ํด๋ž˜์Šค๋กœ, props๋ฅผ ํ•จ์ˆ˜์˜ ์ „๋‹ฌ์ธ์ž(arguments)์ฒ˜๋Ÿผ ์ „๋‹ฌ๋ฐ›์•„ ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ™”๋ฉด์— ์–ด๋–ป๊ฒŒ ํ‘œ์‹œ๋˜๋Š”์ง€๋ฅผ ๊ธฐ์ˆ ํ•˜๋Š” React ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋ฐ˜ํ™˜ ๋”ฐ๋ผ์„œ, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ตœ์ดˆ ๋ Œ๋”๋ง ๋  ๋•Œ ํ™”๋ฉด์— ์ถœ๋ ฅํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์€ ์ดˆ๊นƒ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
    3. ๊ฐ์ฒด ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.

      props๋กœ ์–ด๋–ค ํƒ€์ž…์˜ ๊ฐ’๋„ ๋„ฃ์–ด ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋„๋ก props๋Š” ๊ฐ์ฒด์˜ ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง

    4. props๋Š” ์ฝ๊ธฐ ์ „์šฉ
      1. props๋Š” ์„ฑ๋ณ„์ด๋‚˜ ์ด๋ฆ„์ฒ˜๋Ÿผ ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์•„ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฐ’
      2. ๊ทธ๋ž˜์„œ props๋Š” ํ•จ๋ถ€๋กœ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์—†๋Š” ์ฝ๊ธฐ ์ „์šฉ(read-only) ๊ฐ์ฒดโ†’ ํ•จ๋ถ€๋กœ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ
  2. Props ์‚ฌ์šฉ ๋ฐฉ๋ฒ•
    1. props๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™์ด 3๋‹จ๊ณ„ ์ˆœ์„œ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Œ
      1. ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’(data)๊ณผ ์†์„ฑ์„ ์ •์˜
      2. props๋ฅผ ์ด์šฉํ•˜์—ฌ ์ •์˜๋œ ๊ฐ’๊ณผ ์†์„ฑ์„ ์ „๋‹ฌ
      3. ์ „๋‹ฌ๋ฐ›์€ props๋ฅผ ๋ Œ๋”๋งํ•œ๋‹ค.
    2. ์˜ˆ์ œ-1

      image

      App์ด ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ

      image

      • Props๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์œ„์—์„œ ๋ฐ–์— ๋ชป ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— Tweets์™€ Mypage ๋‘˜ ๋‹ค ๊ฐ™์€ ๋ฐ์ดํ„ฐ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” ์„œ๋กœ ๊ณต์œ ๋ฅผ ๋ชปํ•˜๋ฏ€๋กœ ๋ฐ์ดํ„ฐ๋Š” app์—์„œ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•จ.
      • ์•„๋ž˜์—์„œ ์œ„๋กœ๋Š” ์ ˆ๋Œ€ ์ •๋ณด ๋ชป๋ณด๋ƒ„
      • ๋งŒ์•ฝ footer์—์„œ app์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” app์—์„œ tweet์—์„œ ๋‚ด๋ฆฌ๊ณ  tweet์—์„œ footer๋กœ ํ•œ๋ฒˆ ๋” ๋‚ด๋ ค์•ผ ํ•จ.
      • ๊ทธ๋Ÿผ ๋ชจ๋“  props๋ฅผ ์ตœ์ƒ์œ„์— ๋‘๋ฉด ๋˜์ง€ ์•Š์„๊นŒ?? โ‡’ ์ƒํƒœ๋ฅผ ๋ชจ๋‘ ์ „์—ญ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๋Š” ๊ฒƒ์ž„. ์ƒํƒœ๋ฅผ ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅ์— ๊ฐ€๊นŒ์›€, ์ „์—ญ์œผ๋กœ ๊ด€๋ฆฌํ•  ๊ฒฝ์šฐ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ต๋‹ค.
      • ์š”์ฆ˜ ์•ฑ์€ Props ์—„์ฒญ ๋งŽ๊ณ  ์ปดํฌ๋„ŒํŠธ๋„ ๋งŽ์•„์„œ ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์›€, ์„œ๋“œํŒŒํ‹ฐ์—์„œ ๊ด€๋ฆฌ, ์ง€์›ํ•ด์ฃผ๋Š” ์ƒํƒœ๊ด€๋ฆฌ ํˆด์ด ์žˆ์Œ but, ๋ฐ์ดํ„ฐ ๋งŽ์ง€ ์•Š์€๋ฐ ํˆด ์‚ฌ์šฉ์‹œ ๋ณต์žก๋„๊ฐ€ ์˜ฌ๋ผ๊ฐ
    3. ์˜ˆ์ œ-2

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      
       function Parent() {
         return (
           <div className="parent">
             <h1>I'm the parent</h1>
             <Child />
           </div>);
       };
              
       function Child() {
         return (
           <div className="child"></div>);
       };
      
      1. props๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์šฐ์„  <Parent> ์™€ <Child> ๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ ์–ธํ•˜๊ณ , <Parent> ์ปดํฌ๋„ŒํŠธ ์•ˆ์— <Child> ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์„ฑ
      2. ์ปดํฌ๋„ŒํŠธ ์ž‘์„ฑ ํ›„ ์ „๋‹ฌํ•˜๊ณ ์ž ํ•˜๋Š” ์†์„ฑ์„ ์ •์˜

        1
        
         <a href="www.javascript.com">Click me to visit javascript</a>
        
      3. React์—์„œ JSX ์†์„ฑ ๋ฐ ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ๋ฐฉ๋ฒ•-1

        1
        
         <Child attribute={value} />
        

        ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ณ€์ˆ˜๋ฅผ ๋„ฃ์„ ๊ฒƒ์ด๋ผ์„œ ์ค‘๊ด„ํ˜ธ ์‚ฌ์šฉ

      4. React์—์„œ JSX ์†์„ฑ ๋ฐ ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ๋ฐฉ๋ฒ• 2

        1
        
         <Child text={"I'm the eldest child"} />
        
      5. parent ์ปดํฌ๋„ŒํŠธ์—์„œ ์ „๋‹ฌ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๋Š” ๋ฐฉ๋ฒ• = <Child> ์ปดํฌ๋„ŒํŠธ์—์„œ props ๋งค๊ฐœ๋ณ€์ˆ˜ ์‚ฌ์šฉ ์˜ˆ์‹œ

        1
        2
        3
        4
        5
        
         function Child(props) {
           return (
             <div className="child"></div>
           );
         };
        

        props๋Š” ๊ณ ์ •์ด๊ณ  ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋‹ค. props ํƒ€์ž…์€ ๊ฐ์ฒด์ธ๋ฐ ์‹ค์ œ ๋“ค์–ด์˜จ ๊ฐ’์€ text์ธ๋ฐ props์—์„œ ์–ด๋–ป๊ฒŒ ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์„๊นŒ?

        ์‹ค์ œ๋กœ props๋ฅผ ์ถœ๋ ฅํ•ด๋ณด๋ฉด props ={โ€textโ€ : โ€œIโ€™m the eldest childโ€ }

        ์ฆ‰ props.text๋กœ ์ ‘๊ทผ ํ•˜๋Š” ๊ฒƒ์ž„.


      6. ์ „๋‹ฌ๋ฐ›์€ props ๋ Œ๋”๋ง ํ•˜๊ธฐ
        • props๋Š” ๊ฐ์ฒด๋ผ์„œ key value ํ˜•ํƒœ๋ฅผ ๋ฐ
        • ์—ฌ๊ธฐ์„œ๋Š” parent ์ปดํฌ๋„ŒํŠธ์—์„œ ์ •์˜ํ•œ { attribute : value }์˜ ํ˜•ํƒœ๋ฅผ ๋ ๊ฒŒ ๋จ
        • props์˜ value ๋˜ํ•œ dot notation์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ.
        1
        2
        3
        4
        5
        6
        7
        
         function Child(props) {
           return (
             <div className="child">
               <p>{props.text}</p>
             </div>
           );
         };
        
      • ์‹ค์Šต-1

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        
          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;
        

        ์‹ค์Šต-2

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        
          import "./styles.css";
                    
          const App = () => {
            const itemOne = "React๋ฅผ";
            const itemTwo = "๋ฐฐ์šฐ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.";
                    
            return (
              <div className="App">
                {/* Learn ์ปดํฌ๋„ŒํŠธ์— itemOne ๊ณผ itemTwo ๋ฅผ
                props ๋กœ ์ „๋‹ฌํ•˜์„ธ์š” */}
                <Learn items={[itemOne,itemTwo]}/>;
                        
              </div>
            );
          };
                    
          const Learn = (props) => {
            // ์ „๋‹ฌ๋ฐ›์€ props ๋ฅผ ์•„๋ž˜ <div> tag ์‚ฌ์ด์— ์‚ฌ์šฉํ•˜์—ฌ
            // "React๋ฅผ ๋ฐฐ์šฐ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค" ๋ผ๋Š” ๋ฌธ์žฅ์ด ๋ Œ๋”๋ง๋˜๋„๋ก ์ปดํฌ๋„ŒํŠธ๋ฅผ ์™„์„ฑํ•˜์„ธ์š”
            return <div className="Learn">{props.items[0]+" "+props.items[1]}</div>;
          };
                    
          export default App;
        

        image

State

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

image

๋„ค๋ชจ ๋ฐ•์Šค์— ์žˆ๋Š” ๊ฐ’๋“ค์€ ๋ณ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’.

State hook, useState

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

1
2
3
function CheckboxExample() {
  const [isChecked, setIsChecked] = useState(false);
  // const [state ์ €์žฅ ๋ณ€์ˆ˜, state ๊ฐฑ์‹  ํ•จ์ˆ˜] = useState(state ์ดˆ๊นƒ๊ฐ’);
  • isChecked : state๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜
  • setIsChecked : state isChecked ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜
  • useState : state hook
  • false : state ์ดˆ๊นƒ๊ฐ’

์‚ฌ์šฉ๋ฐฉ๋ฒ•๊ณผ ์ž‘๋™๋ฐฉ์‹์€ ์•„๋ž˜์™€ ๊ฐ™์Œ.

  1. React๋กœ๋ถ€ํ„ฐ useState ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ - import ํ‚ค์›Œ๋“œ

    1
    
     import { useState } from "react";
    
  2. ์ดํ›„ usestate๋ฅผ ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ํ˜ธ์ถœ
    1. ํ˜ธ์ถœ์ด๋ž€ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Œ, ๋ณ€์ˆ˜ ์ด๋ฆ„์€ ์ƒ๊ด€ ์—†์Œ
    2. ์ผ๋ฐ˜์ ์ธ ๋ณ€์ˆ˜๋Š” ์‚ฌ๋ผ์ง€์ง€๋งŒ state ๋ณ€์ˆ˜๋Š” React์— ์˜ํ•ด ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๋„ ์‚ฌ๋ผ์ง€์ง€ ์•Š์Œ
    1
    2
    3
    4
    
     function CheckboxExample() {
     // ์ƒˆ๋กœ์šด state ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ , ์—ฌ๊ธฐ์„œ๋Š” ์ด๊ฒƒ์„ isChecked ๋ผ ๋ถ€๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
       const [isChecked, setIsChecked] = useState(false);
     }
    
    • isChecked, setIsChecked ๋Š” useState ์˜ ๋ฆฌํ„ด ๊ฐ’์„ ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹นํ•œ ๋ณ€์ˆ˜ โ†’ ์ด ํ‹€์€ ์™ธ์›Œ์•ผ ํ•จ.
      • ์ƒ๊ธฐ ์ฝ”๋“œ๋ฅผ ํ’€์–ด์“ฐ๋ฉด ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์Œ

        1
        2
        3
        4
        5
        
          function CheckboxExample() {
            const stateHookArray = useState(false); // 2๋ฒˆ
            const isChecked = stateHookArray[0];
            const setIsChecked = stateHookArray[1];
          }
        
    • usestate๋Š” ์„ ์–ธ๊ณผ ํ• ๋‹น์„ ๋™์‹œ์— ํ•˜๋Š” ๊ฒƒ์ž„. ์ดˆ๊ธฐ ๊ฐ’์ด false ์ž„
    • ์—ฌ๊ธฐ์„œ isChecked๋Š” ๋ณ€์ˆ˜ setIsChecked๋Š” ํ•จ์ˆ˜.

      1
      
        const [state ์ €์žฅ ๋ณ€์ˆ˜, state ๊ฐฑ์‹  ํ•จ์ˆ˜] = useState(์ƒํƒœ ์ดˆ๊ธฐ ๊ฐ’);
      
    • const๊ฐ€ ๋“ค์–ด ์™€์„œ ์žฌํ• ๋‹น์ด ์•ˆ ๋˜๋Š”๋ฐ setIsCheked ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด์„œ ์ƒˆ๋กœ๊ณ ์นจ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋จ
      • let์„ ๋ถ™์ด๋ฉด ๋‚ซ์ง€ ์•Š์„๊นŒ ??์ƒ๊ฐํ–ˆ๋Š”๋ฐ ์ƒˆ๋กœ๊ณ ์นจ์ด ๋˜๋Š” ๊ฒƒ์ด ๋Œ€๋ถ€๋ถ„์ด๋ผ์„œ ํ™”๋ฉด ์–ด๋”˜๊ฐ€๊ฐ€ ๋ฐ”๊ปด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ
        โ†’ ํ™”๋ฉด์ด ๋ฐ”๋€Œ๊ธฐ ์ „๊นŒ์ง€๋Š” ๋ถˆ๋ณ€์ž„
      • ์ดํ•ด์•ˆ๊ฐ€๋„ ์™ธ์›Œ์•ผ ํ•จ! โžก๏ธ react์‚ฌ์ดํŠธ์— ๊ณต์‹๋ฌธ์„œ์— ์ ํ˜€์žˆ๊ธฐ ๋•Œ๋ฌธ, const๋Š” ๊ณ ์ •์ด๋‹ค
        = ๋‹ค์‹œํ™”๋ฉด์ด ๋งŒ๋“ค์–ด์ง„๋‹ค๋Š” ๊ฒƒ์„ ๊ฐ•์กฐ
    • state๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ์ˆœ๊ด€ ์ƒˆ๋กœ๊ณ ์นจ ๋œ ์ฑ„๋กœ ๋‹ค์‹œ ์‹œ์ž‘. dom์„ ๋‹ค์‹œ ์ ๊ฒ€ํ•จ.
    • state ๊ฐ’์— ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์€ ์ œํ•œ ์—†์Œ.
    • ์ดˆ๊ธฐ ๊ฐ’์— ๋ฐฐ์—ด์„ ๋„ฃ๊ณ  ์‹ถ์œผ๋ฉด false ์ž๋ฆฌ์— ๋นˆ ๋ฐฐ์—ด ๋„ฃ์œผ๋ฉด ๋จ.
    • ํ•จ์ˆ˜ ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ์ง€๋งŒ ๋„ฃ๋Š” ๊ฒฝ์šฐ ์—†๋‹ค
  3. ์ด state ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด JSX ์—˜๋ฆฌ๋จผํŠธ ์•ˆ์— ์ง์ ‘ ๋ถˆ๋Ÿฌ์„œ ์‚ฌ์šฉ,
    ์—ฌ๊ธฐ์„œ๋Š” isChecked ๊ฐ€ boolean ๊ฐ’์„ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— true or false ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋ณด์ด๋„๋ก ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉ

    1
    
     <span>{isChecked ? "Checked!!" : "Unchecked"}</span>
    
  4. State ๊ฐฑ์‹ ํ•˜๊ธฐ

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
     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;
    
    1. state๋ฅผ ๊ฐฑ์‹ ํ•˜๋ ค๋ฉด state ๋ณ€์ˆ˜๋ฅผ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์ธ setIsChecked ๋ฅผ ํ˜ธ์ถœ
    2. ์˜ˆ์‹œ์˜ ๊ฒฝ์šฐ, input[type=checkbox] JSX ์—˜๋ฆฌ๋จผํŠธ์˜ ๊ฐ’ ๋ณ€๊ฒฝ์— ๋”ฐ๋ผ์„œ isChecked ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•จ.
      ๋ธŒ๋ผ์šฐ์ €์—์„œ checked๋กœ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค๋ฉด, React์˜ isChecked ๋„ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•จ.
    3. input[type=checkbox] ์—˜๋ฆฌ๋จผํŠธ์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด onChange ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ
    4. ์‚ฌ์šฉ์ž๊ฐ€ ์ฒดํฌ๋ฐ•์Šค ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด onChange ์ด๋ฒคํŠธ๊ฐ€ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜์ธ handleChecked ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ์ด ํ•จ์ˆ˜๊ฐ€ setIsChecked ๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋จ
    5. setIsChecked ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ํ˜ธ์ถœ๋œ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ isChecked ๋ณ€์ˆ˜๊ฐ€ ๊ฐฑ์‹ ๋˜๋ฉฐ, React๋Š” ์ƒˆ๋กœ์šด isChecked ๋ณ€์ˆ˜๋ฅผ CheckboxExample ์ปดํฌ๋„ŒํŠธ์— ๋„˜๊ฒจ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋ง ํ•จ
    6. ๊ฐ•์ œ๋กœ ๋ณ€๊ฒฝ์„ ์‹œ๋„ ์•ˆ๋จ

      image

      • React state๋Š” ์ƒํƒœ ๋ณ€๊ฒฝ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•จ. โ‡’ ๊ฐ•์ œ๋กœ ๋ณ€๊ฒฝ์„ ์‹œ๋„ํ•˜๋ฉด ์•ˆ ๋จ.
      • ์ƒํƒœ ๋ณ€๊ฒฝ ํ•จ์ˆ˜ ์‚ฌ์šฉ์€ React์™€ ๊ฐœ๋ฐœ์ž์˜ ์•ฝ์†์ž„.
      • ๊ฐ•์ œ๋กœ ๋ณ€๊ฒฝ์„ ์‹œ๋„ํ•˜๋ฉด, ๋ฆฌ๋ Œ๋”๋ง์ด ๋˜์ง€ ์•Š๋Š”๋‹ค๊ฑฐ๋‚˜, state๊ฐ€ ์ œ๋Œ€๋กœ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ.
      • ์˜ˆ์‹œ : state.push(1);, state[1] = 2;, state = 'wrong state';
  5. ์˜ˆ์ œ-1

    image

    • ํ•ด๋‹น ๋ถ€๋ถ„๋งŒ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ. ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒฐ๊ณผ๋Š” ๋ Œ๋”๋ง๋˜๋Š” ํ™”๋ฉด, ์ผ๋ถ€๋งŒ ๋ Œ๋”๋ง ์ฆ‰ , ์ปดํฌ๋„ŒํŠธ์ด๋‹ค. = check๋ฐ•์Šค์— ๋Œ€ํ•œ.
    • onChange={handleChecked} />์— ๋ณ€ํ™”๊ฐ€ ์žˆ์œผ๋ฉด handleChecked๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒƒ.
    • state ๋ฐ”๋€Œ๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žฌ๋žœ๋”๋ง ๋จ.
    • ์•„๋ž˜ ์ฝ”๋“œ ๋žœ๋”๋ง์ด ์•ˆ๋จ, ๊ผญ ํ”ผํ•ด์•ผ ๋˜๋Š” ๊ฒฝ์šฐ

      image

    • ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ƒํƒœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ . ๋„ค๊ฐœ์˜ ์ฒดํฌ๋ฐ•์Šค๋ฅผ ๋งŒ๋“ค๋ฉด ๋„ค๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ

      image

์ด๋ฒคํŠธ์ฒ˜๋ฆฌ

React์˜ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ(์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง; Event handling) ๋ฐฉ์‹์€ DOM์˜ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋ฐฉ์‹๊ณผ ์œ ์‚ฌ

  • React ์—์„œ ์ด๋ฒคํŠธ๋Š” ์†Œ๋ฌธ์ž ๋Œ€์‹  ์นด๋ฉœ ์ผ€์ด์Šค(camelCase) ๋ฅผ ์‚ฌ์šฉ
  • JSX๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด์ด ์•„๋‹Œ ํ•จ์ˆ˜๋กœ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜(์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ; Event handler)๋ฅผ ์ „๋‹ฌ
  • HTML์˜ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋ฐฉ์‹

    1
    
      <button onclick="handleEvent()">Event</button>
    
  • React ์˜ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋ฐฉ์‹

    1
    
      <button onClick={handleEvent}>Event</button>
    

example

  1. onChange
    1. <input> <textarea> <select> ์™€ ๊ฐ™์€ ํผ(Form) ์—˜๋ฆฌ๋จผํŠธ๋Š” ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์„ ์ œ์–ดํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ
    2. React ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋Š” ์ž…๋ ฅ๊ฐ’์„ ์ผ๋ฐ˜์ ์œผ๋กœ ์ปดํฌ๋„ŒํŠธ์˜ state ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์—…๋ฐ์ดํŠธ ํ•จ
    3. onChange ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด e.target.value ๋ฅผ ํ†ตํ•ด ์ด๋ฒคํŠธ ๊ฐ์ฒด์— ๋‹ด๊ฒจ์žˆ๋Š” input ๊ฐ’์„ ์ฝ์–ด์˜ฌ ์ˆ˜ ์žˆ์Œ
    4. ์˜ˆ์ œ-1

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      
       function NameForm() {
         const [name, setName] = useState("");
              
         const handleChange = (e) => {
           setName(e.target.value);
         }
              
         return (
           <div>
             <input type="text" value={name} onChange={handleChange}></input>
             <h1>{name}</h1>
           </div>)
       };
      
      • ์ปดํฌ๋„ŒํŠธ return ๋ฌธ ์•ˆ์˜ input ํƒœ๊ทธ์— value ์™€ onChange ๋ฅผ ๋„ฃ์Œ
      • onChange ๋Š” input ์˜ ํ…์ŠคํŠธ๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ
      • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด handleChange ํ•จ์ˆ˜๊ฐ€ ์ž‘๋™ํ•˜๋ฉฐ, ์ด๋ฒคํŠธ ๊ฐ์ฒด์— ๋‹ด๊ธด input ๊ฐ’์„ setState ๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด state ๋กœ ๊ฐฑ์‹ 
    5. ์˜ˆ์ œ -2

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      
       import React, { useState } from "react";
       import "./styles.css";
              
       function SelectExample() {
         const [choice, setChoice] = useState("apple");
              
         const fruits = ["apple", "orange", "pineapple", "strawberry", "grape"];
         const options = fruits.map((fruit) => {
           return <option value={fruit}>{fruit}</option>;
         });
         console.log(choice);
         const handleFruit = (event) => {
           //TODO : select tag ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์™„์„ฑํ•˜์„ธ์š”.
       	    	**setChoice(event.target.value);**
         };
              
         return (
           <div className="App">
             <select onChange={handleFruit}>{options}</select>
             <h3>You choose "{choice}"</h3>
           </div>
         );
       }
              
       export default SelectExample;
              
      

      image

  2. onClick : ํด๋ฆญํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ
    1. ํด๋ฆญํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ
    2. ๋ฒ„ํŠผ์ด๋‚˜ <a> tag ๋ฅผ ํ†ตํ•œ ๋งํฌ ์ด๋™ ๋“ฑ๊ณผ ๊ฐ™์ด ์ฃผ๋กœ ์‚ฌ์šฉ์ž์˜ ํ–‰๋™์— ๋”ฐ๋ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฐ˜์‘ํ•ด์•ผ ํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฒคํŠธ
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
     function NameForm() {
       const [name, setName] = useState("");
        
       const handleChange = (e) => {
         setName(e.target.value);
       }
        
       return (
         <div>
           <input type="text" value={name} **onChange**={handleChange}></input>
           <button **onClick**={alert(name)}>Button</button>
           <h1>{name}</h1>
         </div>);
     };
    
    1. onChange ์˜ˆ์‹œ์— ๋ฒ„ํŠผ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ input tag ์— ์ž…๋ ฅํ•œ ์ด๋ฆ„์ด alert์„ ํ†ตํ•ด ์•Œ๋ฆผ ์ฐฝ์ด ํŒ์—… ๋˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•จ
    2. onClick ์ด๋ฒคํŠธ์— alert(name) ํ•จ์ˆ˜๋ฅผ ๋ฐ”๋กœ ํ˜ธ์ถœํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋  ๋•Œ ํ•จ์ˆ˜ ์ž์ฒด๊ฐ€ ์•„๋‹Œ ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ๊ฒฐ๊ณผ๊ฐ€ onClick ์— ์ ์šฉ
    3. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ„ํŠผ์„ ํด๋ฆญํ•  ๋•Œ๊ฐ€ ์•„๋‹Œ, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋  ๋•Œ์— alert ์ด ์‹คํ–‰๋˜๊ณ  ๋”ฐ๋ผ์„œ ๊ทธ ๊ฒฐ๊ณผ์ธ undefined (ํ•จ์ˆ˜๋Š” ๋ฆฌํ„ด ๊ฐ’์ด ์—†์„ ๋•Œ undefined ๋ฅผ ๋ฐ˜ํ™˜) ๊ฐ€ onClick ์— ์ ์šฉ๋˜์–ด ํด๋ฆญํ–ˆ์„ ๋•Œ ์•„๋ฌด๋Ÿฐ ๊ฒฐ๊ณผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š์Œ
    4. ๋”ฐ๋ผ์„œ onClick ์ด๋ฒคํŠธ์— ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ๋•Œ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฆฌํ„ด๋ฌธ ์•ˆ์—์„œ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ฑฐ๋‚˜ ๋ฆฌํ„ด๋ฌธ ์™ธ๋ถ€์—์„œ ํ•จ์ˆ˜๋ฅผ ์ •์˜ ํ›„ ์ด๋ฒคํŠธ์— ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•จ.
    5. ์˜ˆ์‹œ : **

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      
       // ํ•จ์ˆ˜ ์ •์˜ํ•˜๊ธฐ
              
       return (
         <div>
       	...
           <button onClick={() => alert(name)}>Button</button>
       	...
         </div>);
       };
              
       // ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ
              
       const handleClick = () => {
         alert(name);
       };
              
       return (
         <div>
             ...
           <button onClick={handleClick}>Button</button>
             ...
         </div>);
       };
      

      โ†’ ๋งž๊ฒŒ ์“ด ์˜ˆ์ œ

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      
       import "./styles.css";
       import React, { useState } from "react";
              
       function NameForm() {
         const [name, setName] = useState("");
              
         const handleChange = (e) => {
           setName(e.target.value);
         };
              
         const handleClick = () => {
           alert(name);
         };
         return (
           <div className="App">
             <h1>Event handler practice</h1>
             <input type="text" value={name} onChange={handleChange}></input>
             **<button onClick={handleClick}>Button</button>**
             {/* <button onClick={() => alert(name)}>Button</button> */}
             **<h3>{name}</h3>**
           </div>
         );
       }
       export default NameForm;
      

      image

      image

      ์ž…๋ ฅ์ฐฝ์— ์ถœ๋ ฅ๋˜๋Š”๊ฒƒ์€ <h3>{name}</h3} ์— ์˜ํ•œ ๊ฒƒ.

    6. ์˜ˆ์‹œ : Pop up

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      
       import React, { useState } from "react";
       import "./styles.css";
              
       function App() {
         const [showPopup, setShowPopup] = useState(false);
              
         const togglePopup = () => {
           // Pop up ์˜ open/close ์ƒํƒœ์— ๋”ฐ๋ผ
           // ํ˜„์žฌ state ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜๋„๋ก ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•˜์„ธ์š”.
       	    const currenstate = showPopup ? false : true;
       	    setShowPopup(currentstate);
              		    
         };
              
         return (
           <div className="App">
             <h1>Fix me to open Pop Up</h1>
             {/* ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ Pop up ์˜ open/close ๊ฐ€ ์ž‘๋™ํ•˜๋„๋ก
                 button tag๋ฅผ ์™„์„ฑํ•˜์„ธ์š”. */}
             <button className="open">Open me</button>
             {showPopup ? (
               <div className="popup">
                 <div className="popup_inner">
                   <h2>Success!</h2>
                   <button className="close" onClick={togglePopup}>
                     Close me
                   </button>
                 </div>
               </div>
             ) : null}
           </div>
         );
       }
              
       export default App;
              
      

      image

Controlled component : React๊ฐ€ state๋ฅผ ํ†ต์ œํ•  ์ˆ˜ ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ

https://reactwithhooks.netlify.app/docs/forms.html - ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ณต์‹๋ฌธ์„œ ์ฐธ๊ณ 

input์— ๊ฐ’ ์ž…๋ ฅ ์‹œ, state๋„ ๊ทธ๋•Œ๊ทธ๋•Œ ๋ฐ”๋€Œ๋ฉด(onChange) ๋˜๊ณ  ์ด ๋ณ€๊ฒฝ๋œ state์™€ input์˜ value ๋˜ํ•œ ๊ฐ™๊ฒŒ ์ž‘์„ฑํ•ด์•ผ ํ•จ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import "./styles.css";
import React, { useState } from "react";

export default function App() {
  const [username, setUsername] = useState("");
  const [msg, setMsg] = useState("");

  return (
    <div className="App">
      <div>{username}</div>
      <input
        type="text"
        value={username}
        onChange={(event) => setUsername(event.target.value)}
        placeholder="์—ฌ๊ธฐ๋Š” ์ธํ’‹์ž…๋‹ˆ๋‹ค."
        className="tweetForm__input--username"
      ></input>
      <div>{msg}</div>
      {/* TODO : ์œ„ input๊ณผ ๊ฐ™์ด ์ž…๋ ฅ์— ๋”ฐ๋ผ์„œ msg state๊ฐ€ ๋ณ€ํ•  ์ˆ˜ ์žˆ๊ฒŒ 
      ์•„๋ž˜ textarea๋ฅผ ๋ณ€๊ฒฝํ•˜์„ธ์š”. */}
      <textarea
        placeholder="์—ฌ๊ธฐ๋Š” ํ…์ŠคํŠธ ์˜์—ญ์ž…๋‹ˆ๋‹ค."
        className="tweetForm__input--message"
        onChange={(event) => {SetMsg(event.target.value}}
        value={"msg"}
      ></textarea>
    </div>
  );
}

React ๋ฐ์ดํ„ฐ ํ๋ฆ„

  1. ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ค์–ด๋†“๊ณ  ํ•ฉ์น˜๊ธฐ

    image

  2. ์„ธ๋ถ„ํ™”

    image

  3. ๋„์‹ํ™” - ์ปดํฌ๋„ŒํŠธ๋‚˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์„๋•Œ ๋„์‹ํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•จ

    image

  4. ๋ฐ์ดํ„ฐ๋Š” ์œ„์—์„œ ์•„๋ž˜๋กœ ํ๋ฆ„. ์ด๋™ํ•˜๋Š” ๊ฒƒ์€ ๋ฌด์กฐ๊ฑด props

    image

  5. singleTweet์€ ๊ฐœ๋ณ„์ด ์•„๋‹ˆ๋ผ ๋ชจ๋“ ์‚ฌ๋žŒ์˜ tweet์„ ๋‹ด์•„์•ผ ํ•˜๋ฏ€๋กœ Tweets๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•จ. ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ํ˜๋Ÿฌ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ

    image

image

image

image

๋ฐฉ๋ฒ•์€ ์‚ฌ์‹ค 2๊ฐ€์ง€๊ฐ€ ์žˆ์Œ

search๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด ๋ชฉ๋ก์ด twittler์—์„œ search์™€ tweets์— ๋‚ด๋ ค์ฃผ๊ณ  singletweet์— ๊ฐ๊ฐ ๋‹ค์‹œ ๋‚ด๋ฆฌ๊ธฐ

search๊ฐ€ filtering์„ ํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•„ํ„ฐ๋œ ์กฐ๊ฑด์€ singleTweet

์ด์ •๋ฏผ์ด ๋‹ด๊ฒจ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋งŒ singleTweet์œผ๋กœ ๊ฐ€์ง€๋ฉด๋˜๋‹ˆ๊นŒ

์ „์ฒด ํŠธ์œ—๋ชฉ๋ก์ด ์ตœ์ƒ์œ„๊ฐ€ ๊ฐ–๊ณ ์žˆ๋Š”๊ฒƒ์€ ์ข‹์ง€ ์•Š์Œ. = ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ณ„์† ์ƒ์ฃผํ•ด ์žˆ์–ด์„œ

react ์นดํ…Œ๊ณ ๋ฆฌ ๋‚ด ๋‹ค๋ฅธ ๊ธ€ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ

Leave a comment