r e a c t

State

hee.hee 2022. 6. 15. 22:23

 

๐Ÿ“‚ ๋ฆฌ์•กํŠธ์—์„œ ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„


๋ฆฌ์•กํŠธ๋Š” ๊ฐ์ž ๋‹ค๋ฅธ ์—ญํ• ์„ ํ•˜๋Š” ๋‹ค์–‘ํ•œ ์ปดํฌ๋„ŒํŠธ๋“ค์˜ ์ง‘ํ•ฉ์ด๋‹ค.

๋ฆฌ์•กํŠธ์˜ ์ปดํฌ๋„ŒํŠธ๋Š” ๋‹จ์ผ์ฑ…์ž„ ์›์น™์„ ๊ธฐ๋ณธ์œผ๋กœ, ํ•œ ์ปดํฌ๋„ŒํŠธ๋Š” ํ•œ ๊ฐ€์ง€ ์—ญํ• ๋งŒ ํ•œ๋‹ค.

ํ•œ ์ปดํฌ๋„ŒํŠธ์— ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถ€๋ชจ ์ž์‹ ๊ด€๊ณ„์ฒ˜๋Ÿผ ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

์ด๋ ‡๊ฒŒ ์—ญํ• ๊ณผ ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋ฐฐ์น˜ํ•˜๋‹ค๋ณด๋ฉด ์ปดํฌ๋„ŒํŠธ๋Š” 'ํŠธ๋ฆฌ๊ตฌ์กฐ'๊ฐ€ ๋œ๋‹ค.

๊ฒฐ๊ตญ ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ ์•ˆ์— ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋“ค์ด ์œ„์น˜ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

๋ฆฌ์•กํŠธ ์•ˆ์˜ ๋ฐ์ดํ„ฐ๋Š” ์ด๋Ÿฌํ•œ ํŠธ๋ฆฌ๊ตฌ์กฐ์— ๋”ฐ๋ผ ์œ„์—์„œ ์•„๋ž˜๋กœ ํ๋ฅธ๋‹ค.

ํ•œ ๋ถ€๋ชจ ์•ˆ์— ์œ„์น˜ํ•œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ถ€๋ชจ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ ๋ฐ›์•„ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

๋ฐ์ดํ„ฐ๊ฐ€ ๋ถ€ -> ์ž ์ด๋ ‡๊ฒŒ ์•„๋ž˜๋กœ ํ๋ฅด๋‹ˆ๊นŒ. 

๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์€ ๋ฆฌ์•กํŠธ์˜ ์ค‘์š”ํ•œ ํ‚ค์›Œ๋“œ์ด๋‹ค.

์ปดํฌ๋„ŒํŠธ๋Š” ๋ฐ”๊นฅ์—์„œ props๋ฅผ ์ด์šฉํ•ด์„œ ์†์„ฑ์„ ์ „๋‹ฌ ๋ฐ›์•„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ์—ญ์‹œ ํ•˜ํ–ฅ์‹ ๋ฐ์ดํ„ฐ ํ๋ฆ„์˜ ํ•œ ์˜ˆ์ด๋‹ค.

 

 

 

๐Ÿ“‚ state


๐Ÿ“Ž ๋ณ€ํ•˜๋Š” ๊ฐ’์„ state๋กœ ๊ด€๋ฆฌํ•œ๋‹ค

๐Ÿ“Ž ์•„๋ž˜ ์„ธ๊ฐ€์ง€ ์กฐ๊ฑด์„ ๊ธฐ์ค€์œผ๋กœ state ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค

  • ๋ถ€๋ชจ๋กœ๋ถ€ํ„ฐ props๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋ฉ๋‹ˆ๊นŒ? ๊ทธ๋Ÿฌ๋ฉด ํ™•์‹คํžˆ state๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • ์‹œ๊ฐ„์ด ์ง€๋‚˜๋„ ๋ณ€ํ•˜์ง€ ์•Š๋‚˜์š”? ๊ทธ๋Ÿฌ๋ฉด ํ™•์‹คํžˆ state๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • ์ปดํฌ๋„ŒํŠธ ์•ˆ์˜ ๋‹ค๋ฅธ state๋‚˜ props๋ฅผ ๊ฐ€์ง€๊ณ  ๊ณ„์‚ฐ ๊ฐ€๋Šฅํ•œ๊ฐ€์š”? ๊ทธ๋ ‡๋‹ค๋ฉด state๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๐Ÿ“Ž state์˜ ์œ„์น˜

