[๐Ÿ’ป ์ฝ”๋“œ์Šคํ…Œ์ด์ธ  FE 44๊ธฐ] โœจ๋ฐ˜๋”ง๋ถˆ์ด๋ฐ˜โœจ React Twittler state-props ์˜์‚ฌ์ฝ”๋“œ์ž‘์„ฑ

JiEunยท2023๋…„ 3์›” 27์ผ
0
post-thumbnail

โœ”๏ธ ์‹œ์ž‘

์ข…ํ•ฉ ํ€ด์ฆˆ์—์„œ ๋ฌด๋ ค 4๊ฐœ๋‚˜ ํ‹€๋ ค์„œ ๋ฐ˜๋”ง๋ถˆ์ธ๋ฐ˜์— ์„ ์ • ๋˜์—ˆ๋‹ค...ใ… 

์—ด์‹ฌํžˆ ํ’€์—ˆ๋‹ค ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ์—ญ์‹œ๋‚˜ ๋‹ค์ค‘ ๋ฌธ์ œ๋‚˜ ์ˆ˜์ •ํ•œ ๋ฌธ์ œ๋ฅผ ํ‹€๋ ธ๋‹ค.


๐Ÿ“React Twittler state-props

์˜ค๋Š˜ ํ•™์Šตํ•œ ๋‚ด์šฉ

  • JSX ๋ฌธ๋ฒ•์˜ ๊ทœ์น™์„ ์ดํ•ดํ•œ๋‹ค.
  • ์ปดํฌ๋„ŒํŠธ์˜ ๊ฐœ๋…์„ ์ดํ•ดํ•œ๋‹ค.
  • Creact-React-App์„ ์ด์šฉํ•ด ๋ฆฌ์•กํŠธ ๊ฐœ๋ฐœํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ• ์ˆ˜ ์žˆ๋‹ค.
  • React๋ฅผ ํ†ตํ•ด ํŽ˜์ด์ง€๊ฐ€ ๋ Œ๋”๋ง ๋˜๋Š” ๊ณผ์ •์„ ์ดํ•ดํ•œ๋‹ค.
  // TODO : ์ƒˆ๋กœ ํŠธ์œ—์„ ์ž‘์„ฑํ•˜๊ณ  ์ „์†กํ•  ์ˆ˜ ์žˆ๊ฒŒ useState๋ฅผ ์ ์ ˆํžˆ ํ™œ์šฉํ•˜์„ธ์š”.
// useState์— dummyTweets์œผ๋กœ ์ดˆ๊ธฐ ๊ฐ’ ๋„ฃ์–ด์ฃผ๊ธฐ

const [username, setUserName] = useState('');
const [msg, setMsg] = useState('');
const [tweets, setTweets] = useState(dummyTweets);

// picture ์ถœ๋ ฅ์ด ์•ˆ๋˜๋Š” ๋ฌธ์ œ๋กœ ์ด์ „ ํŒŒ์ผ์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ
const getRandomNumber = (min, max) => {
    return parseInt(Math.random() * (Number(max) - Number(min) + 2));
  };

const handleButtonClick = (event) => {
// tweet์— ์‹ ๊ทœ ๊ฐ์ฒด ์ƒ์„ฑํ•˜๊ธฐ username, content์— username, msg ์ถ”๊ฐ€ํ•˜๊ธฐ
   const tweet = {
     id: tweets.length + 1,
     username: username,
     picture: `https://randomuser.me/api/portraits/women/${getRandomNumber(
        1,
        98
      )}.jpg`,
     content: msg,
     createdAt: new Date(),
     updatedAt: new Date(),
   }
   // TODO : Tweet button ์—˜๋ฆฌ๋จผํŠธ ํด๋ฆญ์‹œ ์ž‘๋™ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•˜์„ธ์š”.
    // ํŠธ์œ— ์ „์†ก์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

   // setTweets ํ•จ์ˆ˜์— ์ƒ์„ฑํ•œ tweet ์ƒ๋‹จ์— ๋ฐฐ์น˜ํ•˜๊ธฐ
   // dummyTweets๊ฐ’์ด ๋‹ด๊ฒจ์žˆ๋Š” tweets ๋’ค์— spread syntax๋กœ ์ถ”๊ฐ€ํ•ด ์ฃผ๊ธฐ
   // (๋ฐฐ์—ด, ๊ฐ์ฒด๋Š” ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ํ•ด์„œ ๊ฐ€์ ธ์™€์•ผํ•œ๋‹ค. (push, unshift))
    return setTweets([tweet, ...tweets]);
  };

.
.
.
// button ํƒœ๊ทธ onClick={ํ•ด๋‹น ํ•จ์ˆ˜} ํ•จ์ˆ˜ ์ถ”๊ฐ€ํ•ด ์ฃผ๊ธฐ
// ํด๋ฆญ ์‹œ ์ž‘์„ฑ ๋˜๋„๋ก ์ˆ˜์ •
<button className='tweetForm__submitButton' onClick={handleButtonClick}>์ „์†ก</button>

์ž˜ ๋ชจ๋ฅด๋Š” ๋ถ€๋ถ„

  • useState์˜ ์“ฐ์ž„์ƒˆ๋ฅผ ์ •ํ™•ํžˆ ์•Œ๊ธฐ ์–ด๋ ค์› ๋‹ค.
  • onClick={ํ•จ์ˆ˜ ํ˜ธ์ถœ}์ค‘ {} ์ค‘๊ด„ํ˜ธ์— ๋“ค์–ด๊ฐ€๋Š” ๋ถ€๋ถ„์„ ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ•ด์•ผํ•˜๋Š”์ง€ ํ—ท๊ฐˆ๋ ธ๋‹ค.

์–ด๋ ค์› ๋˜ ๋ถ€๋ถ„

  • useState()์˜ ์“ฐ์ž„์ƒˆ๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ํž˜๋“ค์—ˆ๋‹ค.
  • ๋ถ„๋ช… ์ž˜ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์ธ๋ฐ ํ…Œ์ŠคํŠธ ํ†ต๊ณผ๊ฐ€ ์•ˆ๋˜์„œ ํ•œ์ฐธ ์ฐพ์•˜๋˜ ๊ฑฐ ๊ฐ™๋‹ค. ๋‹ค๋ฅธ ํŽ˜์ด์ง€์— ์ค‘๋ณต ์„ ์–ธ๋˜์–ด์„œ ๊ทธ๋žฌ์—ˆ๋‹ค. (ํŽ˜์–ด๋ถ„์˜ ๋„์›€์œผ๋กœ ์˜ค๋ฅ˜๋ฅผ ๋ฐ”๋กœ ์ฐพ์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.)

๋Š๋‚€์ 

  • ์ด๋ฒˆ ํ•™์Šต์—์„œ๋Š” ๋ถ€์กฑํ•œ ์ ์ด ๋งŽ์•„์„œ ์œ ํŠœ๋ธŒ๋ฅผ ๋งŽ์ด ์ฐธ๊ณ ํ•˜๊ฒŒ ๋œ๊ฑฐ ๊ฐ™๋‹ค.
    ๋งˆ์ง€๋ง‰ setTweets([tweet, ...tweets]); ์ด๋ถ€๋ถ„๋„ ์™œ ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•ด์•ผํ•˜๋Š”์ง€๋„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.
    ๋ฐฐ์—ด, ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ useState ์‚ฌ์šฉ์‹œ ๊นŠ์€ ๋ณต์‚ฌ ํ›„ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

์ดˆ๋ฐ˜์— unshift ์‚ฌ์šฉํ•ด์„œ ์ด๊ฒŒ ์™œ ์•ˆ ๋˜๋Š”์ง€ ์˜๋ฌธ์„ ๊ฐ€์กŒ๋˜ ๊ฑฐ ๊ฐ™๋‹ค.


โœ๏ธ ๋งˆ์น˜๋ฉฐ

์ด๋ฒˆ ๋ฐ˜๋”ง๋ถˆ์ด ๊ณผ์ œ ๋ธ”๋กœ๊น…ํ•˜๋ฉด์„œ ๋‚ด๊ฐ€ ๋†“์ณค๋˜ ๋ถ€๋ถ„์„ ๋ฐœ๊ฒฌํ•˜๊ธฐ๋„ ํ•˜๊ณ 
๋˜๋Œ์•„๋ณด๋Š” ์‹œ๊ฐ„์ด ๋˜์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

profile
๐Ÿ’ป ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ๋ชฉํ‘œ๋กœ ์„ฑ์žฅ ์ค‘! (์•Œ์•„๋ดค๋˜ ๋‚ด์šฉ ๋“ฑ์„ ์ •๋ฆฌํ•˜๊ธฐ)

0๊ฐœ์˜ ๋Œ“๊ธ€