😸 學會基本的使用路由之後,這次是動態路由!
export const data = [
{ id: 1, name: "蝦蝦", content: "可口美味" },
{ id: 2, name: "好蝦", content: "鬧事" },
{ id: 3, name: "杯具蝦", content: "QQQ" }
];
<BrowserRouter>
<nav>
<ul>
<li>
<Link to="/">首頁</Link>
</li>
<li>
<Link to="/productList">產品列表</Link>
</li>
</ul>
</nav>
<Routes>
<Route path="/" element={<Home />} />
<Route path="productList" element={<ProductList />}>
<Route path="products" element={<Products />} />
</Route>
<Route path="*" element={<Navigate to="/" />} />
</Routes>
</BrowserRouter>
map()
方法產生連結清單,每一筆資料都會綁定一個 keyfunction ProductList() {
return (
<div>
<h1>產品內容</h1>
<ul>
{data.map((product) => (
<li key={product.id}>
<Link to="products">{product.name}</Link>
</li>
))}
</ul>
<Outlet />
</div>
);
}
function Products() {
return <div>這是暫時的頁面喔</div>;
}
productList/produts/1
function ProductList() {
return (
<div>
<h1>產品內容</h1>
<ul>
{data.map((product) => (
<li key={product.id}>
<Link to={`products/${product.id}`}>{product.name}</Link>
</li>
))}
</ul>
<Outlet />
</div>
);
}
URL 中傳回與
<Route path>
相符的動態參數的物件,其中子路由會繼承父路由的所有參數。
:productId
<Route path="productList" element={<ProductList />}>
<Route path="products/:productId" element={<Products />} />
</Route>
function Products() {
// 使用 useParams 取得 ID
const { productId } = useParams();
// 依據 ID 取得 產品
const product = data.find((item) => item.id === parseInt(productId, 10));
console.log(product);
if (!product) {
return <div>找不到產品</div>;
}
return (
<div>
<h2>產品名稱:{product.name}</h2>
<p>{product.content}</p>
</div>
);
}
[img]https://i.imgur.com/Le3GH3K.gif[/img]
開始複雜了,下個任務見!