You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js动态路由中如何根据event_no变量获取指定JSON对象

解决Next.js动态路由中根据event_no匹配JSON对象的问题

我明白你的问题所在了——你现在在getStaticProps里把整个JSON数组都返回给组件了,但其实你需要先根据event_no筛选出对应的单个对象才行,不然组件里的event是一个数组,直接访问event?.event_name自然拿不到内容。

问题核心

从你给出的JSON结构来看,data是一个包含多个event对象的数组(开头的0 { ... }就是数组索引的标志)。你需要先从这个数组里找到与event_no匹配的那一项,再把它传给组件。另外要注意:context.params.event_no是字符串类型(路由参数默认都是字符串),而你的JSON里event_no是数字,直接比较会匹配失败,得先转成数字。

修改后的getStaticProps代码

export const getStaticProps = async (context) => {
  // 将路由参数转成数字,和JSON里的event_no类型匹配
  const event_no = Number(context.params.event_no); 
  const res = await fetch('URL_TO_JSON');
  const data = await res.json();

  // 从数组中找到匹配event_no的对象
  const matchedEvent = data.find(item => item.event_no === event_no);

  // 如果没找到对应的event,返回404页面
  if (!matchedEvent) {
    return {
      notFound: true,
    };
  }

  return {
    props: { event: matchedEvent },
  };
};

组件部分的使用

现在传给组件的event就是单个匹配的对象了,你之前写的组件代码完全可以正常工作——保留?.可选链写法还能增加代码的安全性,避免对象不存在时报错:

export default function Details({ event }) {
  console.log(event); // 现在这里会输出单个匹配的event对象
  return (
    <Box padding='lg'>
      <h1>{event?.event_name}</h1>
      <Card padding='md'>
        <Stack gap='sm'>
          <Text>{event?.event_notes}</Text>
          <Text>
            {event?.sales_period?.start_time} - {event?.sales_period?.end_time}
          </Text>
          <a className='buy-btn btn basm basm_select main-buy-btn solid' data-event_no={event?.event_no} >
            Køb
          </a>
        </Stack>
      </Card>
    </Box>
  );
}

额外优化建议

如果你的JSON数据量很大,每次都拉取整个数组再前端筛选会有点低效。如果后端支持的话,建议直接在fetch的URL里带上event_no参数(比如URL_TO_JSON?event_no=${event_no}),让后端直接返回单个匹配的对象,这样能提升页面加载性能。

内容的提问来源于stack exchange,提问作者Rvervuurt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 23:32:45