πŸ€–μ•„λ¬»λ”° νŠΈμœ„ν‹€λŸ¬ λ§Œλ“€κΈ° (React Starter CheetSheet Ver.1)

πŸ‘¨πŸ»β€πŸš€React Starter CheetSheet

πŸ‘¨πŸ»β€πŸŽ¨μ‚¬μ „ μ€€λΉ„

  1. λΉ λ₯Έ react app 생성 (터미널 μž…λ ₯)
npx create-react-app <ν”„λ‘œμ νŠΈμ΄λ¦„>

λ­”κ°€ μ‹ λ‚˜κ²Œ κΉ”μ•„λŒ€κ³  β€œν”„λ‘œμ νŠΈμ΄λ¦„β€ 으둜 λ˜μ–΄ μžˆλŠ” 디렉토리가 ν•˜λ‚˜ 생긴닀.

  1. cd <ν”„λ‘œμ νŠΈμ΄λ¦„>
  2. code . 둜 μ‹€ν–‰
  3. npm start 둜 μ„œλ²„ 돌리고 ν…ŒμŠ€νŠΈ 체크 : http://localhost:3000

πŸ‘©πŸ»β€πŸ¦³νŒŒμΌ ν™•μΈν•˜κΈ°

index.js 그리고 App.js κ°€ μžˆλ‹€.

일단 index.js λŠ” root 경둜 μ•ˆμœΌλ‘œ λ Œλ” ν•˜κ³ μž ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈλ₯Ό 톡째 render ν•΄ μ£ΌλŠ” ν•¨μˆ˜κ°€ μœ„μΉ˜ν•˜κ³  μžˆλ‹€.

μƒκΉ€μƒˆλŠ” μ•„λž˜μ™€ κ°™λ‹€.

import React from 'react'
import ReactDOM from 'react-dom'
import './index.css'
import Twittler from './App'
import reportWebVitals from './reportWebVitals'

ReactDOM.render(
  <React.StrictMode>
    <Twittler />
  </React.StrictMode>,
  document.getElementById('root')
)

// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals()

λ‚΄ μ•± 이름은 β€œTwittler” 둜 해쀄 κ±°λΌμ„œ import λΆ€λΆ„ 및 render 뢀뢄을 Twittler λΌλŠ” μ΄λ¦„μœΌλ‘œ κ°ˆμ•„ μΉ˜μ›Œλ²„λ Έλ‹€.

이제 μ—¬κΈ΄ κ±΄λ“€κ²Œ μ—†λ‹€.

App.js 둜 κ°€λ©΄ λ­”κ°€ μ½”λ“œκ°€ μžˆκΈ°λŠ” ν•œλ°, μ‹Ή λ‹€ μ§€μ›Œλ²„λ¦¬κ³ 

import React from 'react'
import './App.css'

export default Twittler

μš”λ ‡κ²Œ λ°”κΏ”μ€€ λ’€ μ‹œμž‘ν•˜λ©΄ λœλ‹€.

μ„Έμ„Ένžˆ λ”°μ§ˆλΌκ³  ν–ˆλŠ”λ° κ·Έλž¬λ‹€κ°€λŠ” ν•œλ„ 끝도 μ—†λ‹€ 일단 κ·Έλƒ₯ λ°›μ•„λ“€μ΄κΈ°λ‘œ ν–ˆλ‹€.

πŸ‘©πŸΏβ€πŸ¦°Twittler Component μƒμ„±ν•˜κΈ°

μ»΄ν¬λ„ŒνŠΈ μƒμ„±μ—λŠ” ν•¨μˆ˜ν˜• κ³Ό 클래슀 ν˜• 두가지 생성 방법이 μžˆλ‹€.

λ³€ν•  수 μžˆλŠ” 정보 (μƒνƒœ) λ₯Ό κ°–κ²Œ ν•˜λ €λ©΄ λ‹₯ ν΄λž˜μŠ€ν˜• μ»΄ν¬λ„ŒνŠΈλ‘œ λ§Œλ“€μ–΄μ•Ό ν•œλ‹€.

