자바스크립트 라이브러리의 하나
기존 html은 태그형식의 문자열 반환이었다면 리액트는 컴포넌트 구조를 사용함
리액트는 왜 사용하는가?

새로운 리액트 앱 만들기에서 추천 툴체인을 이용해서 새로운 프로젝트를 만들어 보자
먼저 리액트 세팅을 해보자, VSC에서 아래 코드를 실행하면 리액트가 세팅이 된다.
npx create-react-app my-app
cd my-app
npm start

npx create-react-app todolist --template typescript // 타입스크립트 템플릿을 사용
cd todo list
npm start
리액트 코드를 뜯어보자(페이지 소스보기)

개발자 도구 요소에서 코드를 보면 루트 하위에 있는 코드까지 볼 수 있다

index.tsx를 보면 root라는 객체를 통해 랜더링하는 것을 알 수 있음
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
// React와 ReactDOM을 불러옵니다. React는 리액트 컴포넌트를 작성하는데 필요하고,
// ReactDOM은 React 컴포넌트를 실제 DOM에 렌더링할 때 사용하는 라이브러리입니다.
// index.css 파일을 가져옵니다. 이 파일에 스타일(디자인) 관련 코드가 있어,
// 전반적인 페이지의 스타일이 설정됩니다.
// App 컴포넌트를 가져옵니다. App은 전체 앱의 '시작점'이 되는 컴포넌트로,
// 다른 컴포넌트들을 내부에서 관리합니다.
// reportWebVitals를 가져옵니다. 성능을 측정하거나 모니터링하는 데 사용되는 함수입니다.
// 'root'라는 객체를 만듭니다.
// 'document.getElementById('root')'를 사용해 HTML의 root라는 id를 가진 요소를 찾습니다.
// 이 요소는 public/index.html 파일에서 찾을 수 있으며, React가 그 위에 렌더링됩니다.
const root = ReactDOM.createRoot(
document.getElementById('root') as HTMLElement
);
// root 객체의 render 함수를 호출하여, 실제로 App 컴포넌트를 화면에 렌더링합니다.
// <React.StrictMode>는 리액트의 '엄격 모드'로, 개발 중 오류나 잘못된 코드 사용을 경고해줍니다.
// 앱을 안정적이고 깨끗하게 유지하는 데 도움이 되지만, 필수는 아닙니다.
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
);
// 앱의 성능을 측정하려면 reportWebVitals 함수를 사용합니다.
// 기본적으로 console.log에 결과를 기록할 수 있도록 설정할 수 있습니다.
// 이 코드는 선택사항이며, 성능 모니터링을 원할 때 사용됩니다.
reportWebVitals();
<h1>Hello World</h1>를 작성하면 이 부분이 리액트 컴포넌트 안에서 HTML처럼 동작함import React from 'react';
import logo from './logo.svg';
import './App.css';
function App1() {
return (
<div className="App">
<h1>핼로우 리액트</h1>
<p>반갑습니다</p>
</div>
);
}
function App2() { {/*위 내용과 아래 내용은 같은 것, JSX문법으로 표현하면 이렇게 나옴*/}
return (
React.createElement("div", null, "핼로우 리액트",
React.createElement("p", null, "반갑습니다"))
);
}
export default App; // app
function App() {
return (
<div className="App-header">
<h1 className="test">핼로우 리액트</h1>
<p>반갑습니다</p>
</div>
<div></div> // 이렇게 태그요소를 상위에 겹치게 둘 수 없음
);
}
export default App;
<>...</>와 같은 빈 태그로 두어도 됨function App() {
return (
<div>
<div className="App-header">
<h1 className="test">핼로우 리액트</h1>
<p>반갑습니다</p>
</div>
<div></div>
</div>
);
}
function App() {
return (
<div className="App-header"> {/*className은 css속성*/}
<h1 className="test">핼로우 리액트</h1>
<p>반갑습니다</p>
</div>
);
}
export default App;
.App-header{
color : blue;
font-size: 40px;
padding: 40px;
}
.test{
color : blue;
font-size: 40px;
padding: 40px;
}
import React from 'react';
import logo from './logo.svg';
import './App.css';
function App() {
let name = "리액트";
return (
<div className="App-header">
<h1 className="test">핼로우{name}</h1> {/*이곳은 리액트 영역이므로 중괄호로 감싸줘야 인지를 함, 이는 변순 뿐 아니라 JS관련 수식 모두 공통적임*/}
<h2>
{
name === "리액트" ? (<h1>YES</h1>): (<h1>NO</h1>) // 조건부 연산자를 사용할 때도 JSX에서 삼항 연산자를 사용할 수 있음, if문을 사용할 수 없기 때문에 삼항 연산자 사용
}
</h2>
<p>반갑습니다</p>
</div>
);
}
export default App;
||로 예외처리를 해줄 수 있음function App() {
const port = undefined;
return <>
{
port || "포트를 설정하지 않았습니다" // ||는 OR 연산자, 왼쪽 값이 false 같은 Falsy 값(undefined, null, 0, "" 등)이면 오른쪽 값을 반환
}
</>
}
export default App;
import React from 'react';
import logo from './logo.svg';
import './App.css';
function App() {
let name = "리액트";
const style = { // 이렇게 컴포넌트 안에서 사용하는 스타일링을 인라인 스타일링이라고 함
backgroundColor : 'black', // CSS에서는 -하이픈을 사용하지만 인라인에서 두 단어를 합쳐서 쓸 때는 대문자를 사용
color : "white",
fontSize : "40px",
fontWeight : "bold",
padding : "20px"
};
return (
<div style={ // 직접 인라인 스타일링을 적을 수도 있음
{
backgroundColor : 'black',
color : "white"
}
}>
<h1 style={style}>핼로우{name}</h1>
<h2>
{
name === "리액트" ? (<h1>YES</h1>): (<h1>NO</h1>)
}
</h2>
<p>반갑습니다</p>
</div>
);
}
export default App;
function App() {
let name = "리액트";
return (
<div className="App-header">
<h1 className="test">핼로우{name}</h1>
<h2>
{
name === "리액트" ? (<h1>YES</h1>): (<h1>NO</h1>)
}
</h2>
<p>반갑습니다</p>
<br/> {/*br 테그 같이 쌍으로 테그를 하지 않아도 되는 경우엔 클로징 테그를 사용해도 됨*/}
</div>
);
}
export default App;