面试题答案
一键面试实现思路
- 列表页传递参数:在列表页中,使用
Link
组件并结合as
和href
属性传递category
和productId
参数。href
用于指定实际的路由路径,as
用于指定显示在浏览器地址栏中的路径。 - 动态路由页面接收参数:在
pages/product/[category]/[productId].js
页面中,通过getStaticProps
或getServerSideProps
函数的上下文对象接收参数。 - 参数校验:对接收的
productId
参数进行类型和格式校验,确保其为数字类型。
主要代码
列表页代码
import Link from 'next/link';
const ProductList = () => {
const products = [
{ category: 'electronics', productId: 1 },
{ category: 'clothing', productId: 2 }
];
return (
<div>
{products.map(product => (
<Link
href={`/product/${product.category}/${productId}`}
as={`/product/${product.category}/${productId}`}
key={product.productId}
>
<a>{product.category}: {product.productId}</a>
</Link>
))}
</div>
);
};
export default ProductList;
动态路由页面代码
import { useEffect } from 'react';
const ProductPage = ({ category, productId }) => {
useEffect(() => {
const validProductId = typeof productId === 'number' && !isNaN(productId);
if (!validProductId) {
console.error('Invalid productId');
}
}, [productId]);
return (
<div>
<p>Category: {category}</p>
<p>Product ID: {productId}</p>
</div>
);
};
export const getStaticProps = async ({ params }) => {
const { category, productId } = params;
return {
props: {
category,
productId: parseInt(productId, 10)
},
revalidate: 60 // 可选,用于增量静态再生
};
};
export const getStaticPaths = async () => {
// 假设从API获取所有产品数据
const products = [
{ category: 'electronics', productId: 1 },
{ category: 'clothing', productId: 2 }
];
const paths = products.map(product => ({
params: { category: product.category, productId: product.productId.toString() }
}));
return { paths, fallback: false };
};
export default ProductPage;
在上述代码中:
- 列表页通过
Link
组件传递参数。 - 动态路由页面在
getStaticProps
函数中接收参数,并转换productId
为数字类型。 - 在组件内部通过
useEffect
对productId
进行类型和格式校验。