1강 — 컴포넌트와 JSX
2024 DTC
| → / Space | 다음으로 |
| ← | 이전으로 |
| ↓ / ↑ | 같은 주제 안에서 단계 이동 |
| O | 전체 슬라이드 한눈에 보기 |
| F | 전체화면 |
아래쪽 화살표가 보이면 그 주제는 단계별로 이어집니다
const title = document.querySelector("#title");
title.textContent = "새 제목";
const list = document.querySelector("#list");
list.innerHTML = "<li>새 항목</li>";
어디를 어떻게 바꿀지 지시
명령형데이터가 이러면 화면은 이렇다
선언형화면을 컴포넌트라는
조각으로 나눠서 조립한다
같은 모양이 반복되면 조각 하나로 만들어 재사용한다
React 앱을 띄우려면
npm create vite@latest my-app
cd my-app
npm install
npm run dev
index.html
<div id="root"></div>
<script type="module" src="/src/main.jsx"></script>
src/main.jsx
import { createRoot } from 'react-dom/client'
import App from './App.jsx'
createRoot(document.getElementById('root'))
.render(<App />)
src/App.jsx
function App() {
return <h1>안녕하세요</h1>;
}
export default App;
npm create vite@latest 로 만든다src/App.jsx 를 고치면 화면이 바뀐다JavaScript 안에 화면을 쓰려면
function App() {
return <h1>안녕하세요</h1>;
}
const name = "홍길동";
function App() {
return <h1>{name}님 안녕하세요</h1>;
}
<p>{1 + 2}</p>
<p>{name.toUpperCase()}</p>
<p>{user.age >= 20 ? "성인" : "미성년"}</p>
{1 + 2}3toUpperCase()대문자삼항 연산자"성인"HTML과 다른 점 네 가지
// HTML
<div class="box"></div>
// JSX
<div className="box"></div>
// 안 됨 — 최상위가 둘
return (
<h1>제목</h1>
<p>내용</p>
);
최상위 태그가 둘이면 어떻게 될까요?
return (
<>
<h1>제목</h1>
<p>내용</p>
</>
);
내용
// HTML
<img src="a.png">
<br>
// JSX
<img src="a.png" />
<br />
<p style={{ color: "tomato", fontSize: 20 }}>
안녕
</p>
안녕
| class | className 으로 |
| 최상위 | 하나만. 여럿이면 <>...</> |
| 빈 태그 | <img /> 처럼 닫는다 |
| style | 객체로. font-size → fontSize |
| { } | JS 식을 끼워 넣는다 |
화면 조각을 만들어 재사용하려면
function Hello() {
return <h1>안녕하세요</h1>;
}
function App() {
return <Hello />;
}
function App() {
return (
<>
<Hello />
<Hello />
<Hello />
</>
);
}
function hello() { // 소문자
return <h1>안녕</h1>;
}
<hello />
여기서 이름을 소문자로 쓰면?
src/Hello.jsx
function Hello() {
return <h1>안녕하세요</h1>;
}
export default Hello;
src/App.jsx
import Hello from './Hello.jsx';
return 하는 함수가 컴포넌트<이름 /> 로 쓴다컴포넌트에 값을 내려보내려면
컴포넌트가 함수라면
인자도 받을 수 있어야 한다
function Hello(props) {
return <h1>{props.name}님 안녕</h1>;
}
<Hello name="홍길동" />
<Hello name="윤경" />
function Hello({ name, age }) {
return <h1>{name} ({age}세)</h1>;
}
<Hello name="홍길동" age={20} />
function Card({ children }) {
return <div className="card">{children}</div>;
}
<Card>
<p>안쪽 내용</p>
</Card>
안쪽 내용
function Hello({ name }) {
name = "다른 이름"; // 하면 안 된다
return <h1>{name}</h1>;
}
{ name, age } 로 구조 분해children배열을 화면에 그리려면
const fruits = ["사과", "바나나", "포도"];
// 이걸 <li> 세 개로 만들려면?
<ul>
{fruits.map((f) => (
<li>{f}</li>
))}
</ul>
<ul>
{fruits.map((f) => (
<li>{f}</li>
))}
</ul>
이대로 실행하면 콘솔에 뭐가 뜰까요?
<ul>
{fruits.map((f) => (
<li key={f}>{f}</li>
))}
</ul>
const todos = [
{ id: 1, text: "우유 사기" },
{ id: 2, text: "과제 하기" },
];
todos.map((t) => <li key={t.id}>{t.text}</li>)
배열.map() 으로 JSX 배열을 만든다key 를 준다상황에 따라 다르게 그리려면
function Greeting({ isLogin }) {
if (isLogin) {
return <h1>환영합니다</h1>;
}
return <h1>로그인 해주세요</h1>;
}
<h1>
{isLogin ? "환영합니다" : "로그인 해주세요"}
</h1>
{hasNew && <p>새 알림이 있습니다</p>}
새 알림이 있습니다
{count && <p>{count}개</p>}
여기서 count가 0이면 화면에 뭐가 보일까요?
if조건 ? A : B조건 && JSXcount > 0 && 로오늘 배운 것
| JSX | JS 안에 쓰는 HTML. className, 부모 하나, { } |
| 컴포넌트 | JSX를 return 하는 함수. 대문자로 시작 |
| props | 부모가 내려주는 값. 읽기 전용 |
| children | 태그 사이의 내용 |
| map + key | 배열을 화면에 나열 |
| ? : 와 && | 조건에 따라 그리기 |
직접 만들어봅시다
map 으로 그리기HTML 강의에서 만든 프로필 카드를 React로 옮겨봅니다
2강에서는 화면을 움직입니다