
아래 코드에서 classes.menu가 정확히 뭔지 이해가 안되었음
확장자명 module.css도 잘 모르겠다.
추가로 알아보기
MainNavigator.module.css
a{
text-decoration: none;
color: blue;
}
.menu{
color: red;
text-decoration: underline;
}
MainNavigator.js
import React from 'react';
import { NavLink } from 'react-router-dom';
import classes from './MainNavigator.module.css';
function MainNavigator(props) {
console.log(classes.menu);
return (
<div>
{/* <Link to="/">Home</Link><br/>
<Link to="/products">products</Link><br/>
<Link to="/products2">products2</Link><br/> */}
<NavLink
to="/"
className={({isActive})=>{
return isActive?classes.menu:undefined;
}}>Home</NavLink><br/>
<NavLink
to="/products"
className={({isActive})=>{
return isActive?classes.menu:undefined;
}}>Products</NavLink><br/>
</div>
);
}
export default MainNavigator;
useNavigate 훅을 이용해 어디서든 간편하게 특정 페이지로의 주소이동을 구현가능
const navigate = useNavigate();
function handlEvent(){
navigate("/products");
}
get 요청에서 데이터 전달하는 방식
1. 기존 쿼리스트링 방식
2. PathVariable 방식
여기선 2번에 대해 다룬다.

/주소/데이터 형식으로 요청 (pathvariable 형식){path: '/products/:productId', element: <ProductDetailPage />}useParams()를 이용해 값을 반환받으면 key:value 형식의 파라미터들이 json객체에 담겨서 반환된다.
아래와 같이 사용한다.
const params = useParams() -> console.log(params.키값);

route는 현재 주소가 하나의 값으로 설정되어서 상위경로로 가면 /가 된다.
따로 적지 않을시 기본값은 route로 설정된다.
프로젝트 다시 보기
const [params] = useSearchParams();
const prod_id = params.get("prod_id");
console.log(prod_id);
return (
<div>
{prod_id}
</div>
);


로더는 페이지 로딩시에 최초 한번 실행되는 함수다.
로더 설정
{path: '/users', element: <UsersPage />,
loader: async function(){
console.log("loader>>>>");
const response = await fetch("https://reqres.in/api/users?page=2");
const resData = await response.json();
return resData.data;
}
로더의 반환값 사용
const events = useLoaderData();
자식에서 사용가능
자손에서도 사용가능
id: "root",
loader: async function () {
const events = useRouteLoaderData("root");선택 여부와 상관없이 로더는 실행된다.

import MainNavigator from '../components/MainNavigator';
import { Outlet, useNavigation } from 'react-router-dom';
function Root(props) {
const navigation = useNavigation();
return (
<div>
<MainNavigator></MainNavigator>
<hr/>
{navigation.state === "loading" && <p>Loading...</p>}
{/* {navigation.state === "loading" && alert()} */}
<Outlet></Outlet>
</div>
);
}
export default Root;



에러페이지에서 에러 받는 방식이 useRouterError hook을 이용하여 발생된 예외를 catch 한다.
import { json } from 'react-router-dom';
다른 json 사용
에러발생 로더 함수
export async function loader(){
try {
console.log("Users.loader 실행 >>>>>");
const response = await fetch("https://reqres-error.in/api/users?page=2");
//예외처리 코드
console.log(">>>", response.ok);
const resData = await response.json();
return resData.data;
} catch (error) {
console.log("catch error " , error);
throw json({message: "Could not fetch users", status: 500}); //import
//Error.js 수정 useRouterError()로 사용됨
}
}
에러페이지
import React from 'react';
import { Outlet, useRouteError } from 'react-router-dom';
import MainNavigator from '../components/MainNavigator';
function Error(props) {
const error = useRouteError();
console.log("에러객체확인: ", error);
console.log(error.data.message, error.data.status);
let title = "An error occurred!!";
let message = "Something went wrong!!";
if(error.data.status === 500){
message = error.data.message;
}
if(error.data.status ===404){
title= "Not Found!";
message = "Could not find resource or page";
}
return (
<div>
<MainNavigator></MainNavigator>
<hr/>
<div>
<h1>{title}</h1>
<p>{message}</p>
</div>
</div>
);
}
export default Error;