[React] 리액트 시작 & 컴포넌트
[React] 리액트 시작 & 컴포넌트
React 프로젝트 설정
.gitignore
- 깃허브에 푸쉬시, 무시되어야할 항목들 나열.
생성된 .gitignore에 해당 항목도 추가로 기입하도록 한다.
1 2 3 4
# Customs .env .env.* package-lock.json
package.json
index.html
- 최상위 디렉토리에 있는 HTML 파일.
- Vite는 이 파일을 기반으로 빌드하고 애플리케이션을 시작.
- 빌드 시,
src하위에 있는 파일들을 로드하여 나타낸다.
public
- 번들링이 필요없는 파일(정적 파일) 모음.
- 해당 파일은 빌드 과정에서 그대로 복사되어 최종 빌드에 포함.
- 예: favicon
src/assets
- 번들링이 필요한 파일(정적 파일) 모음.
React 실습을 위한 정리
React를 간단히 사용하기 위해, 사용하지 않는 파일들을 제거한다.
main.tsx에서도 삭제된 파일을 불러오는 코드를 제거한다.1 2 3 4 5 6 7 8 9 10
import { StrictMode } from "react"; import { createRoot } from "react-dom/client"; // import "./index.css"; 제거 import App from "./App.tsx"; createRoot(document.getElementById("root")!).render( <StrictMode> <App /> </StrictMode> );
App.tsx에서, 기본적인 컴포넌트 코드 구조만 작성 후, 진행1 2 3 4
export default function App() { // JSX = Javascript + XML(확장 문법) return <div>Hello, World!</div>; }
React 컴포넌트 종류
컴포넌트 작성법
클래스 컴포넌트
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
import { Component } from "react"; import reactLogo from "./assets/react.svg"; import viteLogo from "/vite.svg"; import "./App.css"; interface AppState { count: number; } class App extends Component< React.Dispatch<React.SetStateAction<AppState>>, AppState > { constructor(props: React.Dispatch<React.SetStateAction<AppState>>) { super(props); this.state = { count: 0, }; } render() { const { count } = this.state; return ( <> <div> <a href="https://vitejs.dev" target="_blank" rel="noopener noreferrer" > <img src={viteLogo} className="logo" alt="Vite logo" /> </a> <a href="https://react.dev" target="_blank" rel="noopener noreferrer"> <img src={reactLogo} className="logo react" alt="React logo" /> </a> </div> <h1>Vite + React</h1> <div className="card"> <button onClick={() => this.setState({ count: count + 1 })}> count is {count} </button> <p> Edit <code>src/App.tsx</code> and save to test HMR </p> </div> <p className="read-the-docs"> Click on the Vite and React logos to learn more </p> </> ); } } export default App;
함수형 컴포넌트
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
import { useState } from "react"; import reactLogo from "./assets/react.svg"; import viteLogo from "/vite.svg"; import "./App.css"; function App() { const [count, setCount] = useState(0); return ( <> <div> <a href="https://vitejs.dev" target="_blank"> <img src={viteLogo} className="logo" alt="Vite logo" /> </a> <a href="https://react.dev" target="_blank"> <img src={reactLogo} className="logo react" alt="React logo" /> </a> </div> <h1>Vite + React</h1> <div className="card"> <button onClick={() => setCount((count) => count + 1)}>count is {count}</button> <p> Edit <code>src/App.tsx</code> and save to test HMR </p> </div> <p className="read-the-docs">Click on the Vite and React logos to learn more</p> </> ); } export default App;
비교를 해보면, 함수형 컴포넌트가 훨씬 더 간단히 작성되었음을 확인 가능.
함수형 컴포넌트만 사용하자
- 리액트 16.8 버전에 추가된 리액트 훅으로 인해서, 사용성의 대변화 발생.
- 16.8 이전 버전에서는 함수형 컴포넌트를 사용하는 게 불편했지만,
리액트 훅으로, 이제는 클래스 컴포넌트를 사용하는 게 비효율적임. - 리액트 19 버전에는 클래스 컴포넌트에 더 이상 기능 추가가 없어짐.
- 리액트 19 버전에서 클래스 컴포넌트의 대다수 문법이 사라짐.
React 컴포넌트 작성
Snippet으로 컴포넌트 빠르게 작성하기
커스텀 snippets 작성
- 익스텐션에 제공하는 snippets이 아닌, 직접 커스텀한 것을 사용해보자.
[설정] - [코드 조각] 클릭
다음과 같이,
typescriptreact입력
→ 그러면, typescriptreact.json 파일이 열림.다음과 같이 파일을 수정할 수 있음. → 저장.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
{ "Function Component": { "prefix": "rfc", "body": [ "export default function ${1:$TM_FILENAME_BASE} ($2) {", " return (", " <>", " <h1>${1:$TM_FILENAME_BASE} Component</h1>", " </>", " );", "}", ], "description": "Create an function component" }, }
${1:$TM_FILENAME_BASE}은 해당 파일명을 넘겨받는다.
이러면, 앞으로 직접 커스텀한 것을 사용할 수 있음.
This post is licensed under CC BY 4.0 by the author.