index.js
import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
import "./index.css";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
);
App.js
import { createBrowserRouter, RouterProvider } from "react-router-dom";
import Videos from "./pages/Videos";
import NotFound from "./pages/NotFound";
import Root from "./pages/Root";
import Home from "./pages/Home";
import VideoDetail from "./pages/VideoDetail";
import "./App.css";
const router = createBrowserRouter([
{
path: "/",
element: <Root />,
errorElement: <NotFound />,
{}
children: [
{ index: true, element: <Home /> },
{ path: "/videos", element: <Videos /> },
{ path: "/videos/:videoId", element: <VideoDetail /> },
],
},
]);
function App() {
return <RouterProvider router={router} />;
}
export default App;
Root.jsx
import { Outlet } from "react-router-dom";
import Navbar from "../components/Navbar";
export default function Root() {
return (
<div>
<Navbar />
<Outlet />
</div>
);
}
NotFound.jsx
export default function NotFound() {
return <p>Not FOUND</p>;
}
Home.jsx
export default function Home() {
return <p>HOME</p>;
}
Videos.jsx
import { useState } from "react";
import { useNavigate } from "react-router-dom";
export default function Videos() {
const [text, setText] = useState("");
const navigate = useNavigate();
const handleChange = (e) => {
setText(e.target.value);
};
const handleSubmit = (e) => {
e.preventDefault();
setText("");
navigate(`/videos/${text}`);
};
return (
<div>
<form onSubmit={handleSubmit}>
<input type="text" name="" id="" value={text} onChange={handleChange} />
<button>submit</button>
</form>
</div>
);
}
VideoDetail.jsx
import { useParams } from "react-router-dom";
export default function VideoDetail() {
const { videoId } = useParams();
return <p>{videoId}</p>;
}
View
- 경로:
'/asdf'