createBrowserRouter()
BrowserRouter๋ฅผ ์์ฑํ๋ ํจ์๋ก, v6์์ ์๋กญ๊ฒ ์ถ๊ฐ๋ ๋ผ์ฐํ
์ค๊ณ ๋ฐฉ๋ฒ
ํด๋น ๋ผ์ฐํ
์ค๊ณ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด v6.4์ ์ถ๊ฐ๋ ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
function createBrowserRouter(
routes: RouteObject[],
opts?: {
basename?: string;
future?: FutureConfig;
hydrationData?: HydrationState;
window?: Window;
}
): RemixRouter;
routes โ ๋ผ์ฐํธ ๊ฐ์ฒด ๋ฐฐ์ด
basename โ ์ฑ์ ๊ธฐ๋ณธ ์ด๋ฆ, '/app' ์ด๋ผ๊ณ ์ค์ ์ '/'๋ '/app'์ ๊ฐ๋ฆฌํจ๋ค.
import { createBrowserRouter, RouterProvider } from 'react-router-dom';
const router = createBrowserRouter([
{
path: '/',
element: <Layout />,
children: [
{ index: true, element: <HomePage /> },
{ path: '/dashboard', element: <DashboardPage /> }
]
}
]);
function App() {
return (
<ReactProvider router={router} />
);
}
Routes.tsx
ํ
์คํธ ํ๊ฒฝ์์๋ ๋ผ์ฐํธ ์ ๋ณด๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ ๋ผ์ฐํธ ๊ฐ์ฒด ๋ฐฐ์ด์ ๋ณ๋์ ๋ชจ๋๋ก ๋ถ๋ฆฌํด์ ๊ด๋ฆฌ
routes.tsx
import Layout from './components/Layout';
import HomePage from './pages/HomePage';
import DashboardPage from './pages/DashboardPage';
const routes = [
{
path: '/',
element: <Layout />,
children: [
{ index: true, element: <HomePage /> },
{ path: '/dashboard', element: <DashboardPage /> }
]
}
];
export default routes;
createRoutesFromElements()
React Element ๋ฐฐ์ด์ ๋ผ์ฐํธ ๊ฐ์ฒด ๋ฐฐ์ด๋ก ๋ณํํ๋ ํจ์
createBrowserRouter()๋ฅผ ์ฌ์ฉํ ๋ ์ด์ ์ ์ฌ์ฉ๋๋ JSX ํํ๋ก ๋ผ์ฐํฐ๋ฅผ ๊ตฌ์ฑํ ์ ์๋ค.
declare function createRoutesFromElements(
children: React.ReactNode
): RouteObject[];
interface RouteObject {
caseSensitive?: boolean;
children?: RouteObject[];
element?: React.ReactNode;
index?: boolean;
path?: string;
}
Usage
const router = createBrowserRouter(
createRoutesFromElements(
<Route path='/' element={<Layout />}>
<Route index element={<HomePage />} />
<Route path='/dashbaord' element={<DashboardPage />} />
</Route>
)
);
createMemoryRouter()
Test ํ๊ฒฝ์์ createBrowserRouter ๋์ createMemoryRouter
๋ฅผ ์ฌ์ฉํ๋ค.
export declare function createMemoryRouter(routes: RouteObject[], opts?: {
basename?: string;
future?: FutureConfig;
hydrationData?: HydrationState;
initialEntries?: InitialEntry[];
initialIndex?: number;
}): RemixRouter;
initialEntries โ ์ด๊ธฐ ์ํธ๋ฆฌ ๋ชฉ๋ก ์ค์ , ์ฆ ํ
์คํธํ ํ์ด์ง์ ์ฒซ ๋ ๋๋ง ๊ฒฝ๋ก ์ค์
๋ฐฐ์ด์ธ ์ด์ ๋ ๋ธ๋ผ์ฐ์ ํ์คํ ๋ฆฌ ์คํ๊ณผ ๋์ผ, (๋ค๋ก๊ฐ๊ธฐ, ์์ผ๋ก๊ฐ๊ธฐ ํ
์คํธ๋ฅผ ํ๊ธฐ ์ํจ)
initialIndex โ ์ด๊ธฐ ์ํธ๋ฆฌ ๋ชฉ๋ก[๋ฐฐ์ด] ์ค ์ธ๋ฑ์ค๋ฅผ ํตํด ๊ฒฝ๋ก๋ฅผ ์ ํ
import { createMemoryRouter, RouterProvider } from 'react-router-dom';
import routes from '../routes';
descirbe('App', () => {
it('render correctly', () => {
const router = createMemoryRouter(routes);
render(<RouterProvider router={router} />)
)
});
ํด๋น ํจ์๋ ์ฌ์ฌ์ฉ์ฑ์ ๋ํ๊ธฐ ์ํด ํจ์๋ก ์ถ์ถํ์.
import { createMemoryRouter, RouterProvider } from 'react-router-dom';
import routes from '../routes';
export function withRoutes(initialEntries = '/') {
const router = createMemoryRouter(routes, {initialEntries: [initialEntries]});
return <RouterProvider router={router} />;
)
}
describe('App', () => {
it('render correctly', () => {
render(withRoutes());
expect(screen.getByText(/์ด๋ค์/)).toBeInTheDocument();
});
});
MemoryRouter VS createMemoryRouter()
๋ ๋ฐฉ๋ฒ ๋ชจ๋ ํ
์คํธ ํ๊ฒฝ์์ ๋ผ์ฐํ
์ ๊ตฌํํ๋๋ฐ ์ฌ์ฉ๋๋ค.
createMemoryRouter()
๋ ์ค์ ๋ก ์ฌ์ฉ๋๋ ์ ์ฒด ๋ผ์ฐํ
์ ๋ณด๋ฅผ ๊ทธ๋๋ก ๊ฐ์ ธ์์ ๊ตฌํํ๊ธฐ ๋๋ฌธ์ ์ ์ฒด์ ์ธ ๋ผ์ฐํ
์ํธ์์ฉ์ ํ
์คํธํ ๋ ์ ํฉํ ๊ฒ ๊ฐ๋ค.
๋ฐ๋ฉด MemoryRouter
๋ ๋ผ์ฐํธ๋ฅผ ์ฃผ์
๋ฐ๋ ์์ผ๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ปค์คํ
ํ๊ธฐ ์ฝ๊ณ , ์ข ๋ ์ ์ฐํ ํ
์คํธ๋ฅผ ์์ฑํ ์ ์์ด์ ํน์ ๋ผ์ฐํ
์๋๋ฆฌ์ค๋ฅผ ํ
์คํธํ ๋ ์ ํฉํ ๊ฒ ๊ฐ๋ค.