2 ๋ถ„ ์†Œ์š”

React?๐Ÿ“

๐Ÿณ๏ธ React๋ž€ javascript์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

JSX?

๐Ÿณ๏ธ const hi = < ํƒœ๊ทธ>Hi< ํƒœ๊ทธ>;

์œ„์˜ ์ฝ”๋“œ๋Š” JS๋„ HTML๋„ ์•„๋‹Œ javascript syntax extension๋ผ๊ณ  ํ•˜๋Š” JS์˜ ํ™•์žฅ๋ฒ„์ „์ด๋‹ค.

.js ํŒŒ์ผ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ๋ณ„๋„์˜ ์ปดํŒŒ์ผ ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผ์ง€๋งŒ js๋ฌธ๋ฒ•์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋‹ค.

JSX๋Š” ์–ด๋–ค ํƒœ๊ทธ๋ผ๋„ self closing tag๊ฐ€ ๊ฐ€๋Šฅํ•จ. ex) div /div => div /

์†Œ๊ด„ํ˜ธ๋กœ ๊ฐ์‹ธ์ฃผ๊ณ  ๋ฌด์กฐ๊ฑด ํ•˜๋‚˜์˜ ํƒœ๊ทธ์•ˆ์— ์ค‘์ฒฉ์š”์†Œ๋ฅผ ๋‹ด์•„์ฃผ์–ด์•ผํ•œ๋‹ค.

ReactDOM.render(<h1>Hello, world!</h1>, document.getElementById("root"));

DOM node์— ์ถ”๊ฐ€๋˜์–ด ํ™”๋ฉด์— ๋žœ๋”๋ง๋˜๋ ค๋ฉด ์œ„์™€๊ฐ™์ด ์ž‘์„ฑํ•ด์ค€๋‹ค. JS์˜ appendchild ๋Š๋‚Œ์ธ๊ฒƒ ๊ฐ™๋‹ค.

Component์™€ Props

๐Ÿณ๏ธ 1. Component

component(์ปดํฌ๋„ŒํŠธ)๋ž€ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ UI ๋‹จ์œ„์ด๋‹ค. ( ํ•จ์ˆ˜๋ž‘ ๋น„์Šทํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํŽธํ•จ )

๐Ÿณ๏ธ 2. Props

์ด๋Ÿฌํ•œ component(์ปดํฌ๋„ŒํŠธ)์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ์—ญํ• ์„ ํ•˜๋Š”๊ฒƒ์„ Props๋ผ๊ณ  ํ•œ๋‹ค.

function Welcome(props) {
  return <h1>Hello, {props.name}!</h1>;
}

// 2. App ์ปดํฌ๋„ŒํŠธ ์ •์˜
function App() {
  return (
    <div>
      <Welcome name="wecoder" />
      <Welcome name="John" />
      <Welcome name="Sara" />
    </div>
  );
}

ReactDOM.render(<App />, document.getElementById("root"));

Welcome์ด๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ App์ด๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์‹œ์ด๋‹ค. ์ด๋ ‡๊ฒŒ๋˜๋ฉด App์€ ๋ถ€๋ชจ Welcomde์€ ์ž์‹์ด๋ผ๋Š” ๊ด€๊ณ„๊ฐ€ ํ˜•์„ฑ๋œ๋‹ค.

Component์˜ State

๐Ÿณ๏ธ State : ํƒ€์ž…์€ Object์ด๊ณ  ํ™”๋ฉด์— ๋ณด์—ฌ์ค„ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๊ฐ’์ด๋‹ค.

props์™€ ๋‹ค๋ฅธ์ ์ด์žˆ๋‹ค๋ฉด props๋Š” ๋ถ€๋ชจ์—๊ฒŒ์„œ ๋ฐ›์•„์•ผ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด state๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ๋„ ์ •์˜ํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

function Button(props) {
  const [isClicked, setIsClicked] = useState(false);

  return (
    <button className="btn" onClick={() => setIsClicked(!isClicked)}>
      {isClicked ? "์ข‹์•„์š”" : "์‹ซ์–ด์š”"}
    </button>
  );
}

๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ๋•Œ๋งˆ๋‹ค ๊ฐ’์ด ๋ฐ”๋€Œ๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ.

