8. 리액트 훅
1) 리액트 훅이란
2) useState : 상태값 관리 Hook
onClick
함수가 호출되어도 setCount
는 두번 작성하였지만, count
값은 1씩만 증가하고 console.log('render called')
로그는 한번만 출력된다. onClick
이벤트 핸들러는 리액트 내부에서 관리되는 리액트 요소에 입력이 되어 있기 때문에 배치로 처리가 된다. import React, { useState, useEffect } from 'react';
export default function App() {
const [count, setCount] = useState(0);
function onClick() {
setCount(v => v + 1);
setCount(v => v + 1);
}
console.log('render called');
return (
<div>
<h2>{count}</h2>
<button onClick={onClick}>증가</button>
</div>
);
}
3) useEffect: 부수 효과 처리 Hook
export default function App() {
const [count, setCount] = useState(0);
useEffect(() => {
document.title = `업데이트 횟수: ${count}`;
});
return <button onClick={() => setCount(count + 1)}>increase</button>;
}
📍 동기호출
요청에 대한 결과가 동시에 일어난다.
📍 비동기호출
요청에 대한 결과가 동시에 일어나지 않고 요청을 한번에 다받고 이벤트가 준비 되었을 때 응답을 나중에 이루어진다.
4) useEffect 와 의존성 배열
import React, { useState, useEffect } from 'react';
export default function Profile({ userId }) {
const [user, setUser] = useState(null);
useEffect(() => {
getUserApi(userId).then(data => setUser(data));
}, [userId]);
return (
<div>
{!user && <p>사용자 정보를 가져오는 중...</p>}
{user && (
<>
<p>{`name is ${user.name}`}</p>
<p>{`age is ${user.age}`}</p>
</>
)}
</div>
);
}
const USER1 = { name: 'mike', age: 23 };
const USER2 = { name: 'jane', age: 31 };
function getUserApi(userId) {
return new Promise(result => {
setTimeout(() => {
result(userId % 2 ? USER1 : USER2);
}, 500);
});
}
5) 의존성 배열에 어떤 값을 입력해야 할까
6) 부수 효과 함수가 반환하는 값
export default function WidthPrinter() {
const [width, setWidth] = useState(window.innerWidth);
useEffect(() => {
const onResize = () => setWidth(window.innerWidth);
window.addEventListener('resize', onResize); // 이벤트 리스너 등록
return () => {
window.removeEventListener('resize', onResize); // 이벤트 리스너 해제
};
}, []);
return <div>{`width is ${width}`}</div>;
}