본문 바로가기

Front-end/React

[React] 리액트 Basic


1. 리액트 + 타입스크립트 프로젝트 생성
npm create-react-app my-app –template typescript
https://create-react-app.dev/docs/getting-started/ or https://create-react-app.dev/docs/adding-typescript 
https://velog.io/@qortmdalsdl/react-scripts-feat.-CRA 
2. 리액트 프로젝트 구조



package.json에는 dependency들이 정의되어 있고 start, build, test, eject script 들이 들어있다.
cf. package-lock.json이 하는 역할이 무엇일까?
https://hyunjun19.github.io/2018/03/23/package-lock-why-need/ 
cf. “%”, “-“는 무슨 의미인가?
https://umanking.github.io/2022/05/05/npm-version-tilde-caret/ 


public/index.html은 index파일이며 body안에 div id가 root인 html tag를 포함한다.

<body>
 <noscript>You need to enable JavaScript to run this app.</noscript>
 <div id=”root”></div>
</body>



src/index.tsx에는 다음과 같이 id가 root인 div tag에 App이라는 React컴포넌트를 렌더한다.

ReactDOM.render(
 <React.StrictMode>
  <App />
 </React.StrictMode>,
document.getElementById(‘root’)



src/App.tsx에는 App 컴포넌트의 내용이 정의되어 있다.

 

import React from 'react';
import logo from './logo.svg';
import './App.css';

function App() {
  return (
    <div className="App">
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
        <p>
          Edit <code>src/App.tsx</code> and save to reload.
        </p>
        <a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
        >
          Learn React
        </a>
      </header>
    </div>
  );
}

export default App;

 

 


React컴포넌트를 정의하는 방식은 함수 방식, 클래스 방식 두 가지가 있는데 위의 경우에는 함수 방식으로 정의되어 있음
$npm run start로 위 코드가 실행되면 다음과 같은 화면이 표시된다.



크롬인 경우 React Developer Tool 확장 프로그램을 설치하면 React 개발자 도구를 사용할 수 있다. React 개발자 도구는 React 컴포넌트의 Props나 State를 보기 쉽게 해주고 값을 수정해 볼 수 있다.
 



3. 함수형 / 클래스형 컴포넌트
리액트 컴포넌트를 작성하는 방식은 함수와 클래스와 두 가지 방식이 있다.
과거에는 함수형 방식에서 State와 Lifecycle을 지원하지 않아 함수형 방식은 간단한 React component를 정의하는데 사용되었다.
최근에는 hook을 이용하여 함수형 방식에서도 State와 Lifecycle을 구현할 수 있어 함수형 방식이 선호되고 있다. -> Class문법을 몰라도됨


import React, { useState, Component } from 'react';

// 1. 함수형 컴포넌트
function FunctionalCounter() {
  const [count, setCount] = useState(0);
  return (
    <div style={{ border: '1px solid blue', padding: '10px', margin: '5px' }}>
      <p>함수형: {count}</p>
      <button onClick={() => setCount(count + 1)}>+1</button>
    </div>
  );
}

// 2. 클래스형 컴포넌트
class ClassCounter extends Component<{}, { count: number }> {
  state = { count: 0 };
  render() {
    return (
      <div style={{ border: '1px solid green', padding: '10px', margin: '5px' }}>
        <p>클래스형: {this.state.count}</p>
        <button onClick={() => this.setState({ count: this.state.count + 1 })}>+1</button>
      </div>
    );
  }
}

// 3. 메인 배치를 위한 App 컴포넌트
export default function App() {
  return (
    <div style={{ padding: '20px' }}>
      <FunctionalCounter />
      <ClassCounter />
    </div>
  );
}