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

Next.js将页面代码抽离为组件后getServerSideProps不运行怎么办?

问题解决方法

核心原因是你违反了Next.js Pages Router的getServerSideProps使用规则,同时存在组件参数接收的语法错误,按以下步骤修复即可:

  • 第一,getServerSideProps是Next.js仅对/pages目录下页面级文件提供的特殊API,只有页面文件导出的该方法才会被Next.js自动调用,普通自定义组件中导出的getServerSideProps不会被识别执行,这是该方法日志不打印的根本原因。
  • 第二,你的React组件参数写法错误:函数组件只会接收一个props对象作为入参,你写的(listName, bans)会导致所有属性都被挂载到第一个listName参数上,bans参数永远为undefined。

修复方案1(保留服务端渲染获取数据)

把getServerSideProps放回引用BansList的页面文件中,拿到数据后通过props传递给组件:

页面文件代码(存放于/pages目录下)

import BansList from '../components/BansList'

export const getServerSideProps = async () => {
  console.log("in getServerSideProps")
  const bans = await fetch('http://localhost:3000/api/get_bans').then(res => res.json())
  return {
    props: { bans }
  }
}

const Page = ({ bans }) => {
  // 按实际需求传listName参数即可
  return <BansList listName="封禁列表" bans={bans} />
}

export default Page

抽离的BansList组件代码

// 注意入参要用对象解构写法
const BansList = ({ listName, bans }) => {
  console.log(bans) // 可正常拿到数据
  return <h1>test</h1>
}

export default BansList

修复方案2(改为客户端组件内获取数据)

如果你希望把数据获取逻辑封装在组件内部,可以改用客户端useEffect发起请求,无需使用getServerSideProps:

import { useEffect, useState } from 'react'

const BansList = ({ listName }) => {
  const [bans, setBans] = useState([])

  useEffect(() => {
    const fetchBans = async () => {
      const res = await fetch('/api/get_bans')
      const data = await res.json()
      setBans(data)
    }
    fetchBans()
  }, [])

  console.log(bans) // 可正常拿到数据
  return <h1>test</h1>
}

export default BansList

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 11:06:07