그리ꡬ 이름은.. Twittler 둜 ν•˜κΈ°λ£¨ ν–ˆμœΌλ‹ˆκΉŒ,

class Twittler extends React.Component {
  constructor(props) {
    super(props)
    this.state = {
      // μ–΄λ–€ μƒνƒœλ₯Ό μ€˜μ•Ό 할진 μ•±λ§ˆλ‹€ λ‹€λ₯΄κ²Ÿμ§€πŸŽ
    }
  }
  render() {
    // 기본적 UI λ₯Ό λ„μš°κΈ° μœ„ν•œ ν•¨μˆ˜.
  }
}

πŸ‘¨πŸ»β€πŸš€this.state 에 λ³€ν•  수 μžˆλŠ” 정보듀을 μž…λ ₯ν•˜κΈ°

μœ μ–΄ν΄λž˜μŠ€μ— λ‚˜μ™€ μžˆλŠ” κΈ°λ³Έ μƒνƒœ (Mockup-data) λ₯Ό κ°€μ Έλ‹€ λ„£μ–΄ μ£Όμ—ˆλ‹€.

λ­”κ°€ μΆ”μΈ‘μœΌλ‘œλŠ” 좔후에 μ € this.state.tweets λΌλŠ” 배열에 μš°λ¦¬κ°€ μž…λ ₯ν•  값을 λ°°μ—΄.push 둜 λ„£μœΌλ©΄ 될 κ±° 같은데

state λŠ” 직접 μˆ˜μ •μ΄ λΆˆκ°€ν•˜λ‹€κ³  ν•œλ‹€.

setState λ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€κ³  ν•˜λŠ”λ° 일단 그건 λ‚˜μ€‘μœΌλ‘œ 미룬닀.

class Twittler extends React.Component {
  constructor(props) {
    super(props)
    this.state = {
      tweets: [
        {
          uuid: 1,
          writer: 'μ• ν”Œμ΄πŸŽ',
          date: '2020-11-19',
          content: 'λ¦¬μ•‘νŠΈλŠ” μ–΄λ•Œ?',
        },
        {
          uuid: 2,
          writer: 'κ±΄λ§ˆμ§œμ‘πŸ‘¨πŸ»β€',
          date: '2020-11-19',
          content: 'Not easy for me..😭',
        },
      ],
    }
  }
  render() {
    // 기본적 UI λ₯Ό λ„μš°κΈ° μœ„ν•œ ν•¨μˆ˜.
  }
}

πŸ‘©πŸΏβ€πŸ¦°κΈ°λ³Έμ  UI λ₯Ό λ„μš°λŠ” render() λ₯Ό κ΅¬ν˜„ν•˜κΈ°

일단 μ„œλ²„λ₯Ό 띄웠을 λ•Œ, 기본적인 μΈν„°νŽ˜μ΄μŠ€ μ •λ„λŠ” λ³΄μ—¬μ€˜μ•Ό ν•  ν…Œλ‹ˆκΉŒ 이 λ˜ν•œ 일단 μœ μ–΄ν΄λž˜μŠ€μ—μ„œ 가져와 λ„£μ–΄λ³΄μž.

// class Twittler λ‚΄ render ν•¨μˆ˜ κ΅¬ν˜„
render() {
  <div>
    <div>μž‘μ„±μž: κΉ€μ½”λ”©</div>
    <div id="writing-area">
      <textarea id="new-tweet-content"></textarea>
      <button id="submit-new-tweet">μƒˆ κΈ€ μ“°κΈ°</button>
    </div>
    <ul id="tweets">
      <!-- 이 뢀뢄은 this.state.tweetsλ₯Ό λ°”νƒ•μœΌλ‘œ SingleTweet μ»΄ν¬λ„ŒνŠΈκ°€ 반볡 좜λ ₯될 κ²ƒμž…λ‹ˆλ‹€. -->
    </ul>
  </div>
}

