Next.js/TypeScript中返回Props的类型及Props为undefined的问题
关于Next.js + Sanity Props undefined的问题解答
1. 如何确定返回Props的类型?
- TypeScript显式定义:如果使用TypeScript,可直接定义对应的数据接口来约束Props类型,示例:
在页面组件和数据获取函数中使用该类型,就能明确Props的结构。interface Pet { _id: string; _type: "pet"; name: string; // 补充Sanity中pet文档的其他字段 } interface PageProps { pets: Pet[]; } - 打印数据看实际结构:在
fetchData函数内添加console.log(pets),运行后查看控制台输出的pets字段细节,直接确认Props的类型和内容。 - 对照Sanity Studio文档结构:打开Sanity Studio查看
pet类型的文档定义,里面的字段名、字段类型就是Props中pets的对应结构。
2. 为何Props会是undefined?
- 数据获取函数命名不符合Next.js规则:Next.js仅会自动识别
getStaticProps(静态生成场景)或getServerSideProps(服务端渲染场景)这两个固定命名的函数,将返回的props传递给页面组件。你当前使用自定义的fetchData,若未在组件中手动调用并传递数据,组件自然拿不到props,把函数名改成上述两个固定名称即可。 - Sanity Client配置错误:检查你的Sanity客户端是否正确配置了
projectId、dataset、apiVersion等核心参数,配置错误会导致client.fetch返回空值或undefined,进而让props中的pets无数据。可在fetchData中打印pets确认是否有数据返回。 - 组件未正确接收Props:页面组件需通过参数接收props,示例:
若未声明该参数或获取方式错误,就会拿到undefined。export default function PetsPage({ pets }) { return <div>{pets?.map(pet => <p key={pet._id}>{pet.name}</p>)}</div> } - 未处理异步请求错误:
fetchData中没有错误捕获逻辑,若Sanity API请求失败,会导致pets为undefined。可添加try/catch排查问题:export const getStaticProps = async () => { try { const pets = await client.fetch(`*[_type == "pet"]`); console.log('获取到的宠物数据:', pets); return { props: { pets } }; } catch (err) { console.error('数据获取失败:', err); return { props: { pets: [] } }; } };
内容的提问来源于stack exchange,提问作者user17610593
相关产品推荐
相关产品推荐

