
import React from 'react';
const MyContext = React.createContext(defaultValue);
import React from 'react';
const MyContext = React.createContext(defaultValue);
function App(){
const data='data';
return(
<div>
<header/>
<MyContext.Provider vlaue=(data)>
<Body/>
</MyContext.Provider>
</div>
);
}
export default App;
import React, {useContent} from 'react'
const MyContent = React.createContext(defaultValue);
function App(){
...
}
function Main(){
const data = useContext(MyContext);
..}
(Props Drilling-제거, 할 일 아이템-추가,수정,삭제,검색 기능은 변합없이 동작하도록 만들어야함)


-Todocontext 만들기
-Context는 반드시 컴포넌트 밖에서 생성해야합니다.(안에서 생성-의도대로 동작 불가능/ 별도의 파일로 분리)
-TodoContext하위에 배치한 컴포넌트는 다른경로로 props를 받을 필요가 없기 때문에 기존의 props를 모두 제거합니다.
import React, { useCallback,useReducer,useRef} from"react";
(...)
const TodoConte= React.createContent();
function App(){
(...)
return(
<div className="App">
<Header/>
<TodoContext.Provider>
<TodoEditer onCreate={onCreate}/>
<TodoList todo={todo} onUpdate={onUpdate} onDelete={onDelete}/>
</TodoContext.Provider>
</div>
};
}
export default App;
(...)
const analyzeTodo = useMemo(()=>{
const totalCount= todo.length;
const doneCount = todo.filter((it)=>it.isDone).length;
const notDoneCount = totalCount- doneCount;
return{
totalCount,
doneCoubt,
notDoneCount,
};
},[todo]};
(...)
const TodoList=({todo,onUpdate,onDelete})=>{
(...)
}
TodoList.defaultProps={
todo;[],
};
export default TodoList;
import { useContext. useMenu, useState } from "react";
import { TodoContext} from ".../App";
(...)
const TodoList=({ todo, onUpdate, onDelete})=>{
const storeData= useContext(TodoContext);
console.log(storeDate);
(...)
};
(1) 리팩토링이 잘 되었는지 확인하기1
(2) 문제의 원인 파악하기
(3) 구조 재설계하기
(4) 재설계된 구조로 변경하기
export const TodoStateContext = React.createContent();
export const TodoDispatchContext = React.createContent();
function App(){
(...)
return(
<div clasName="App">
<Header/>
<TodoStateContext.Provider value={todo}>
<TodoDispatchContext.Provider value={{ onCreate,onUpdate,onDelete}}>
<TodoEditer/>
<TodoList/>
</TodoDispatchContext.Provider>
</TodoStateContext.Provider>
</div>
};
}
export default App;
import React, { useMemo, useReducer, useCallback, useRef{} from "react";
(...)
function App() {
(...)
const memoizedDispatches = useMemo(() => {
return { onCreate, onUpdate, onDelete };
}, []);
return (
<div className="App">
<Header />
<TodoStateContext.Provider value={{todo}}>
<TodoDispatchContext.Provider value={memoizedDispatches}>
<TodoEditor />
<TodoList />
</TodoDispatchContext.Provider>
</TodoStateContext.Provider>
</div>
);
}
export default App;
(5) TodoEditer 수정하기
import { TodoDispatchContext } from "../App";
const TodoEditor = () => {
const { onCreate } = useContext(TodoDispatchContext);
return (
// ...
);
};
export default TodoEditor;
(6) TodoList 수정하기
import { TodoStateContext } from "../App";
const TodoList = () => {
const todo = useContext(TodoStateContext);
return (
);
};
export default TodoList;
(7) TodoItem 수정하기
import { TodoDispatchContext } from "../App";
const TodoItem = ({ id, content, isDone, createdDate }) => {
console.log(`${id} TodoItem 업데이트`);
const { onUpdate, onDelete } = useContext(TodoDispatchContext);
return (
// ...
);
};
export default React.memo(TodoItem);
(8) 리팩토링 잘 되었는지 확인하기2

출처: 이정환, 『한 입 크기로 잘라먹는 리액트』, 프로그래밍인사이트(2023).
Corner React.js
Editor: dori
| [React.js] 16장 리덕스 라이브러리 이해하기 ~ 17장 리덕스를 사용하여 리액트 애플리케이션 상태 관리하기 (0) | 2026.01.16 |
|---|---|
| [React.js] project 3 [감정 일기장] 만들기 (0) | 2026.01.09 |
| [React.js] project 2[할일 관리] 앱 만들기 (Read: 할 일 리스트 렌더링하기 ~ Delete: 할 일 삭제하기) (0) | 2025.12.26 |
| [React.js] project 2[할일 관리] 앱 만들기 (프로젝트 준비하기 ~ Create: 할 일 추가하기) (0) | 2025.12.19 |
| [React.js] UseReducer와 상태 관리 -최적화 (0) | 2025.11.28 |