state๊ฐ€ ํ•„์š”ํ•œ, ์‚ฌ์šฉ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์— ์œ„์น˜์‹œํ‚จ๋‹ค.

๋‹ค์ˆ˜์˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•œ state์˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค๋ฉด ์ปดํฌ๋„ŒํŠธ๋“ค์˜ ๊ณตํ†ต ์†Œ์œ  ์ปดํฌ๋„ŒํŠธ์— ์œ„์น˜์‹œํ‚จ๋‹ค

๊ณตํ†ต ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์— ๋‘๋Š” ๊ฒƒ์ด๋‹ค.

 

 

 

 

 

 

๐Ÿ“‚ state ๋Œ์–ด์˜ฌ๋ฆฌ๊ธฐ


๐Ÿ“Ž state๊ฐ€ ๋Œ์–ด์˜ฌ๋ ค์ง€๋Š” ๊ฒฝ์šฐ

์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์— ์˜ํ•ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ํŠธ์œ—์„ ์ž‘์„ฑํ•˜๋Š” ํผ์ด ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ์ „์ฒด ํŠธ์œ— ์ปดํฌ๋„ŒํŠธ ์•ˆ์— ์žˆ๋‹ค. ํผ์—์„œ ์ž‘์„ฑํ•œ ์ƒˆ๋กœ์šด ํŠธ์œ— ๋‚ด์šฉ์„ ์ „์ฒด ํŠธ์œ—์— ์ถ”๊ฐ€์‹œํ‚ค๋Š” ์ž‘์—…์€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋งŒ๋“ค์–ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฆฌ์•กํŠธ๋Š” ๋‹จ๋ฐฉํ–ฅ ํ๋ฆ„์„ ์ง€ํ–ฅํ•œ๋‹ค๊ณ  ํ–ˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ๋ฅผ ์—ญ๋ฐฉํ–ฅ ํ˜น์€ ์–‘๋ฐฉํ–ฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์•„๋‹ˆ๋‹ค.

๋‹จ๋ฐฉํ–ฅ์˜ ์›์น™์€ ์—ฌ์ „ํžˆ ์ง€์ผœ์•ผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋Ÿฐ ๊ฒฝ์šฐ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด state ๋Œ์–ด์˜ฌ๋ฆฌ๊ธฐ ์ด๋‹ค.

 

state๊ฐ€ ๋Œ์–ด์˜ฌ๋ ค์ง€๋Š” ๋ฐฉ๋ฒ•๊ณผ ์‚ฌ์šฉ์— ๋Œ€ํ•ด ์•„์ฃผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ด์•ผ๊ธฐ ํ•˜์ž๋ฉด,

๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์— ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ props๋กœ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌํ•œ๋‹ค.

๊ทธ๋Ÿผ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ด ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉฐ ์ธ์ž๋กœ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋งŒ๋“ค์–ด์ง„ ๊ฐ’์„ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค!

๐Ÿ“Ž ๋ถ€๋ชจ์— ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ž๊ธฐ๊ฐ€ ๊ฐ–๊ณ  ์žˆ๋Š” ๊ฐ’, ํ˜น์€ ์–ด๋–ค ํ–‰์œ„๋ฅผ 'ํ•จ์ˆ˜์™€ ๋ฌปํ˜€์„œ ๋Œ๋ ค ๋ณด๋‚ด๋Š”', ๊ทธ๋Ÿฐ ๋А๋‚Œ์ด๋‹ค. ํ•˜ํ•˜.

 

 

 

 

 

 

 

 

