survey-pie 프로젝트 클론코딩하면서 알게된것도 많지만 그만큼 부족한 부분도 느꼈다. 제일 중요한건 기초. 특히 기능구현 부분에서 많이 느꼈다. 물론 계속 해보고 클론코딩이 아닌 직접 만들어가야 늘어가는것임을 알지만, 좀 더 기초를 다지고 시도해보고싶달까?(혼공은 힘들어 ㅜㅜ)
무튼 기초를 다져보자는 생각으로 바로 뒤이어 시작한 심플다이어리 클론코딩에서는 리액트에 많이 쓰여지는 ES6문법들도 리마인드할 수 있어서 좋았고, 뭣보다 모르면 콘솔에 찍어가면서 하니 이전 클론코딩들에서 이래서 그랬구나, 저래서 그랬구나 하는것을 많이 느꼈다. 열공하자:)
const authorInput = useRef();
const handleSubmit = () => {
if (state.author.length < 1) {
authorInput.current.focus();
return;
}
if (state.content.length < 5) {
contentInput.current.focus();
return;
}
...
};
const DiaryList = () => {
const diaryList = useContext(DiaryStateContext);
return (
<div className="DiaryList">
...
<div>
{diaryList.map((it) => (
// 데이터의 삭제나 생성시 발생할 인덱스값 변동으로 인해 일어난 오류를 피하기 위해 가급적 고유의 넘버를 지정해주자.
<DiaryItem key={it.id} {...it} />
))}
</div>
</div>
);
};
const [data, dispatch] = useReducer(reducer, []);
const dataId = useRef(0);
// 일기 더미데이터 불러오기
const getData = async () => {
const res = await fetch('https://jsonplaceholder.typicode.com/comments').then(
(res) => res.json(),
);
const initData = res.slice(0, 20).map((it) => {
return {
author: it.email,
content: it.body,
emotion: Math.floor(Math.random() * 5) + 1,
created_date: new Date().getTime(),
id: dataId.current++,
};
});
dispatch({ type: 'INIT', data: initData });
};
useEffect(() => {
getData();
}, []);
// 그냥 객체로 생성시 앱컴포넌트가 재생성이될 때 그 객체도 재생성됨 그러므로 useMemo를 활용해 재생성방지
const memoizedDispatches = useMemo(() => {
return { onCreate, onRemove, onEdit };
}, []);
export default React.memo(DiaryEditor);
// 새로운 일기 생성하기
const onCreate = useCallback((author, content, emotion) => {
dispatch({
type: 'CREATE',
data: { author, content, emotion, id: dataId.current },
});
dataId.current += 1;
}, []);
// 일기 삭제하기
const onRemove = useCallback((targetId) => {
dispatch({ type: 'REMOVE', targetId });
}, []);
// 일기 수정하기
const onEdit = useCallback((targetId, newContent) => {
dispatch({ type: 'EDIT', targetId, newContent });
}, []);
const [data, dispatch] = useReducer(reducer, []);
const reducer = (state, action) => {
switch(action.type) {
return ...
}
}
export const DiaryStateContext = React.createContext();
export const DiaryDispatchContext = React.createContext();
return (
<DiaryStateContext.Provider value={data}>
<DiaryDispatchContext.Provider value={memoizedDispatches}>
<div className="App">
<DiaryEditor />
<div>전체 일기 : {data.length}</div>
<div>기분 좋은 일기 개수 : {goodCount}</div>
<div>기분 나쁜 일기 개수 : {badCount}</div>
<div>기분 좋은 일기 비율 : {goodRatio}</div>
<DiaryList />
</div>
</DiaryDispatchContext.Provider>
</DiaryStateContext.Provider>
);
그전에도 이것저것 따라하며 리액트데브툴즈의 존재는 알았지만 이번 기초다지기를 하며 확인방법을 제대로 캐치했다. 컴포넌트들의 계층구조를 한눈에 보여줘서 좋았다. 감싸고있는 context Provider까지도 싸악 보여준다.
Editor에는 현재 받고있는 props가 없어서 빈 값이지만 컨텍스트로 받은 함수들과 state들을 체크할 수 있었다. 값이 들어왔는지 아닌지를 체크하기에 매우 용이할 것 같다.
다이어리 리스트들의 item별로 고유 key이 잘들어갔는지 확인할 수 있었다.
말고도 유용한 쓰임새가 더있으니 잘 활용해보자:)