컴포넌트가 리렌더될 때 내부에 작성된 함수를 다시 생성하지 않도록 메모이제이션하는 리액트 훅이다.
첫 번째 인수로는 메모이제이션하려는 콜백 함수를 전달하고, 두 번째 인수로는 의존성 배열을 전달한다.
const memoizedFunc = useCallback(func, deps)
import "./App.css";
import Header from "./component/Header.js";
import TodoEditor from "./component/TodoEditor.js";
import TodoList from "./component/TodoList.js";
import { useReducer, useRef } from "react";
const mockTodo = [
{
id: 0,
isDone: false,
content: "React 공부하기",
createdDate: new Date().getTime(),
},
{
id: 1,
isDone: true,
content: "컴활 공부하기",
createdDate: new Date().getTime(),
},
];
function reducer(state, action) {
switch (action.type) {
case "CREATE": {
return [action.newItem, ...state];
}
case "UPDATE": {
return state.map((it) =>
it.id === action.targetId
? {
...it,
isDone: !it.isDone,
}
: it
);
}
case "DELETE": {
return state.filter((it) => it.id !== action.targetId);
}
default:
return state;
}
}
function App() {
const [todo, dispatch] = useReducer(reducer, mockTodo);
const idRef = useRef(3);
const onCreate = (content) => {
dispatch({
type: "CREATE",
newItem: {
id: idRef.current,
content,
isDone: false,
createdDate: new Date().getTime(),
},
});
idRef.current += 1;
};
const onUpdate = (targetId) => {
dispatch({
type: "UPDATE",
targetId,
});
};
const onDelete = (targetId) => {
dispatch({
type: "DELETE",
targetId,
});
};
return (
<div className="App">
<Header />
<TodoEditor onCreate={onCreate} />
<TodoList todo={todo} onUpdate={onUpdate} onDelete={onDelete} />
</div>
);
}
export default App;
함수 onUpdate와 onDelete를 useCallback으로 메모이제이션을 하여 함수들을 다시 생성하지 않도록 만든다.
const onUpdate = useCallback((targetId) => {
dispatch({
type: "UPDATE",
targetId,
});
}, []);
const onDelete = useCallback((targetId) => {
dispatch({
type: "DELETE",
targetId,
});
}, []);