12.11) Home 페이지 구현하기 2. 기능
해당 챕터에서 강의대로 진행했고 몇번을 다시 확인해봐도
차이점을 도통 찾지 못해서 문의드립니다.
Home.jsx에서 데이터를 필터걸어도 걸리지않는 상황
DiaryList.jsx에서 DiaryItem으로 데이터를 보내도 받는쪽에서 받지 못하는 상황(개발자도구에서는 워닝으로
hook.js:608 Warning: Each child in a list should have a unique "key" prop) 발생이하 소스첨부 드립니다.
App.jsx
import './App.css'
import { useReducer, useRef, createContext } from 'react';
import { Routes, Route } from 'react-router-dom';
import Home from './pages/Home';
import Diary from './pages/Diary';
import New from './pages/new';
import Edit from './pages/Edit';
import Notfound from './pages/Notfound';
const mockData =[
{
id : 1,
createdDate : new Date("2024-12-6").getTime(),
emotionId : 1,
content : "1번 일기내용",
},
{
id : 2,
createdDate : new Date("2024-12-5").getTime(),
emotionId : 2,
content : "2번 일기내용",
},
{
id : 3,
createdDate : new Date("2024-11-15").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 : "DELTE",
data : {
id,
}
}
)
}
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>
</>
);
};
export default App
Home.jsx
import { useState, useContext } from "react";
import { DiaryStateContext } from "../App";
import Button from "../components/button";
import Header from "../components/Header"
import DiaryList from "../components/DiaryList";
const getMonthlyData = (pivotDate, data) =>{
const beginTime = new Date(
pivotDate.getFullYear(),
pivotDate.getMonth(),
1,
0,
0,
0
).getTime();
const endTime = new Date(
pivotDate.getFullYear(),
pivotDate.getMonth() + 1,
0,
23,
59,
59
).getTime();
console.log('필터시작일자 : ' + beginTime + '필터종료일자' + endTime)
return data.filter((item)=> beginTime <= item.createdDate <= endTime);
}
const Home = () => {
const data = useContext(DiaryStateContext);
const [pivotDate,setPivotDate] = useState(new Date());
const monthlyData = getMonthlyData(pivotDate, data);
console.log(monthlyData);
const onIncreaseMonth = () => {
setPivotDate(new Date(pivotDate.getFullYear(), pivotDate.getMonth() + 1)
);
};
const onDecreaseMonth = () => {
setPivotDate(new Date(pivotDate.getFullYear(), pivotDate.getMonth() - 1)
);
};
return <div>
<Header title = {`${pivotDate.getFullYear()} 년 ${
pivotDate.getMonth()+ 1 }월`}
leftChild={<Button onClick={onDecreaseMonth} text="<" />}
rightChild={<Button onClick={onIncreaseMonth} text=">" />}
/>
<DiaryList data={monthlyData} />
</div>;
}
export default Home;DiaryList.jsx
import './DiaryList.css'
import Button from "./button";
import DiaryItem from './DiaryItem';
import { useNavigate } from 'react-router-dom';
import { useState } from 'react';
const DiaryList = ({data}) => {
const nav = useNavigate();
const [sortType, setSortType] = useState("latest");
const onChangeSortType = (e) => {
setSortType(e.target.value);
};
const getSortedDate = () => {
return data.toSorted((a, b) => {
if(sortType ==='oldest'){
return Number(a.createdDate) - Number(b.createdDate);
} else {
return Number(b.createdDate) - Number(a.createdDate);
}
});
}
const sortedData = getSortedDate();
return (
<div className="DiaryList">
<div className="menu_bar">
<select>
<option value={"latest"}>최신순</option>
<option value={"oldest"}>오래된순</option>
</select>
<Button
onClick = {() => nav("/new")}
text={"새 일기 쓰기"}
type={"POSITIVE"} />
</div>
<div className="list_wrapper">
{sortedData.map((item)=><DiaryItem key={item.id} {...item}/>)}
</div>
</div>
);
};
export default DiaryList;DiaryItem.jsx
import getEmotionImage from "../util/get-emotion-image"
import Button from "./button";
import "./DiaryItem.css";
import { useNavigate } from "react-router-dom";
const DiaryItem = ({id, emotionId, createdDate, content}) => {
const nav = useNavigate();
return (
<div className="DiaryItem">
<div
onClick={()=>nav(`/diary/${id}`)}
className={`img_section img_section_${emotionId}`}
>
<img src={getEmotionImage(1)} />
</div>
<div
onClick={()=>nav(`/diary/${id}`)}
className="info_section">
<div className="created_date">
{new Date(createdDate).toLocaleDateString()}
</div>
<div className="content">{content}</div>
</div>
<div className="button_section">
<Button
onClick={()=>nav(`/edit/${id}`)}
text={"수정하기"} />
</div>
</div>
)
};
export default DiaryItem;


답변 1
0
안녕하세요 이정환입니다.
보내주신 코드로만 봤을 때에는 Home.jsx에 오류의 getMonthlyData 함수에 오류가 있네요
아래 그림에서 드래그 한 부분 보시면 됩니다.

확인해보시면 비교문이 이상하게 작성되어 있습니다.
beginTime <= item.createdDate <= endTime 이 아닌
beginTime <= item.createDate && item.createdDate < endTime 으로 수정하셔야 합니다.
1
안녕하세요!
필터가 안걸리고 데이터가 안보이는게 가장 큰 문제여서 이것저것 수정하다보니 잘못된 코드까지 들어갔었내여
다시한번 꼼꼼히 보니
App.jsx에
const [data, dispatch] = useReducer(reducer, [mockData]);
mockData에 괄호가 들어가서 생긴문제였습니다
바쁘신대 확인 감사합니다
useEffect와 lifecycle문의
0
26
2
프론트엔드 학습 수준 문의
0
37
2
리액트 챕터별 코드에서 eslint 설정파일이 없어요
0
47
2
데이터 로딩중 화면만 계속 나와요!!
0
54
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
91
3
배열의 렌더링 관련 질문 드립니다.
0
73
2
2:40초 refObj를 콘솔로 출력시 오류가 발생합니다.
0
112
2
TS, 리액트 강의중에 뭘 먼저 수강하는게 좋을까요?
0
135
2
useCallback 적용한 onCreate, onUpdate, onDelete 함수..
0
69
1
vs code 자동완성관련 문의
0
112
2
91강 useEffect내에서 상태변화함수 호출시 발생하는 에러
1
178
2
87강 필터 함수 질문
0
68
2
useRef, useState count 비교
0
67
2
안된다고했던 이유가 무엇이었는지 모르겠습니다
0
90
2
85강에서 객체를 왜 클래스로 만들어서 new 하지 않는건지 궁금합니다.
0
75
2





