컴포넌트 단위로 이루어진 UI(User Interface)를 만들 수 있는 라이브러리
버튼 하나와 같이 한 가지의 기능을 수행하는 UI단위
리액트 프로젝트를 만들게 되면서, 컴포넌트를 여러가지 파일로 분리해서 저장 할 것이고, 또 이 컴포넌트는 일반 자바스크립트가 아닌 JSX 라는 문법으로 작성하게 된다.
📌 Babel
바벨은 자바스크립트의 문법을 확장해주는 도구이다.
아직 지원되지 않는 최신 문법이나, 편의상 사용하거나 실험적인 자바스크립트 문법들을 정식 자바스크립트 형태로 변환해줌으로써 구형 브라우저같은 환경에서도 제대로 실행 할 수 있게 해주는 역할을 한다.
BABEL 사용해보기
create-react-app
을 통해서 리액트 툴을 설치한다.📌 CRA 살펴보기
- npx create-react-app [파일명]
- node_modules: npm으로 다운받은 모든 패키지들이 저장된 폴더
- node_modules는 용량이 크므로 git ignore에 등록되어 있는 상태 (즉, git clone 시 해당 파일을 받지 않음)
→ npm install 로 설치 (npm이 dependencies 항목을 자동으로 읽어서 필요한 패키지를 다운받음)- package.json : 프로젝트에대한 정보들이 기입된 파일
- script : 이 프로젝트에서 실행할 수 있는 명령어들
→ start의 경우 관습적으로 사용되므로 그냥 입력ok
→ build 등의 경우 npm run build 와 같이 실행- dependencies : 프로젝트에서 필요로하는 다른 패키지들에 대한 정보
import React from 'react';
export default Hello;
import React from 'react';
import ReactDOM from 'react-dom'; // 3)
import App from './App';
ReactDOM.render( // 1)
<React.StrictMode>
<App />
</React.StrictMode>,
document.getElementById('root') // 2)
);
1) ReactDOM.render
의 역할은 브라우저에 있는 실제 DOM 내부에 리액트 컴포넌트를 렌더링하겠다는 것을 의미한다.
2) id
가 root
인 DOM 을 선택하고 있는데, 이 DOM은 리액트 컴포넌트가 렌더링 될 때, public/index.html 파일 내 <div id="root"></div>
내부에 렌더링 된다.
즉, 사용자에게 궁극적으로 배포되어 지는 것은 index.html 이며, id=”root”
를 통해서 자바스크립트와 연결해준다.
→ 이것을 가능하게 하는 것이 3) react-dom
이다.
react-dom
이라는 라이브러리에서 ReactDOM
클래스를 import, 가져온다.ReactDOM
이라는 클래스에 있는 렌더 함수를 이용, document.getElementById
로 root
요소를 가지고 와서 컴포넌트를 연결시켜준다.📌 ReactDOM.render()
root
안에 App
컴포넌트를 표시하기 위해 ReactDOM
모듈의 render
메소드를 사용한 것이라고 볼 수 있다.ReactDOM.render(
<React.StrictMode>
<App />
</React.StrictMode>,
document.getElementById('root')
);
// 1)
ReactDOM.render(<h1>Hello world! </h1>, document.getElementById("root"));
// 2)
const h1 = document.createElement("h1");
h1.innerHTML = "Hello world!";
document.getElementById("root").appendChild(h1);
📌 React
모듈
import React from 'react';
+) 추가
최신 버전에서 해당 코드가 없어도 동작되는 부분이 궁금해서 참고로 찾아본 글 :)
❓ 정확히 JS소스의 어느 부분 안에서 JSX를 문법을 지켜야 하는걸까 ?
→ return(...) 내에 JSX 문법으로 작성한다. ( 궁금해서 이 안에서 JSX가 아닌 js 문법을 사용하니 작동이 되지 않았다. 하지만 컴포넌트 안에서도 JSX문법이 적용되는 것 같은데 이부분은 다시 확인해 보자. 🤔 )
()
로 감싸야 한다. (요즘은 절대적이지 않다고 한다. vscode prettier)<>자식들</>
를 사용한다. (Fragment){표현식}
처럼 사용한다.if
문은 사용할 수 없다. 삼항 연산자나 &&
를 사용한다.style
을 이용해 인라인 스타일링이 가능하다.<p>내용</p>
, </br>
태그는 꼭 닫혀있어야 한다.
input
태그와 br
태그를 사용할 때처럼 닫지 않고 사용하게 되면 에러가 발생한다.<br />
형제노드를 사용할 수 없다.
<>
태그와 같이 묶어줘야 한다. 즉 꼭 감싸져야 한다. function App() {
return (
<div> // 이곳에 div 태그로 묶어주지 않으면 에러
<Hello />
<Hello />
<Hello />
</div> //
);
}
div
태그 남용을 방지하기 위해서 리액트에서 제공하는 Fragment
를 이용한다. Fragment
는 브라우저 상에서 따로 별도의 엘리먼트로 나타나지 않는다.function App() {
return (
<React.Fragment> // <> 로 표기가능
<Hello />
<Hello />
<Hello />
</React.Fragment> // </> 로 표기가능
);
}
✍️ 감싸는 이유JSX 변수 접근하기, 조건부 렌더링
function App() {
const name = "seul";
return (
<>
<Hello />
{name && <h1> Hi ~ </h1>} // name이 있으므로(true) 출력된다.
{["a", "b"].map((i) => (<h2>{i}</h2>))} // i를 {}안에 넣어야 한다.
</>
);
}
✍️ JSX 내부의 자바스크립트 표현식 내에서는 if
문을 사용할 수 없다. 대신 조건부 연산자(삼항 연산자)를 사용한다. ▼
function App() {
const name = "seul";
return <>{name === "seul" ? <h1>yes</h1> : <h1>no</h1>}</>;
}
true
일 때 보여주고 싶다면 &&
연산자를 사용해서 처리하는 것이 간단하다.✍️ undefined
를 렌더링하지 않아야 하며, OR연산자를 이용해서 방지할 수 있다. ▼
- JSX 내부에서 undefined를 렌더링 하는 것은 에러가 나지 않는다. (JSX 에서 null, false, undefined 를 렌더링하게 된다면 아무것도 나타나지 않게 된다.)
function App() {
const name = undefined;
return name || "값이 undefined";
}
❓ 왜 if문은 사용할 수 없을까 🤔 ?
✍️ Expressions과 Statements
style과 className
(1) 인라인 스타일
function App() {
const name = "seul";
const style = {
backgroundColor: "gray",
color: "aqua",
fontSize: 24, // 기본 단위 px
margin: "1rem", // px외 다른 단위 사용 시 문자열로 설정
};
return (
<>
<Hello />
<div style={style}>
{name && <h1> Hi ~ </h1>}
{["a", "b"].map((i) => (
<h2>{i}</h2>
))}
</div>
</>
);
}
✍️ 혹은 아래와 같이 사용할 수 있다.
function Login() {
return (
<h1
style={{
color: 'powderblue',
}}
>
Login
</h1>
);
}
(2) 가져오기
className
으로 설정한다./* App.js */
import React from "react";
import Hello from "./Hello";
import "./App.css";
function App() {
const name = "seul";
const style = {
backgroundColor: "gray",
color: "aqua",
fontSize: 24, // 기본 단위 px
margin: "1rem", // 다른 단위 사용 시 문자열로 설정
padding: "1rem",
};
return (
<>
<Hello />
<div style={style}>{name}</div>
<div className="box"></div>
</>
);
}
export default App;
/* App.css */
body {
font-size: 30px;
margin: 1rem;
}
.box {
background-color: powderblue;
width: 60px;
height: 60px;
margin-left: 1rem;
}
주석 사용하기
{/* 이런 형태로 */}
작성한다. {}
중괄호로 감싸지 않으면 화면에 보이게 된다.// 이런 형태로
도 작성이 가능하다. function App() {
return (
<>
{/* 화면에 보이지 않는 주석1 */}
<Hello // 화면에 보이지 않는 주석2
/>
/* 화면에 보인다 */
// 화면에 보인다
</>
);
}
+) ✍️ 추가
React 18
리액트18버전 이후로 콘솔창에 에러가 나타나서 index.js 파일을 재설정 해주었다.
이렇게 공부하고 알아가는 도중에도 라이브러리나 프레임워크들이 계속해서 새로운 버전이 나오고 바뀌고 개선되어가면서 기술이 빠르게 발전된다는 것을 느꼈다. 😀 공식사이트에서 소식을 접했는데, 최신 트렌드와 개선된 환경 등을 바로 이해하고 공감하고 토론도 해보고 싶은 욕심이 생겼다. 계속해서 지식을 쌓고 싶다!
import ReactDOM from 'react-dom'; // 18 이전 버전
import ReactDOMClient from 'react-dom/client'; // 18 버전
ReactDOM.render(<App />, document.getElementById('root')); // 18 이전 버전
// 18 버전
const container = document.getElementById('root');
const root = ReactDOMClient.createRoot(container);
root.render(<App />);
// 혹은 아래처럼
ReactDOMClient.createRoot(document.getElementById('root')).render(<App />);
📌 참고 !
React_How to Upgrade to React 18
react18 준비하기
reference)
vlpt-react
react-jsx
DreamCoding
udemy