12.11 ) Home에서 getMontlyData 작성 중 오류 / 개발자도구 hooks Context 에서 객체가 아닌 함수로 출력됩니다
안녕하세요,
강의 잘 듣고있습니다!
16분 쯤에 montlyData를 만들어서 호출하는 부분인데
개발자도구로 체크해봤을때 hooks가 선생님처럼 나오지 않고 저런 함수 형태?로 출력이 되어서 그런지 오류가 나서 진행이 되지 않습니다ㅜ
눈알빠지게 찾아봤는데도 잘 모르겠어서 글을 씁니다ㅠㅠ
한번 체크 부탁드립니다
//App.jsx 파일입니다
const mockData = [
{
id: 1,
createdDate: new Date("2024-09-30").getTime(),
emotionId: 1,
content: '1번 일기'
}, {
id: 2,
createdDate: new Date("2024-09-29").getTime(),
emotionId: 2,
content: '2번 일기'
},
{
id: 3,
createdDate: new Date("2024-08-02").getTime(),
emotionId: 3,
content: '3번 일기'
}
];
function reducer(state, action) {
switch (action.type) {
case 'CREATE':
return [action.data, ...state];
case 'UPDATE':
return state.map((item) =>
String(item.id) === String(action.data.id) ? action.data : item);
case 'DELETE':
return state.filter((item) => String(item.id) !== String(action.id));
default:
return state;
}
}
export const DiaryStateContext = createContext();
export const DiaryDispatchContext = createContext();
function App() {
const [data, dispatch] = useReducer(reducer, mockData);
const idRef = useRef(3);
const onCreate = (createdDate, emotionId, content) => {
dispatch({
type: 'CREATE',
data: {
id: idRef.current++,
createdDate,
emotionId,
content,
},
});
};
const onUpdate = (id, createdDate, emotionId, content) => {
dispatch(
{
type: "UPDATE",
data: {
id,
createdDate,
emotionId,
content,
}
})
}
const onDelete = (id) => {
dispatch(
{
type: "DELETE",
id
}
)
}
return (
<>
<DiaryStateContext.Provider value={data}>
<DiaryStateContext.Provider value={{ onCreate, onUpdate, onDelete }}>
<Routes>
<Route path="/" element={<Home />}></Route>
<Route path="/new" element={<New />}></Route>
<Route path="/diary/:id" element={<Diary />}></Route>
<Route path="/edit/:id" element={<Edit />}></Route>
<Route path="*" element={<Notfound />}></Route>
</Routes>
</DiaryStateContext.Provider>
</DiaryStateContext.Provider>
</>
)
}
export default App
답변 2
1
안녕하세요 이정환입니다.
App 컴포넌트의 리턴문 내부에 DiaryStateContext의 Provider와 DiaryDispatchContext의 Provider를 함께 사용하는것이 아닌 DirayStateContext의 Provider를 두번 연달아 쓰셨네요 오타인것 같습니다. 아래와 같이 변경하시면 문제 해결될 것으로 보입니다
return (
<DiaryStateContext.Provider value={data}>
<DiaryDispatchContext.Provider value={{ onCreate, onUpdate, onDelete }}>
<Routes>
<Route path="/" element={<Home />}></Route>
<Route path="/new" element={<New />}></Route>
<Route path="/diary/:id" element={<Diary />}></Route>
<Route path="/edit/:id" element={<Edit />}></Route>
<Route path="*" element={<Notfound />}></Route>
</Routes>
</DiaryDispatchContext.Provider>
</DiaryStateContext.Provider>
);
0
안녕하세요, 인프런 AI 인턴입니다. zha8248님!
질문해주신 내용에 대해 비슷한 주제의 질문과 답변을 찾아서 안내드립니다.
문제의 원인과 해결 방법
질문 내용을 보니 hooks가 객체가 아닌 함수 형태로 출력되는 문제를 겪고 계신 것 같습니다. 이는 Context를 올바르게 사용하지 못했기 때문일 수 있습니다.
동일한 맥락에서 비슷한 문제를 겪었던 다른 사례를 소개하겠습니다:
- 작성완료 후
onCreate는 함수 에러를 해결하는 방법
관련 있는 부분:
<DiaryDispatchContext.Provider value={[ onCreate, onUpdate, onDelete, ]}>
위 코드는 배열을 사용해Context를 전달하고 있어 이후에 객체로 수정이 필요합니다.
<DiaryDispatchContext.Provider value={{
onCreate,
onUpdate,
onDelete,
}}>
- 작성완료 버튼 후 ‘onCreate is not a function’ 에러 해결 방법
관련 있는 부분:
const { onCreate } = useContext(DiaryDispatchContext);
위와 같은 코드를 사용해 DiaryDispatchContext를 통해 onCreate를 가져오는 방식이 잘못될 경우 나타나는 현상이 있을 수 있습니다.
주요 문제 및 해결 방법
위의 사례처럼 Context를 올바르게 전달하고 있는지 다시 확인하시기 바랍니다. 오류 코드에서는 <DiaryStateContext>와 <DiaryDispatchContext>를 중첩해서 사용하셨는데, 이것이 문제의 원인이 될 수 있습니다. 아래와 같이 Context를 분리하여 사용하는지 확인해보세요:
return (
<DiaryStateContext.Provider value={data}>
<DiaryDispatchContext.Provider value={{ onCreate, onUpdate, onDelete }}>
<Routes>
<Route path="/" element={<Home />}></Route>
<Route path="/new" element={<New />}></Route>
<Route path="/diary/:id" element={<Diary />}></Route>
<Route path="/edit/:id" element={<Edit />}></Route>
<Route path="*" element={<Notfound />}></Route>
</Routes>
</DiaryDispatchContext.Provider>
</DiaryStateContext.Provider>
);
이렇게 Context를 분리해 하나의 Provider 내에 또 다른 Provider를 중첩해서 사용하는 대신 각각 독립적으로 사용해보시기 바랍니다.
추가로, 아래의 관련 질문과 답변을 확인하시면 더 도움이 될 것 같습니다:
- 작성완료 시 onCreate 함수 호출 문제
- data와 onCreate, onRemove, onEdit의 Context 전달 이유
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
useEffect와 lifecycle문의
0
27
2
프론트엔드 학습 수준 문의
0
39
2
리액트 챕터별 코드에서 eslint 설정파일이 없어요
0
48
2
데이터 로딩중 화면만 계속 나와요!!
0
55
2
퍼블리셔일경우 어느정도 수준까지 강의를 들어야할까요
0
79
2
이후의 커리큘럼 문의
0
102
2
실슬환경 설정에서 save후 console.log 부분이 새로고침이 안되는현상입니다.
0
50
2
최적화 관련 질문있습니다 (useMemo 등)
0
84
3
프로바이더 컴포넌트의 위치는 어떤 기준인가요?
1
82
3
Date 객체에 관련하여 질문드립니다.
0
85
2
리액트 개정판 교재 질문
0
60
2
예제코드가 안나와요!
0
78
2
select a variant 선택에서 javascript와 javascript+react compiler 중 무엇을 선택해야하나요? com
0
108
2
onMouseEnter 관련 문의 드립니다
0
92
3
배열의 렌더링 관련 질문 드립니다.
0
73
2
2:40초 refObj를 콘솔로 출력시 오류가 발생합니다.
0
113
2
TS, 리액트 강의중에 뭘 먼저 수강하는게 좋을까요?
0
136
2
useCallback 적용한 onCreate, onUpdate, onDelete 함수..
0
69
1
vs code 자동완성관련 문의
0
113
2
91강 useEffect내에서 상태변화함수 호출시 발생하는 에러
1
179
2
87강 필터 함수 질문
0
69
2
useRef, useState count 비교
0
67
2
안된다고했던 이유가 무엇이었는지 모르겠습니다
0
90
2
85강에서 객체를 왜 클래스로 만들어서 new 하지 않는건지 궁금합니다.
0
75
2