๐Ÿ“‚ state ์‚ฌ์šฉ ๋ฐฉ๋ฒ•


๐Ÿ“Ž  useState๋ฅผ ์ž„ํฌํŠธ ํ•ด์•ผํ•œ๋‹ค.

๐Ÿ“Ž  ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์— ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์— ์ž„ํฌํŠธ ๋œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์— ์†์„ฑ์œผ๋กœ ์ „๋‹ฌํ•œ๋‹ค.

๐Ÿ“Ž  ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๐Ÿ“Ž  ๊ทธ๋ƒฅ ํ˜ธ์ถœํ•ด๋„ ๋˜๊ณ , ์ธ์ˆ˜๋กœ ๋„ฃ์–ด์„œ ๋ณด๋‚ด๋„ ๋œ๋‹ค.

 

 

๐Ÿ“ƒ ์˜ˆ์‹œ

NewTweet ์ปดํฌ๋„ŒํŠธ์˜ ๊ฐ์ฒด(๋ฐ์ดํ„ฐ)๋ฅผ Twittler ์ปดํฌ๋„ŒํŠธ๋กœ ๋ณด๋ƒ„

import React, { useState } from "react";
import "./styles.css";

const currentUser = "๊น€์ฝ”๋”ฉ";

function Twittler() {
  const [tweets, setTweets] = useState([
    {
      uuid: 1,
      writer: "๊น€์ฝ”๋”ฉ",
      date: "2020-10-10",
      content: "์•ˆ๋…• ๋ฆฌ์•กํŠธ"
    },
    {
      uuid: 2,
      writer: "๋ฐ•ํ•ด์ปค",
      date: "2020-10-12",
      content: "์ข‹์•„ ์ฝ”๋“œ์Šคํ…Œ์ด์ธ !"
    }
  ]);

  const addNewTweet = (newTweet) => {
    setTweets([...tweets, newTweet]);
  }; // ์ด ์ƒํƒœ ๋ณ€๊ฒฝ ํ•จ์ˆ˜๊ฐ€ NewTweetForm์— ์˜ํ•ด ์‹คํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  return (
    <div>
      <div>์ž‘์„ฑ์ž: {currentUser}</div>
      <NewTweetForm onButtonClick={addNewTweet}/> //onButtonClick์œผ๋กœ ์†์„ฑ ์ „๋‹ฌ
      <ul id="tweets">
        {tweets.map((t) => (
          <SingleTweet key={t.uuid} writer={t.writer} date={t.date}>
            {t.content}
          </SingleTweet>
        ))}
      </ul>
    </div>
  );
}

function NewTweetForm({ onButtonClick }) { // ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์— onButtonClick ๊ฐ€์ ธ์˜ด
  const [newTweetContent, setNewTweetContent] = useState("");

  const onTextChange = (e) => {
    setNewTweetContent(e.target.value);
  };

  const onClickSubmit = () => {
    let newTweet = {
      uuid: Math.floor(Math.random() * 10000),
      writer: currentUser,
      date: new Date().toISOString().substring(0, 10),
      content: newTweetContent
    };
    // TDOO: ์—ฌ๊ธฐ์„œ newTweet์ด addNewTweet์— ์ „๋‹ฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    onButtonClick(newTweet); // onButtonClick(=addNewTweet)ํ˜ธ์ถœ
  };

  return (
    <div id="writing-area">
      <textarea id="new-tweet-content" onChange={onTextChange}></textarea>
      <button id="submit-new-tweet" onClick={onClickSubmit}>
        ์ƒˆ ๊ธ€ ์“ฐ๊ธฐ
      </button>
    </div>
  );
}

function SingleTweet({ writer, date, children }) {
  return (
    <li className="tweet">
      <div className="writer">{writer}</div>
      <div className="date">{date}</div>
      <div>{children}</div>
    </li>
  );
}

export default Twittler;

 

 

 

 

๐Ÿ“‚ reference

์ฝ”๋“œ์Šคํ…Œ์ด์ธ