๋ฆฌ์•กํŠธ๋ฅผ ์™œ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?

  1. ๋ชจ๋ฐ”์ผ์•ฑ์œผ๋กœ ๋ฐœํ–‰์ด ์‰ฝ๋‹ค.
  2. ์•ฑ ์ฒ˜๋Ÿผ ๋›ฐ์–ด๋‚œ UX
  3. ๊ทธ๋ƒฅ ์›น์‚ฌ์ดํŠธ๋ณด๋‹ค ๋น„์ฆˆ๋‹ˆ์Šค์ ์œผ๋กœ ๊ฐ•์ ์ด์žˆ๋‹ค.


์ž ์ด์ œ ์‹œ์ž‘ํ•ด๋ณด์ž.

  1. node.js๋ฅผ ์ตœ์‹ ๋ฒ„์ „์œผ๋กœ ๊น”์•„์ค€๋‹ค.
  2. ํด๋”๋ฅผ ๋งŒ๋“ค๊ณ  vscode๋กœ ํ‚จ ํ›„ โžก๏ธ ํ„ฐ๋ฏธ๋„์ฐฝ์— โ€˜npx create-react-app <ํ”„๋กœ์ ํŠธ ์ด๋ฆ„="">' ์„ ์นœ๋‹ค.
  3. ํ„ฐ๋ฏธ๋„์— โ€˜npm startโ€™ ์ž…๋ ฅ ํ›„ ์˜ˆ์‹œ ํŽ˜์ด์ง€๊ฐ€ ๋‚˜์˜ค๋Š”์ง€ ํ™•์ธ




๊ธฐ์ดˆ ์„ค๋ช…๐Ÿšฉ

โ€˜node.jsโ€™๋ฅผ ์„ค์น˜ํ•œ ์ด์œ  โžก๏ธ create react app์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด -> node.js๋ฅผ ๊น”๋ฉด npm์ด๋ผ๋Š” ํˆด์„ ์‚ฌ์šฉ๊ฐ€๋Šฅ


public->index.html (๋ฉ”์ธํŽ˜์ด์ง€ ) โžก๏ธ โ€˜src->app.jsโ€™๋ฅผ ๋Œ์–ด๋‹ค ์‚ฌ์šฉํ•˜๊ณ ์žˆ๋‹ค.


package.json โžก๏ธ ์„ค์น˜ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ชฉ๋ก


node_modules โžก๏ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ง‘ํ•ฉ์†Œ


public โžก๏ธ static ํŒŒ์ผ ๋ณด๊ด€ํ•จ


src โžก๏ธ์†Œ์Šค์ฝ”๋“œ ๋ณด๊ด€ํ•จ


src-index.js โžก๏ธ app.js์™€ ๋ฉ”์ธํŽ˜์ด์ง€๋ฅผ ์ด์–ด์คŒ root


App.js์—์„œ return์•ˆ์— ์“ฐ๋Š” ๋ฌธ๋ฒ•์€ HTML์ฒ˜๋Ÿผ ์ƒ๊ธด JSX์ด๋‹ค.


๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์€ { }์„ ์‚ฌ์šฉํ•˜์—ฌ ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉ



๊ธฐ์ดˆ ๋ฌธ๋ฒ•๐Ÿšฉ

import ์ด๋ฆ„ from '์ด๋ฏธ์ง€ ๊ฒฝ๋กœ'

<img src={ ์ด๋ฆ„ } />

์ด๋ฏธ์ง€ ์—…๋กœ๋“œํ•˜๊ธฐ


<div style={ { color : 'black', fontSize : '30px' } }>asd</div>

style ์‚ฌ์šฉ๋ฒ• โ€˜-โ€˜์„ ์‚ฌ์šฉ๋ถˆ๊ฐ€ํ•˜๋‹ˆ ์นด๋ฉœํ˜•์‹์œผ๋กœ ์‚ฌ์šฉ


import React, { useState } from "react"; // ๋ฆฌ์•กํŠธ์—์žˆ๋Š” ๋‚ด์žฅํ•จ์ˆ˜๋ฅผ ์“ฐ๊ฒ ๋‹ค. state๋Š” ๋ณ€์ˆ˜๋Œ€์‹  ์“ฐ๋Š” ๋ฐ์ดํ„ฐ ๊ณต๊ฐ„

let [title, titleModify] = useState(["์‹ ๋ผ๋ฉด ๋ง›์žˆ์–ด", '์šฐ์œ ๋ž‘ ๊ฐ™์ด ๋จน์–ด์•ผํ•จ']);

<p>{ title[0] }</p>  // '์‹ ๋ผ๋ฉด ๋ง›์ž‡์–ด'

