티스토리 뷰
1. Router 설정
상세페이지는 동적으로 표현하기 위해 router를 이용해 동적 경로를 이용
import { Navigate, RouterProvider, createBrowserRouter } from "react-router-dom";
import Home from "./components/pages/Home";
import Error from "./components/pages/Error";
import Detail from "./components/pages/Detail";
const router = createBrowserRouter([
{
path: "/",
element: <Home />,
errorElement: <Error />,
},
{
path: "/:detail/:id",
element: <Detail />,
},
{
path: "*",
element: <Navigate to="/" replace />,
},
]);
function App() {
return <RouterProvider router={router}/>
}
export default App;
💡 경로설정에 따른 차이
❓ 고정경로 ( path : " /detail " )
url이 정확히 /detail로 일치할 때만 해당 라우터가 활성화 된다.
즉, 하나의 구체적인 경로로, 특정 기능이나 페이지에 대한 정확한 경로를 나타낸다.
❓ 동적경로 ( path : " /:detail " )
URL의 해당 부분이 변할 수 있고, 변하는 부분을 경로 매개변수(parameter)로 추출할 수 있다.
예를 들어 /1, /2, /3 등과 같이 다양한 Id에 대한 구조의 페이지를 보여줄 수 있다.
2. id 받아오기
id 중에서 선택된 아이디가 무엇인지 비교가 필요하기 때문에,
선택된 값을 가지고 있는 컴포넌트에서 id를 가져와야 한다.
return (
<li>
<div className={styles.List}>
<p className={styles.title}>{todo.title}</p>
<p>{todo.content}</p>
<p className={styles.Date}>{todo.date}</p>
<p className={styles.GapDay}>{gapday()}</p>
</div>
<div className={styles.Buttons}>
<Link to={`/:detail/${todo.id}`}>
<button className={styles.DetailButton}>상세보기</button>
</Link>
<button className={styles.IconButton} onClick={handleIsDone}>
<IoIosCloudDone className={styles.Icon} />
</button>
<button className={styles.IconButton} onClick={handleDelete}>
<FaTrashAlt className={styles.Icon} />
</button>
</div>
</li>
);
위 코드는 UI에서 객체의 값을 담고 있는 컴포넌트이다.
id 전달하기
<Link to={`/:detail/${todo.id}`}>
<button className={styles.DetailButton}>상세보기</button>
</Link>
<Link/> 를 통해 이동되어야 하는 페이지와 id값을 전달
id 받기
import { useParams } from "react-router-dom";
export default function DetailPage() {
const { todos } = useContext(TodoContext);
const { id } = useParams();
const todo = todos.find((todo) => todo.id === id);
이동된 페이지 컴포넌트에서 useParams를 통해 id 받기
3. 만들어둔 component, import 해서 사용하기!
import DetailPage from "../detailItem/DetailPage";
import styles from "./Detail.module.css";
export default function Detail() {
return (
<div className={styles.DetailBox}>
<DetailPage />
</div>
);
}
만들어둔 DetailPage 컴포넌트 만들어서 사용해 주면 끝!!
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Warning: Each child in a list should have a unique "key" prop.
- nextjs 토큰 만료처리하기
- Warning: A component is changing an uncontrolled input to be controlled.
- 영화 별점
- readme 작성해야 하는 이유
- 유효성검사 css
- git cache
- axiosinstance 사용 시 토큰 사용 법
- styled component 조건부 사용방법
- styled component 사용방법
- readme 역할
- axios CRUD
- readme 이미지 추가 방법
- axios instance 작성하기
- Fetch와 Axios 의 장단점
- 별점만들기
- 별점 색채우기
- styled component 설치방법
- axios 사용하기
- readme작성해보기
- simple Icon 사용방법
- readme 작성 방법
- 유효성검사
- axios 설치하기
- Warning: validateDOMNesting(...): <li> cannot appear as a descendant of <li>
- 영화별점만들기
- styled component GlobalStyle 사용방법
- 에러모음집
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
글 보관함