여기에 있는 코드가 브라우저에서 가장 먼저 실행된다.
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<App />);
jsx
: 자바스크립트 안의 HTML, 빌드 단계에서만 사용 가능하다.
<App />
태그는 App.js에서 import된 태그이다.
ReactDOM.createRoot(document.getElementById('root'));
는 <App />
태그가 화면의 DOM 어느 부분에 렌더링할지 정해준다.
index.html 하나로 리액트 애플리케이션을 만든다.
=> SPA(Single Page Application)
SPA는 서버에 HTML 파일이 단 하나뿐이다.
리액트가 그 파일의 DOM과 화면에 표시되는 내용을 제어한다.
function App() {
return (
<div>Hello!</div>
);
}
export default App;
정의한 함수를 index.js에서 render()하면 브라우저는 해당 요소의 return 값을 렌더링한다.
function App() {
return (
<div>
<h1>My Todos</h1>
<div className="card">
<h2>TITLE</h2>
<div>
<button>Delete</button>
</div>
</div>
</div>
);
}
export default App;
class=""
가 아닌 className=""
을 사용해야한다.위 코드는 HTML 코드 같지만 jsx 코드이므로 내부에서 표준 자바스크립트 코드로 변환되는데 이때 CSS class를 할당할 HTML 오브젝트의 property 이름이 className
이기 때문이다.
const modalConfirmAction = document.createElement('button');
modalConfirmAction.textContent = 'Confirm'
modalConfirmAction.className = 'btn';
modalContirmAction.addEventListener('click', closeModalHandler)
리액트는 컴포넌트의 개념을 이용해 자체적인 빌딩 블록을 만들고 필요에 따라 재조합 할 수 있도록 했다.
루트 컴포넌트(App 컴포넌트)를 제외한 나머지 컴포넌트들은
components
폴더에 저장해서 프로젝트를 체계적으로 관리할 수 있도록 한다.
function Todo() {
return (
<div className="card">
<h2>TITLE</h2>
<div className="actions">
<button className="btn">Delete</button>
</div>
</div>
);
}
// 이 구문을 사용해야 외부에서도 이 함수를 사용할 수 있다.
export default Todo;
함수 이름은 항상 대문자로 시작해야 한다.
=> 내장 HTML element와 구분하기 위함이다.
import Todo from './components/Todo';
function App() {
return (
<div>
<h1>My Todos</h1>
<Todo />
<Todo />
<Todo />
</div>
);
}
export default App;