You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
TypeScript 적용으로 데이터의 타입을 정적으로 지정하며 관리하면서 에러를 줄였습니다.
2. ESLint, Prettier 적용:
ESLint 와 Prettier 를 프로젝트에 적용해 코드 작업 중 에러를 체크하고 팀원들과 통일된 환경으로 협업할 수 있었습니다.
3. 커스텀훅을 사용한 관심사 분리:
useTodoHook을 통해 Todo 아이템을 추가하고 삭제하는 로직을 UI와 분리하는 방식으로 리팩토링했습니다.
// src/hooks/useTodoHook.tsimportReact,{useState,useCallback}from'react';import{createTodo,deleteTodo}from'../api/todo';import{Todo}from'../types/todoType';// ...exportdefaultfunctionuseTodoHook({ setTodos }: UseTodoHookProps){const[submitLoading,setSubmitLoading]=useState(false);const[removeLoading,setRemoveLoading]=useState(false);constaddTodo=useCallback(async(inputText: string)=>{// Todo를 추가할 때 loading 상태 변화 (submitLoading)// inputText를 확인하고 Todo 아이템 생성 후 리스트에 추가// ...},[setTodos],);constremoveTodo=useCallback(async(id: number)=>{// Todo를 삭제할 때 loading 상태 변화 (removeLoading)// 선택된 해당 Todo 아이템을 리스트에서 제거// ...},[setTodos],);return{ addTodo, removeTodo, submitLoading, removeLoading };}
현재 가져온 아이템의 개수와 전체 아이템의 개수를 비교하며 무한 스크롤시 불필요한 API 콜을 방지했습니다.
// src/hooks/useDropdown.tsimport{useState}from'react';importapiRequestfrom'../api/index';// ...exportconstuseGetDropdownList=()=>{const[dropdown,setDropdown]=useState<DropdownState>({total: 0,dropdown: []});// ...constgetDropdown=async(query: string)=>{// dropdown의 전체 개수와 현재 아이템의 개수가 같으면 함수 종료if(dropdown.total&&dropdown.total===dropdown.dropdown.length)return;// 아니라면 API를 실행해서 데이터를 추가// ...};return{ dropdown, setDropdown, dropdownLoading, getDropdown, page, setPage };};
5. axios intercepters 를 이용한 에러 처리:
axios intercepters 를 이용해 받은 응답의 status를 확인 후 데이터를 리턴하도록 했습니다.
// src/api/index.ts// ...baseInstance.interceptors.response.use(({ data, status })=>{if(status===200){returndata;}thrownewError('something went wrong');});// ...
6. useFocus 의 useEffect 는 자신이 가지고 있게 함.
import{useRef,useEffect}from'react';constuseFocus=()=>{constfocusRef=useRef<HTMLInputElement>(null);constsetFocus=()=>{focusRef.current&&focusRef.current?.focus();};// useEffect 를 가지고 있음으로써 호출하는 곳에서 작성하지 않아도 됨.useEffect(()=>{setFocus();},[setFocus]);return{ focusRef, setFocus };};exportdefaultuseFocus;
7. 어색한 동작 제거
constremoveTodo=useCallback(async(id: number)=>{try{setRemoveLoading(true);awaitdeleteTodo(id);setTodos(prev=>prev.filter(item=>item.id!==id));}catch(error){console.error(error);setRemoveLoading(false);alert('Something went wrong.');}finally{// ❌finally 부분 삭제 // 아래 셋함수는 삭제가 성공한 이후에는 동작하지 않음.setRemoveLoading(false);}},[setTodos],);
The text was updated successfully, but these errors were encountered:
배포링크
https://pre-onboarding-10th-3-8-83s724og3-pre-onboarding-10th-3-8.vercel.app/
🎨 디자인
1. Input 디자인 수정
기본
인풋 Hover
인풋 Click 및 Typing
2. dropdown 디자인 구현
드랍다운 내용이 길 경우 하단에 '...' 아이콘 표시
드랍다운 검색어 요청 중 하단에 스피너 아이콘 표시
드랍다운 검색어 Hover
드랍다운 검색어 Click
🛠 기능 구현
1. 커스텀 훅 'useDebounce'을 이용한 API 요청 디바운스 처리
2. 커스텀 훅 'useDropdown'을 이용한 추천 검색어 요청
3. 커스텀 훅 'useObserver'을 이용한 무한스크롤 구현
4. Dropdown 검색어 Todo 아이템 리스트 반영
⚙️ 리팩토링
1. TypeScript 적용:
TypeScript
적용으로 데이터의 타입을 정적으로 지정하며 관리하면서 에러를 줄였습니다.2. ESLint, Prettier 적용:
ESLint
와Prettier
를 프로젝트에 적용해 코드 작업 중 에러를 체크하고 팀원들과 통일된 환경으로 협업할 수 있었습니다.3. 커스텀훅을 사용한 관심사 분리:
useTodoHook
을 통해 Todo 아이템을 추가하고 삭제하는 로직을 UI와 분리하는 방식으로 리팩토링했습니다.이로써 조금 더 추상화 된 방식으로 구현 가능
4. 커스텀훅
useDropdown
에서 무한 스크롤 기능 수정:5. axios intercepters 를 이용한 에러 처리:
axios intercepters
를 이용해 받은 응답의status
를 확인 후 데이터를 리턴하도록 했습니다.6. useFocus 의 useEffect 는 자신이 가지고 있게 함.
7. 어색한 동작 제거
The text was updated successfully, but these errors were encountered: