1. React 숙련 강의 마무리
어제 복습도 하면서 강의 다시 듣고 실습을 혼자서 해 본다고 시간을 많이 쏟아서 다른 걸 못 했다. 오늘은 답지를 보며 실습 마무리하고 남은 강의(router-dom)듣고 숙련 강의는 끝!
SPA 기반 React project 안에서 여러 페이지 구현 가능
yarn add react-router-dom
Router 설정
Router.js
- 각 페이지들을 importApp.js
- Router
importRouter Hook
useNavigate
onClick={() => {
navigate("/works");
}}
useLocation
console.log("location :>> ", location);
<div>{`현재 페이지 : ${location.pathname.slice(1)}`}</div>
Link
<a/>
대신 쓰는 API<a/>
를 쓰면 브라우저가 새로고침 되면서 components가 렌더링되고 useState등의 메모리가 초기화<Link to="/contact">
""안에 url 넣기useNavigate
/ Link
활용Layout Component
children
을 props로 받아 Header, Footer, page 합성function Layout({ children }) {
return (
<div>
<Header />
<div style={{...layoutStyles}}>
{children}
</div>
<Footer />
</div>
);
}
-> router.js
에서 Layout component로 <Routes>
를 감싸주기Dynamic Route(동적 라우팅)
:id
useParams
:id
조회할 수 있는 Hookrouter.js
에 추가<Route path="main/:id" element={<item/>} />
:id
- 동적인 값을 받겠는 뜻Main.jsx
에서 Link 설정<Link to={
/main/${item.id}}>
Item.jsx
에서 useParams
사용function Item() {
const param = useParams();
const item = data.find(
(item) => item.id === parseInt(param.id));
return <div>{item.todo}</div>;
}
2. React 숙련 과제
List Up
이전으로
버튼)이전으로
버튼 클릭 - 리스트 화면으로 돌아가기진행 과정
App.js
에서 Router를 import할 때 경로가 잘못 되어 있었음import Router from "./shared/Router"
으로 해야 하는데import { Router } from "react-router-dom";
으로 했음상세페이지 연결 시도
Todo.jsx
(상세 페이지)에 정적 데이터를 넣고 TodoList.jsx
에 버튼을 만들어 서로 연결 잘 되는 것 확인Todo.jsx
에는 useState
쓸 수 없음return <div>{todo.content}</div>;
에서 타이틀도 함께 가져오고 싶은데{(todo.title, todo.content)}
하면 content만 보임-> 페이지의 데이터 = 모듈의 initialState인 것 이용해보기
Link
사용해서 redux로 만든 todoList 연결하기
globalTodo
를 가져왔더니 오류props로 globalTodo
를 가져오는 게 아니라 useSelector
로 값을 다시 가져오니 해결
팀원이랑 상세 페이지 코드가 모두 똑같은데 왜 안될까?
그냥 뒤로가서 다시 누르면 잘 되는 거였는데 상세페이지에서 계속 새로고침을 해서 그런 거였다.
Redux 쓰기
AddForm.jsx
component 만든 후에 기존 AddTodo+ CSS파일까지 삭제하기
-> AddForm.jsx
으로 연결했는데 추가하기 누르면 데이터가 안 들어감
-> 모듈에서 switch문으로 return을 했더니 데이터가 잘 들어감! 추가하기는 구현 완료!
TodoContainer.jsx
만들고 기존 TodoBox+CSS 삭제하기 -> 코드 중복 피하려고 입문 과제 때 이렇게 한 건데 계속 'isDone'이 정의되지 않았다는 오류가 뜸
-> toDo.isDone === toDo.isDone
으로 수정하면 isDone이 true, false에 상관없이 'working'과 'done'에 각각 모든 데이터가 나타난다.
props를 써서 구현 리스트 분리해서 불러오기 성공!
-> 삭제 버튼을 누르면 해당 카드는 삭제 안 되고 밑에 '삭제하기, 완료 버튼'이 하나 더 생김
-> reducer
안에서 return 값을 다르게 해야 할 것 같은데 감이 안 잡힌다.
state.filter is not a function
오류팀원이 알려준 방식대로 dispatch로 아예 걸러진 값을 보내주기
성공!!!
todo:[action.payload]
에서 중괄호가 있을 땐 삭제하기 누르면 전체가 삭제 됐는데 중괄호를 빼니 완전 잘 된다!!! 상태 변경(완료, 취소) 버튼도 delete 버튼처럼 구현 성공!
삭제하기 할 때 삭제가 안 되고 버튼들만 추가되는 문제
setTodo
대신 dispatch
만 띡 붙인다고 되는 것이 아님TodoContainer.jsx
- 삭제하기 버튼 눌렀을 때 dispatch로 넘겨줄 것은 삭제할 그 id인데 이미 filter로 걸러진 list를 넘기려고 해서 문제payload(id값)
이고 Reducer에서 그 id를 제외한 리스트를 filter로 걸러서 반환하기!!console 잘 쓰기
todoList.js
모듈 - 삭제하기(Action Creator)에서console.log(payload)
하면 id값이 잘 찍힘. 이걸 활용해보기chatGPT
stack overflow
id생성시 length+1
쓸 때 문제점
3. Udemy React 강의
- 숙련 과제 하다가 머리 식힐 겸 강의 들었다.