- usestate : 컴포넌트 내부에서 state 변경의 위해 사용.
- useEffect : 컴포넌트가 렌더링 된 이후마다 특정 작업을 수행하도록 설정할 수 있는 Hook (e.g. 서버에서 데이터 가져오기)
- useRef : 리렌더링과 상관없이 useState와 같이 특정 값을 저장하기 위해 사용
- useContext : prop drilling이 많아져 복잡해졌을 때, 전역상태를 관리할 수 있는 Hook (꼭 전역상태가 아니여도 됨.)
- memoization : 불필요한 렌더링이 발생하지 않도록 최적화하는 방법
const [ state, setState ] = useState( 초기값 );
onClick={() =>{
setNumber(number + 1);
setNumber(number + 1);
setNumber(number + 1);
}
onClick={() =>{
setNumber((prev) => prev + 1);
setNumber((prev) => prev + 1);
setNumber((prev) => prev + 1);
}
=> 왜 setCount 이후에 콘솔로그로 count 찍으면 반영이 안되는지 답안: setState(상태변경함수) 실행은 일반업데이트 시 비동기적으로 동작(배치업데이트(batch update))
((보통 외부 데이터를 불러올 때 사용해요. (e.g. 서버에서 데이터 가져오기))
: "이 배열에 값을 넣으면 그 값이 바뀔 때만 useEffect를 실행할게"
useEffect(()=>{
// 실행하고 싶은 함수
}, [의존성배열])
(자바스크립트 DOM API를 직접사용하지 않고 DOM 요소를 다루기 위한 용도로도 자주 사용)
const ref = useRef("초기값");
console.log("ref", ref); // ref > {current: '초기값'}
값을 변경할 수도 있음.
createContext : context를 생성합니다.useContext : context를 구독하고 해당 context의 현재 값을 읽습니다.Provider : context를 하위 컴포넌트에게 전달합니다.1) context 폴더 > context.js 파일 생성
import { createContext } from "react";
export const FamilyContext = createContext(null); // null은 context의 초기값
2) GrandFather.jsx 파일에 provider로 감싸줄 것.
import React from "react";
import Father from "./Father";
import { FamilyContext } from "../context/FamilyContext";
function GrandFather() {
const houseName = "스파르타";
const pocketMoney = 10000;
return (
<FamilyContext.Provider value={{ houseName, pocketMoney }}>
<Father />
</FamilyContext.Provider>
);
}
export default GrandFather;
3) Father.jsx 파일에 props 제거
import React from "react";
import Child from "./Child";
function Father() {
return <Child />;
}
export default Father;
4) Child.jsx 수정
import React, { useContext } from "react";
import { FamilyContext } from "../context/FamilyContext";
function Child({ houseName, pocketMoney }) {
const stressedWord = {
color: "red",
fontWeight: "900",
};
const data = useContext(FamilyContext);
console.log("data", data);
return (
<div>
나는 이 집안의 막내에요.
<br />
할아버지가 우리 집 이름은 <span style={stressedWord}>{data.houseName}</span>
라고 하셨어요.
<br />
게다가 용돈도 <span style={stressedWord}>{data.pocketMoney}</span>원만큼이나
주셨답니다.
</div>
);
}
export default Child;
export default React.memo(Box1);
export default React.memo(Box2);
export default React.memo(Box3);
: 인자로 들어오는 함수 자체를 기억(= 함수 memoization)
// 변경 전
const initCount = () => {
setCount(0);
};
// 변경 후
const initCount = useCallback(() => {
setCount(0);
}, []);
: 동일한 값을 반환하는 함수를 계속 호출해야 하면 필요없는 렌더링을 함. 맨 처음 해당 값을 반환할 때 그 값을 특별한 곳(메모리)에 저장해 필요할 때 마다 다시 함수를 호출해서 계산하는게 아니라 이미 저장한 값을 단순히 꺼내와서 쓸 수 있다.
// as-is
const value = 반환할_함수();
// to-be
const value = useMemo(()=> {
return 반환할_함수()
}, [dependencyArray]);