React
(React) 리액트 기초 18. Router 설정
resolve()
2023. 8. 9. 18:57
- yarn add react-router-dom
- yarn add @tanstack/react-query
// index.js
const router = createBrowserRouter([
{
path: '/',
element: <App />,
errorElement: <ErrorPage />,
children: [
{ index: true, path: '/', element: <Home /> },
{ path: '/path1', element: <Component1 /> },
{ path: '/path2', element: <Component2 /> },
{ path: '/path2/:keyword', element: <Component2-1 /> },
{ path: '/path/watch/:id', element: <Component2Detail /> },
],
},
]);
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<RouterProvider router={router} />
</React.StrictMode>,
);
reportWebVitals();
- 필요한 컴포넌트와 구조를 대략적으로 떠올린 뒤에, router로 작성하고 이 router를 RouterProvider로 전체에 적용한다. 페이지 하나당 하나의 라우터로 작성하려면 평생 라우터만 쓰고있어야 할지도 모르니까 중첩 라우팅을 사용한다.
- 중첩 라우팅이란? 여러 개의 컴포넌트에 걸쳐서 경로를 단계별로 정의하는 라우팅 기법이다.
- 특정 경로에 대해 새로운 파라미터를 루트로 지정하고 싶은 경우
{ path: '/path2', element: <Component2 /> },
{ path: '/path2/keyword', element: <Component2-1 /> }, - 특정 경로 뒤에서 id에 따라 다른 디테일을 보여주고 싶은 경우
{ path: '/[path2/:id', element: <Component2Detail/> },
뒤에 오는 값을 변수처럼 받아(:id) 해당하는 화면(<Component2Detail/>)을 보여줄 수 있다.
// App.js
const queryClient = new QueryClient();
export default function App() {
return (
<>
<NavBar />
<QueryClientProvider client={queryClient}>
<Outlet />
</QueryClientProvider>
</>
);
}
- react Query는 서버로 비동기 데이터를 가져오고 관리하는 라이브러리다. API를 호출하고 데이터를 캐싱하기 위해 사용한다.
- Outlet은 react-router-dom 라이브러리에서 사용하는 특별한 컴포넌트로, 주로 중첩 라우트 안에서 라우팅 결과를 렌더링 하기 위해서 사용한다.
- 위 코드에서 QueryClientProvider의 바깥에 있는 NavBar는 항상 렌더링 되고, react Query의 영향권에 있는 Outlet 이하의 라우트 컴포넌트들이 렌더링 될 때도 영향을 받지 않는다.
const [text, setText] = useState('');
const navigate = useNavigate();
const submitHandler = e => {
e.preventDefault();
navigate(`/path2/${text}`);
setText('');
};
이렇게 useState를 사용해서 input에 작성한 값이 path 이하 라우트에 담기도록 할 수도 있다.
const { keyword } = useParams();
<div>Videos {keyword ? `검색결과: ${keyword}` : '검색해보세요.'}</div>
위에서 state였던 text = :keyword이므로 useParams로 keyword를 가져오면 검색결과가 나오게 구현할 수 있다.