4강 — 커진 앱 정리하기
2024 DTC
| → / Space | 다음으로 |
| ← | 이전으로 |
| ↓ / ↑ | 같은 주제 안에서 단계 이동 |
| O | 전체 슬라이드 한눈에 보기 |
| F | 전체화면 |
아래쪽 화살표가 보이면 그 주제는 단계별로 이어집니다
| useState | 바뀌면 화면도 바뀌는 값 |
| useEffect | 렌더링이 끝난 뒤 딴 일 |
| 끌어올리기 | 공통 부모로 state를 올린다 |
오늘은 지금까지 만든 코드를 정리합니다
props가 너무 멀리 간다
가운데 컴포넌트들은 쓰지도 않으면서 받아 넘기기만 한다
<Layout user={user}>
<Header user={user}>
<Avatar user={user} />
</Header>
</Layout>
멀리 있는 컴포넌트에 값을 전달하려면
src/UserContext.js
import { createContext } from 'react';
export const UserContext = createContext(null);
<UserContext.Provider value={user}>
<Layout />
</UserContext.Provider>
import { useContext } from 'react';
function Avatar() {
const user = useContext(UserContext);
return <img src={user.avatar} />;
}
중간 컴포넌트는 아무것도 안 넘긴다
DOM에 직접 닿거나 값을 기억하려면
const inputRef = useRef(null);
useEffect(() => {
inputRef.current.focus();
}, []);
<input ref={inputRef} />
화면에 뜨자마자 커서가 들어간다
const timerRef = useRef(null);
function start() {
timerRef.current = setInterval(tick, 1000);
}
function stop() {
clearInterval(timerRef.current);
}
바뀌면 다시 그린다
화면에 보이는 값바뀌어도 안 그린다
화면과 무관한 값같은 계산을 다시 하지 않으려면
function App({ items, keyword }) {
// 렌더링될 때마다 전부 다시 거른다
const result = items.filter(
(i) => i.name.includes(keyword)
);
}
렌더링될 때마다 10만 번씩 걸러도 될까요?
const result = useMemo(
() => items.filter(
(i) => i.name.includes(keyword)
),
[items, keyword]
);
const handleClick = useCallback(() => {
setCount((c) => c + 1);
}, []);
반복되는 로직을 뽑아내려면
function UserPage() {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
useEffect(() => { /* fetch */ }, []);
}
function PostPage() {
const [data, setData] = useState(null); // 똑같다
const [loading, setLoading] = useState(true);
useEffect(() => { /* fetch */ }, []);
}
같은 코드가 화면마다 반복되면 어떻게 할까요?
src/hooks/useFetch.js
function useFetch(url) {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
fetch(url)
.then((r) => r.json())
.then((d) => { setData(d); setLoading(false); });
}, [url]);
return { data, loading };
}
function UserPage() {
const { data, loading } = useFetch("/api/users");
if (loading) return <p>불러오는 중…</p>;
return <UserList users={data} />;
}
use 로 시작파일이 늘어나면
오늘 배운 것
| Context | 깊은 곳까지 값 전달. 자주 안 바뀌는 값에 |
| useRef | DOM 접근, 화면과 무관한 값 보관 |
| useMemo | 계산 결과 기억 |
| useCallback | 함수 기억 |
| 커스텀 훅 | 반복 로직 추출. use로 시작 |
| 훅 규칙 | 맨 위에서만. 조건문 안에서 금지 |
할 일 목록 리팩터링
localStorage 로직을 커스텀 훅으로useRef)새로 만들지 말고 있는 코드를 옮깁니다
5강에서는 실제로 내보냅니다