ustState ์‚ฌ์šฉ ์ด์œ  -> app์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๊ธฐ์œ„ํ•ด, ์ƒˆ๋กœ๊ณ ์นจ์—†์ด ์žฌ๋žœ๋”๋ง๋จ, ์ž์ฃผ๋ฐ”๋€Œ๋Š” ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ์ž.

useStateํ•จ์ˆ˜ ์‚ฌ์šฉ์‹œ [โ€˜์‹ ๋ผ๋ฉด ..โ€™, ํ•จ์ˆ˜] ์ด๋ ‡๊ฒŒ ๋‚˜์˜ด -> ์ด๊ฒƒ์„ ์‹ ๋ฌธ๋ฒ•์œผ๋กœ a๋ณ€์ˆ˜์—๋Š” โ€˜์‹ ๋ผ๋ฉดโ€ฆโ€™ b๋ณ€์ˆ˜์—๋Š” ํ•จ์ˆ˜๋ฅผ ๋„ฃ์Œ


/* eslint-disable*/

warning์„ ๋ณด๊ธฐ์‹ซ์„๋•Œ ์“ฐ๋ฉด ์—†์• ์คŒ


let [like, likeModify] = useState(0)

<span className='like' onClick={ ()=>{ likeModify( like+1 ) } }>๐Ÿ“</span><p>{like}</p>

// ๋”ธ๊ธฐ๋ชจ์–‘ ํด๋ฆญ์‹œ๋งˆ๋‹ค ์ˆซ์ž๊ฐ€ ์˜ฌ๋ผ๊ฐ

onClick์€ {}์„ ์‚ฌ์šฉํ•˜๊ณ , ๊ทธ์•ˆ์€ ํ•ญ์ƒ ํ•จ์ˆ˜์—ฌ์•ผํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  state๊ฐ’์„ ๋ฐ”๊พธ๊ณ  ์‹ถ์„๋• ์ˆ˜์ •ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.


  function ์ œ๋ชฉ๋ฐ”๊พธ๊ธฐ() {
    var newArray = [...title];    // var newArray = title (X)
    newArray[0] = '๋ธ”๋ž™ ์‹ ๋ผ๋ฉด';
    titleModify( newArray );
  }

  <button onClick={ ์ œ๋ชฉ๋ฐ”๊พธ๊ธฐ }>๋ฐ”๊ฟˆ</button> // ์ œ๋ชฉ๋ฐ”๊พธ๊ธฐ() (X)

๋ณ€์ˆ˜์— state๋ฅผ ๋‹ด์„๋•Œ ๊ทธ๋ƒฅ ๋‹ด์œผ๋ฉด ๊ฐ’์„ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰ ์›๋ž˜์˜ ๊ฐ’๋„ ๋ฐ”๋€๋‹ค. [โ€ฆ]์„ ์‚ฌ์šฉํ•˜์ž

ํ•จ์ˆ˜๋ฅผ ํ•จ์ˆ˜()๋กœ ํ˜ธ์ถœํ•˜๋ฉด ๋ฐ”๋กœ ์‹คํ–‰์ด๋ฏ€๋กœ ํด๋ฆญ์‹œ์—๋งŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ()๋ฅผ ๋นผ์ฃผ์ž.


function Nav() {
  return (
    <div className="black-nav">
       <div>LJH</div>
    </div>
  )
}

function App() {
    return (
    	<Nav></Nav>
    )
}

Component ์‚ฌ์šฉํ•˜๊ธฐ

  1. ์ด๋ฆ„์€ ๋Œ€๋ฌธ์ž๋กœ ์“ฐ๊ธฐ
  2. ํ•˜๋‚˜์˜ div๋กœ ๋ฌถ์–ด์ฃผ๊ธฐ // <></>์„ ์จ๋„๋จ
  3. App ์ปดํฌ๋„ŒํŠธ์™€ ๊ฐ™์€ ์œ„์น˜๋กœ ํ•ด์ฃผ๊ธฐ

์ด๋ ‡๊ฒŒ๋˜๋ฉด App์€ ๋ถ€๋ชจ์ปดํฌ๋„ŒํŠธ nav๋Š” ์ž์‹์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋œ๋‹ค.

์ž์ฃผ๋ฐ”๋€Œ๋Š” ๊ฒƒ๋“ค์— ์‚ฌ์šฉํ•˜์ž

์—…๋ฐ์ดํŠธ: