REACT

[React] 리엑트 핵심정리!

jinsang-2 2025. 5. 1. 23:54

⭐React 작동 흐름

1️⃣HTML 진입점 ( index.html ) 

<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
  • 브라우저가 HTML을 읽을 때 id="root"인 "div"를 DOM에 생성하고 main.tsx파일을 모듈로 불러온다.

2️⃣main.tsx - React 앱 진입점

import { createRoot } from 'react-dom/client'
import App from './App'

createRoot(document.getElementById('root')!).render(<App />)

 

  • document.getElementById('root')로 위 HTML의 div#root를 DOM에서 가져옴
  • createRoot(...).render(<App />)는 그 안에 React 앱(컴포넌트 트리의 루트) 를 렌더링

3️⃣App.tsx - 최상단 컴포넌트

export default function App() {
  return <div>Hello React</div>
}
  • 여기서부터 자식 컴포넌트들을 렌더링하고 상태 관리, 이벤트 처리 등을 진행한다. 

<></> Fragment

💡리엑트는 여러 최상위 요소를 지정할 수 없다.

 

React는 하나의 최상위 요소만 지정해야 한다. 별도의 div와 같은 요소를 생성하지 않고 여러 요소를 하나로 묶어 처리할 수 있도록 Fragment를 사용하면 된다. 

export default function App() {
  return (
    <>
      <header>HEADER</header>
      <main>MAIN</main>
      <footer>FOOTER</footer>
    </>
  )
}

 

테이블을 사용할 때 `<div>` 태그를 사용하면 테이블 구조가 깨지는데, Fragment를 사용하면 된다.

function TableRow() {
  return (
    <>
      <td>Cell 1</td>
      <td>Cell 2</td>
    </>
  );
}

 

묵시적으로 `<></>`를 사용할 수 있지만 명시적으로 key 값을 넣어줘야 할 때가 있다. Fragment에 커스텀한 속성을 추가하고 싶을 때 고유한 key 값을 넣어 사용할수도 있다. `<Fragment key={fruit.id}>`


데이터 보간

`{}` 중괄호로 묶어 데이터를 표현 하는 방법을 보간법(Interpolation)이라 한다. `{name}`

export default function App() {
  const name = 'JINS'

  return (
    <h1>Hello, {name}!</h1>
  )
}

 


Hot Module Replacement(HMR)

  • 개발 중 특정 코드 변경 시, 페이지 새로고침 없이 해당 부분만 리로드하는 것을 의미한다. 개발모드에서만 사용된다.(변경된 모듈: Hot Module)
  • 코드가 변경 후 저장을 누르더라도, state 를 유지시켜준다.
  • 리엑트 실습할 때 바로 실시간으로 화면 적용 시켜주던 것~

반응형 데이터, 이벤트 핸들링

import { useState, useMemo, useEffect } from 'react'

// 반응형 데이터 선언
const [데이터이름, 데이터변경함수] = useState<데이터타입>(기본값)

// 반응형 데이터 변경
데이터변경함수(변경할값)

// 계산된 데이터 선언
const 계산된데이터 = useMemo(() => 새로운값, [기반데이터])

// 데이터 감시 선언
useEffect(실행할함수, [감시할데이터])

// useEffect 예시
useEffect(() => {
    console.log('count 값이 변경되었습니다:', count)
  }, [count])
  
// useEffect는 최초 한번(컴포넌트 함수가 화면에 연결된 직후)을 무조건 실행함
useEffect(() => {
    inputRef.current?.focus() // ?. 뜻 : 되면 뒤에 거 실행, 안 되면 실행 x
  }, [])

 

반응형 데이터 `useState` ! 

정보를 저장해서 사용하고 싶으면 `useMemo` !

데이터 감시 `useEffect`

use + Xxx = 훅(Hooks)

이벤트 핸들링 on + Click

import { useState, useMemo } from 'react'
export default function App() {
  const [count, setCount] = useState(0)
  const double = useMemo(() => count * 2, [count])
  return (
    <>
      <h2>count:{count}</h2>
      <h2>double:{double}</h2>
      <button onClick={() => setCount(count + 1)}>증가</button>
    </>
  )
}

 

 

 

🔨 MAC 에서 한글 입력 시 두 번 입력되는 버그 발생 !!

영어는 a,b,c 이렇게 한 글자씩 입력하면 되는데 한글(일본어, 중국어) 등 같은 경우 자음 모음을 조합해서 한 글자가 만들어 진다. 예를 들어 공 = ㄱ + ㅗ + ㅇ 이렇게 키보드 3번 입력해야 한 단어가 만들어진다(영어는 a 한 번만 enter 누르면 되는데..)

아직 조합이 끝나지 않았는데도 Enter 이벤트가 발새앻서 두 번 실행되거나 의도치 않은 입력 처리가 발생되기에 아직 문자를 조합중일 때에는 실행되지 않게 막아야 한다. 고것이 ` !event.nativeEvent.isComposing` 으로 막으면 된다. 

if (event.key === 'Enter' && !event.nativeEvent.isComposing) {
  // 조합이 끝났을 때만 실행
}

 

조건부 렌더링

표현식(논리, 삼항 연산자)는 템플릿에 직접 사용 가능하고 구문(if, switch)는 안된다.

예시 : `{message.trim() && <div>입력된 내용이 있어요~</div>}`

  • 논리 연산자 : 한 개의 조건 처리
  • 삼항 연산자 : 두 개의 조건 처리
  • 복잡한 조건 : 여러 개의 조건 처리(if문, switch문)
# 중앙관리 상태관리 (stores 폴더)

- 컴포넌트를 같이 사용하기 위해

- redux,zustand

# 풀옵스?

노드란

- node = 주석(comment), 텍스트(text), element
 

 

 

 

reference 

https://www.heropy.dev/p/QduRma