μ—¬νŠΌ λ°‹λ°‹ν•˜μ§€λ§Œ 됐고 이제 ul νƒœκ·Έ ν•˜μœ„μ— λ„£μ–΄μ Έ μžˆλŠ” 주석 λŒ€μ‹ μ— μ•„κΉŒ λ„£μ—ˆλ˜ λͺ©μ—… 데이터λ₯Ό λΆˆλŸ¬λ‹€ λ„£μ–΄μ•Ό ν•œλ‹€. μ–΄λ–»κ²Œ λ„£μ„κΉŒ?

πŸ‘¨πŸ»β€πŸš€JSX ν‘œν˜„μ‹κ³Ό map, SingleTweet Component

ul νƒœκ·Έ ν•˜μœ„μ— κΈ€ λͺ©λ‘μ„ 뢈러 와야 ν•˜λŠ”λ° λͺ©μ—… λ°μ΄ν„°λŠ” ν˜„μž¬ 어디에 μžˆμ§€?

this.state.tweets 에 μžˆλ‹€. μ–˜λŠ” 심지어 배열이닀.

그러면 일단 JSX ν‘œν˜„μ‹μ„ μ“°κΈ° μœ„ν•΄ ul μ•„λž˜μ—,

{ } Curly Bracket 을 μž…λ ₯ν•˜κ³  κ·Έ μ•ˆμ—μ„œ 배열을 λ°˜λ³΅μ„ λŒλ©΄μ„œ tweet ν•˜λ‚˜ ν•˜λ‚˜ λ§ˆλ‹€ μ–΄λ–»κ²Œ μ–΄λ–»κ²Œ 가곡을 ν•  것이닀.

<ul id="tweets">
  {this.state.tweets.map(tweet => {
    return <SingleTweet />
  })}
</ul>

뭘 리턴할 건고 ν•˜λ‹ˆ SingleTweet μ΄λΌλŠ” μ»΄ν¬λ„ŒνŠΈλ₯Ό 리턴할 거라 ν•œλ‹€.

그리고 SingleTweet μ»΄ν¬λ„ŒνŠΈμ— μ„Έ 가지 속성을 지정해 μ£Όμ—ˆλ‹€.

<ul id="tweets">
  {this.state.tweets.map(tweet => {
    return (
      <SingleTweet
        writer={tweet.writer}
        date={tweet.date}
        content={tweet.content}
      />
    )
  })}
</ul>

κ·ΈλŸ΄λ“― ν•΄μ‘Œλ‹€. writer, date, content 속성이 있고 속성 κ°’μœΌλ‘œλŠ” λ‹€μ‹œ Curly bracket 으둜 반볡 μš”μ†Œ ν•˜λ‚˜ ν•˜λ‚˜μ˜ writer, date, content λ₯Ό λ°›μ•„ λ„£μ—ˆλ‹€.

이제 render ν•¨μˆ˜λŠ” λ‚΄λΆ€μ μœΌλ‘œ SingleTweet μ΄λΌλŠ” μ»΄ν¬λ„ŒνŠΈκ°€ μ–΄λ–»κ²Œ μ •μ˜ λ˜μ–΄ μžˆλŠ”μ§€ κ·Έ 본체λ₯Ό 찾으러 κ°„λ‹€.

πŸ‘©πŸΏβ€πŸ¦°props λ₯Ό νŒŒλΌλ―Έν„°λ‘œ λ°›λŠ” SingleTweet 본체

였 λ­”κ°€ 더 ꡬ체적으둜 생겼닀. λ³Έμ²΄λŠ” 더 κ΅¬μ²΄μ μ΄κ΅¬λ‚˜.

li νƒœκ·Έλ₯Ό λ¦¬ν„΄ν•˜λŠ”λ° 내뢀에 μ„Έ 개의 div νƒœκ·Έκ°€ μžλ¦¬ν•˜κ³ 

각각의 content μ˜μ—­μ— μœ„μ— μ •μ˜ν–ˆλ˜ writer, date, content 속성을 props λ₯Ό 톡해 λ°›μ•„ λ„£λŠ”λ‹€.

function SingleTweet(props) {
  return (
    <li>
      <div>{props.writer}</div>
      <div>{props.date}</div>
      <div>{props.content}</div>
    </li>
  )
}

이제 νŠΈμœ— ν•˜λ‚˜ λ‹Ή μœ„μ™€ 같은 ν˜•νƒœλ‘œ λ¦¬ν„΄λœλ‹€.

μ΄μ œλŠ” textarea 에 κΈ€μžλ₯Ό μž…λ ₯ν•΄λ³Ό 차둀이닀.

πŸ‘¨πŸ»β€πŸš€ textarea κΈ€μ“°κΈ°λ₯Ό μ»¨νŠΈλ‘€ν•˜λŠ” handleChange ν•¨μˆ˜

이제 κΈ°λ³Έ 데이터λ₯Ό λ³΄μ—¬μ£ΌλŠ” λ°μ—λŠ” μ„±κ³΅ν–ˆμœΌλ‹ˆ 이제 μ € textarea 에 κΈ€μžλ₯Ό ν•˜λ‚˜μ”© μž…λ ₯ν•  λ•Œλ§ˆλ‹€ 값이 λ“€μ–΄κ°€κ²Œ ν•΄λ³΄μž.

κΈ€μžκ°€ λ“€μ–΄κ°€μ„œ 화면에 λ³΄μ—¬μ§€λŠ” 건 일단 미루고

λ¨Όμ € 값이 λ“€μ–΄κ°„λ‹€λŠ” 것을 두 눈으둜 확인 해봐야 κ² λ‹€.

νŠΈμœ— λ‚΄μš© (κ°’) 을 μž…λ ₯ν•˜κ³  λ‚΄μš©μ„ μΆ”κ°€ν•΄μ„œ 화면에 λ³΄μ—¬μ§€κ²Œ ν•˜λŠ” 것 μžμ²΄κ°€ state 객체λ₯Ό μˆ˜μ •ν•˜λŠ” ν–‰μœ„μ™€ κ°™λ‹€.

κ·Έλž˜μ„œ state λ‚΄ tweets λΌλŠ” ν‚€ λ‹€μŒμœΌλ‘œ value λΌλŠ” ν‚€λ₯Ό λ§Œλ“€κ³  빈 λ¬Έμžμ—΄μ„ λ‘μ—ˆλ‹€.

this.state.value = "" λŠ”

μš°λ¦¬κ°€ μž…λ ₯ν•˜λŠ” ν…μŠ€νŠΈκ°€ μž μ‹œ λ¨Έλ¬Όλ‹€ 갈 νœ΄κ²Œμ†Œ 같은 λŠλ‚Œμ΄λ‹€.

class Twittler extends React.Component {
  constructor(props) {
    super(props)
    this.state = {
      tweets: [
        {
          uuid: 1,
          writer: 'μ• ν”Œμ΄πŸŽ',
          date: '2020-11-19',
          content: 'λ¦¬μ•‘νŠΈλŠ” μ–΄λ•Œ?',
        },
        {
          uuid: 2,
          writer: 'κ±΄λ§ˆμ§œμ‘πŸ‘¨πŸ»β€',
          date: '2020-11-19',
          content: 'Not easy for me..😭',
        },
      ],
      value: '', // μž„μ‹œ νœ΄κ²Œμ†Œ
    }
  }
}

그리고 클래슀 내뢀에 textarea 의 μƒνƒœ 변경을 μœ„ν•œ (setState) ν•¨μˆ˜ handleChange λ₯Ό μ„ μ–Έν•œλ‹€.

handleChange(event) {
  this.setState({ value: event.target.value });
}

document.querySelector(β€˜#new-tweet-content’).value λ₯Ό 톡해 μž…λ ₯ν•œ 값을 확인할 수 μžˆλ‹€.

이λ₯Ό event.target.value 둜 λ°›μ•„μ„œ state 객체의 value ν‚€κ°’ λ§Œμ„ λ°”κΎΈμ–΄ μ£Όμ—ˆλ‹€.

그리고 contructor μ•ˆμ— handleChange 이 window 객체λ₯Ό 가져닀쓰지 μ•Šκ²Œ bind 둜 κ³ μ • ν•΄μ€€λ‹€.

class Twittler extends React.Component {
  constructor(props) {
    super(props)
    this.state = {
      tweets: [
        {
          uuid: 1,
          writer: 'μ• ν”Œμ΄πŸŽ',
          date: '2020-11-19',
          content: 'λ¦¬μ•‘νŠΈλŠ” μ–΄λ•Œ?',
        },
        {
          uuid: 2,
          writer: 'κ±΄λ§ˆμ§œμ‘πŸ‘¨πŸ»β€',
          date: '2020-11-19',
          content: 'Not easy for me..😭',
        },
      ],
      value: '', // μž„μ‹œ νœ΄κ²Œμ†Œ
    }
  }
  this.handleChange = this.handleChange.bind(this);
}

λ§ˆμ§€λ§‰μœΌλ‘œ render() ν•¨μˆ˜ 내에 textarea νƒœκ·Έμ— onChange 이벀트λ₯Ό κ±Έμ–΄μ€€λ‹€.

JSX 문법을 μ“Έ λ•ŒλŠ” 컬리 λΈŒλΌμΌ“ 을 μ¨μ„œ μ•ˆμ— λ„£μ–΄μ£ΌλŠ” 것을 μžŠμ§€ 말자.

<textarea
  id="new-tweet-content"
  cols="30"
  rows="3"
  onChange={this.handleChange}
  value={this.state.value} // μ–˜λŠ” μ•ˆμ¨μ€˜λ„ 될거같은데 μ •ν™•νžˆλŠ” λͺ¨λ₯΄κ² λ„λ‹€.
></textarea>

그리고 React Developer Tools λ₯Ό λ°›κ³ 

https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi

npm start 둜 μ„œλ²„λ₯Ό 돌렀 λ‚˜μ˜€λŠ” νŽ˜μ΄μ§€μ—μ„œ 개발자 도ꡬλ₯Ό μ—΄κ³ ,

react λͺ¨μ–‘ Components λ₯Ό λˆ„λ₯΄λ©΄ props, state 등을 ν™•μΈν•˜κΈ° μ’‹λ‹€.

twittler1

state 객체 λ‚΄ value 에 λ‚΄κ°€ μž…λ ₯ν•œ 값이 λ“€μ–΄κ°„ 것을 확인할 수 μžˆλ‹€.

μ΄μ œλŠ” λ²„νŠΌμ„ ν΄λ¦­ν–ˆμ„ λ•Œ, λ‚΄κ°€ μž…λ ₯ ν•œ μœ„μ˜ 값이 μ‹€μ œλ‘œ this.state.tweets 배열에 객체 ν˜•νƒœλ‘œ λ“€μ–΄κ°€κ²Œλ” ν•΄μ€˜μ•Ό ν•œλ‹€.

πŸ‘©πŸΏβ€πŸ¦° λ²„νŠΌμ„ ν΄λ¦­ν–ˆμ„ λ•Œ μž…λ ₯ν•œ λ‚΄μš©μ„ λ Œλ”λ§ν•˜λŠ” handleClick ν•¨μˆ˜

React Dev Tools λ₯Ό μ¨μ„œ μ§€μ •ν•œ value 에 λ‚΄κ°€ 써넣은 λ©”μ‹œμ§€κ°€ 듀어가도둝 ν•œ κ±°λŠ” μ•Œκ±° κ°™λ‹€.

이제 이 μž„μ‹œ μ €μž₯μ†Œ 에 μ €μž₯ν•œ 내역을 μ‹€μ œ 배열에 객체 ν˜•νƒœλ‘œ λ‹΄μ•„ λ„£μ–΄ μ£Όμ–΄μ•Ό ν•œλ‹€.

handleClick μ΄λΌλŠ” ν•¨μˆ˜λ₯Ό λ§ˆμ°¬κ°€μ§€λ‘œ class 내에 λ§Œλ“€μ–΄ μ€€λ‹€.

handleClick(val) {
  // val 은 9μ—μ„œ 넣은 μ‹€μ œ νƒ€μž 친 κ·Έ 값이 λ“€μ–΄κ°€λŠ” κ±°λ‹€.
  // mockdata 의 ν˜•νƒœμ™€ κ°™μ•„μ•Ό ν•˜λ‹ˆκΉŒ 베껴였자, μ“°κΈ° μ‰½κ²Œ λ³€μˆ˜μ— λ‹΄κ³ !
  let newTweet = {
    uuid: this.state.tweets.length + 1, // λ°°μ—΄μ˜κΈΈμ΄ + 1
    writer: "CodeTasteJung",
    date: new Date().toLocaleString(),
    content: val,
  };

}

인자둜 λ“€μ–΄κ°€λŠ” val 은 μ•„κΉŒ μ‹€μ œ νƒ€μ΄ν•‘ν•œκ²Œ μž„μ‹œνœ΄κ²Œμ†Œμ— μ €μž₯된 κ·Έ κ°’ (this.state.value) 을 μ˜λ―Έν•œλ‹€.

그리고 λͺ©μ—… 데이터와 λ˜‘κ°™κ²Œ newTweet μ΄λΌλŠ” 객체λ₯Ό ν•˜λ‚˜ μ„ μ–Έν•΄ μ£Όκ³ ,

κ·Έ μ•ˆμ— 킀와 값듀을 λ„£λŠ”λ‹€. content μ˜μ—­μ—λŠ” νŒŒλΌλ―Έν„°λ‘œ 받은 κ·Έ κ°’ val 을 λ„£μ–΄μ€€λ‹€.

그리고 setState 둜 전체 tweets λ°°μ—΄μ˜ μƒνƒœλ₯Ό μ„€μ •ν•œλ‹€.

기쑴에 있던 mockup data ν”ŒλŸ¬μŠ€ newTweet 객체λ₯Ό μΆ”κ°€λ‘œ λ„£μ–΄μ£ΌλŠ” 것이닀.

this.setState({ tweets: [...this.state.tweets, newTweet] })
this.setState({ value: '' })

그리고 λ§ˆμ§€λ§‰μœΌλ‘œ μž„μ‹œ νœ΄κ²Œμ†ŒμΈ value 의 값을 λ‹€μ‹œ μ΄ˆκΈ°ν™” μ‹œμΌœ λ†“λŠ”λ‹€.

λ‹€λ₯Έ 값듀도 λ“€μ–΄ μ˜€κ²Œλ” ν•΄μ•Ό ν•˜λ‹ˆκΉŒ.

그러면 handleClick 의 μ½”λ“œλŠ” μ•„λž˜μ™€ κ°™κ²Œ λœλ‹€.

handleClick(val) {
  // val 은 9μ—μ„œ 넣은 μ‹€μ œ νƒ€μž 친 κ·Έ 값이 λ“€μ–΄κ°€λŠ” κ±°λ‹€.
  // mockdata 의 ν˜•νƒœμ™€ κ°™μ•„μ•Ό ν•˜λ‹ˆκΉŒ 베껴였자, μ“°κΈ° μ‰½κ²Œ λ³€μˆ˜μ— λ‹΄κ³ !
  let newTweet = {
    uuid: this.state.tweets.length + 1, // λ°°μ—΄μ˜κΈΈμ΄ + 1
    writer: "CodeTasteJung",
    date: new Date().toLocaleString(),
    content: val,
  };
  this.setState({ tweets: [...this.state.tweets, newTweet] })
  this.setState({ value: '' })
}

λ§ˆμ°¬κ°€μ§€λ‘œ constructor 내에 ν•¨μˆ˜ 바인딩 ν•΄μ£Όκ³ 

this.handleClick = this.handleClick.bind(this)

λ²„νŠΌ νƒœκ·Έλ₯Ό μ°Ύμ•„μ„œ onClick 이벀트λ₯Ό κ±Έμ–΄ μ€€λ‹€.

<button
  id="submit-new-tweet"
  onClick={() => {
    this.handleClick(this.state.value)
  }}
>
  μƒˆ κΈ€ μ“°κΈ°
</button>

아직 μ •ν™•νžˆ κΈ΄κ°€λ―Όκ°€ ν•˜μ§€λ§Œ μ²˜μŒμ—λŠ” onClick λ‚΄ ν•¨μˆ˜λ₯Ό μ–΄λ–»κ²Œ μ²˜λ¦¬ν•΄ μ£Όμ–΄μ•Ό ν•˜λ‚˜ μ‹Άμ—ˆλ‹€.

일단 λ°›μ•„λ“€μ΄μž..

πŸ€–μ΅œμ’… Code

import React from 'react'
import './App.css'

class Twittler extends React.Component {
  constructor(props) {
    super(props)
    this.state = {
      tweets: [
        {
          uuid: 1,
          writer: 'μ• ν”Œμ΄πŸŽ',
          date: '2020-11-19',
          content: 'λ¦¬μ•‘νŠΈλŠ” μ–΄λ•Œ?',
        },
        {
          uuid: 2,
          writer: 'κ±΄λ§ˆμ§œμ‘πŸ‘¨πŸ»β€',
          date: '2020-11-19',
          content: 'Not easy for me..😭',
        },
      ],
      value: '',
    }
    this.handleChange = this.handleChange.bind(this)
    this.handleClick = this.handleClick.bind(this)
  }

  handleChange(event) {
    this.setState({ value: event.target.value })
  }
  handleClick(val) {
    let newTweet = {
      uuid: this.state.tweets.length + 1,
      writer: 'CodeTasteJung',
      date: new Date().toLocaleString(),
      content: val,
    }
    this.setState({ tweets: [...this.state.tweets, newTweet] })
    this.setState({ value: '' })
  }
  render() {
    return (
      <div>
        <div>μž‘μ„±μž: πŸ‘¨πŸ»β€πŸš€Dev-Seolleung2πŸ‘¨πŸ»β€πŸš€</div>
        <div id="writing-area">
          <textarea
            id="new-tweet-content"
            cols="30"
            rows="3"
            onChange={this.handleChange}
            value={this.state.value}
          ></textarea>
          <button
            id="submit-new-tweet"
            onClick={() => {
              this.handleClick(this.state.value)
            }}
          >
            μƒˆ κΈ€ μ“°κΈ°
          </button>
        </div>
        <div>
          <ul id="tweets">
            {this.state.tweets.map(tweet => {
              return (
                <SingleTweet
                  writer={tweet.writer}
                  date={tweet.date}
                  content={tweet.content}
                />
              )
            })}
          </ul>
        </div>
      </div>
    )
  }
}

function SingleTweet(props) {
  return (
    <li>
      <div>{props.writer}</div>
      <div>{props.date}</div>
      <div>{props.content}</div>
    </li>
  )
}

export default Twittler

Written by@[DotoriMook]
ν”„λ‘ νŠΈμ—”λ“œ μ£Όλ‹ˆμ–΄ 개발자 λ„ν† λ¦¬λ¬΅μ˜ 기술개발 λΈ”λ‘œκ·Έ μž…λ‹ˆλ‹€.

GitHubMediumTwitterFacebook