2강 — state와 이벤트
2024 DTC
| → / Space | 다음으로 |
| ← | 이전으로 |
| ↓ / ↑ | 같은 주제 안에서 단계 이동 |
| O | 전체 슬라이드 한눈에 보기 |
| F | 전체화면 |
아래쪽 화살표가 보이면 그 주제는 단계별로 이어집니다
| 컴포넌트 | JSX를 return 하는 함수 |
| props | 부모가 내려주는 값. 읽기 전용 |
| map + key | 배열을 화면에 나열 |
오늘은 이 화면을 움직이게 만듭니다
그냥 변수로는 왜 안 되나
function Counter() {
let count = 0;
return (
<button onClick={() => { count++; }}>
{count}
</button>
);
}
눌러도 계속 0
버튼을 누르면 숫자가 올라갈까요?
그 도구가 state
값이 바뀌면 화면도 바뀌게 하려면
import { useState } from 'react';
const [count, setCount] = useState(0);
// 현재값 바꾸는 함수 처음값
function Counter() {
const [count, setCount] = useState(0);
return (
<button onClick={() => setCount(count + 1)}>
{count}
</button>
);
}
누르면 올라간다
값 바꾸고textContent 도 바꾼다
setCount 만 부른다
const [count, setCount] = useState(0);
count = count + 1; // 하면 안 된다
setCount(count + 1);
setCount(count + 1);
setCount(count + 1);
예상3 증가실제1 증가여기서 set을 세 번 부르면 3이 올라갈까요?
setCount((c) => c + 1);
setCount((c) => c + 1);
setCount((c) => c + 1);
실제3 증가const [값, set값] = useState(초기값)set값()set값(c => ...)사용자 동작에 반응하려면
<button onClick={handleClick}>누르기</button>
<input onChange={handleChange} />
<form onSubmit={handleSubmit}>
onclickonClickonchangeonChangeonsubmitonSubmit
{/* 함수를 넘김 */}
<button onClick={handleClick}>
{/* 즉시 실행됨 */}
<button onClick={handleClick()}>
둘 중 어느 쪽이 맞을까요?
function Counter() {
const [count, setCount] = useState(0);
return (
<>
<button onClick={() => setCount(c => c + 1)}>
+
</button>
<button onClick={() => setCount(c => c - 1)}>
-
</button>
<p>{count}번</p>
</>
);
}
3번
onClick 처럼 낙타등 표기() => 함수(인자)배열과 객체 state를 바꾸려면
const [todos, setTodos] = useState([]);
todos.push("우유 사기"); // 하면 안 된다
여기서 push를 쓰면 화면이 바뀔까요?
setTodos([...todos, "우유 사기"]);
// 추가
setTodos([...todos, 새항목]);
// 삭제
setTodos(todos.filter((t) => t.id !== id));
// 수정
setTodos(todos.map((t) =>
t.id === id ? { ...t, done: true } : t
));
추가스프레드삭제filter수정map
const [user, setUser] = useState({
name: "홍길동", age: 20
});
setUser({ ...user, age: 21 });
name"홍길동"age21push, splice 대신 스프레드[...], 삭제는 filter, 수정은 map입력창의 값을 다루려면
const [text, setText] = useState("");
<input
value={text}
onChange={(e) => setText(e.target.value)}
/>
<p>{text}</p>
안녕
<input value={text} /> {/* onChange 없음 */}
onChange를 빼면 글자가 써질까요?
function TodoForm({ onAdd }) {
const [text, setText] = useState("");
function handleSubmit(e) {
e.preventDefault();
onAdd(text);
setText("");
}
return <form onSubmit={handleSubmit}>...</form>;
}
value 와 onChange 는 항상 짝e.target.valuee.preventDefault()여러 컴포넌트가 한 값을 함께 쓰려면
형제끼리는 값을 주고받을 수 없다
둘의 공통 부모로
state를 올린다
function App() {
const [todos, setTodos] = useState([]);
function addTodo(text) {
setTodos([...todos, { id: Date.now(), text }]);
}
return (
<>
<TodoForm onAdd={addTodo} />
<TodoList todos={todos} />
</>
);
}
오늘 배운 것
| useState | 바뀌면 화면도 바뀌는 값 |
| set 함수 | 직접 대입 금지. 이전 값은 set(c => ...) |
| onClick | 함수를 넘긴다. 괄호 붙이면 즉시 실행 |
| 불변성 | 고치지 말고 새로 만든다 |
| value + onChange | 제어 컴포넌트 |
| 끌어올리기 | 값은 아래로, 변경은 위로 |
할 일 목록 만들기
map 으로 그리기filter)map + 스프레드)3~5강 내내 이 할 일 목록을 계속 고쳐 나갑니다
3강에서는 바깥 세상과 이야기합니다