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

Next.js Pages Router中如何结合getServerSideProps与React Context?

解决Next.js Pages Router中服务端数据注入全局Context的问题

核心思路是借助_app.js作为全局入口,将页面组件通过getServerSideProps获取的数据传递给全局Context Provider,实现全应用共享服务端数据。具体步骤如下:

1. 创建全局Context及Provider组件

先定义Context和对应的Provider组件,让它接收外部传入的数据作为Context的值:

// contexts/UserContext.js
import { createContext, useContext } from 'react';

const UserContext = createContext(null);

export function UserProvider({ children, user }) {
  return (
    <UserContext.Provider value={user}>
      {children}
    </UserContext.Provider>
  );
}

export function useUser() {
  const context = useContext(UserContext);
  if (!context) {
    throw new Error('useUser must be used within a UserProvider');
  }
  return context;
}

2. 在_app.js中挂载Provider

_app.js是所有页面的入口,页面组件通过getServerSideProps返回的数据会被包含在pageProps中。我们在这里将pageProps中的服务端数据注入到Context Provider:

// pages/_app.js
import { UserProvider } from '../contexts/UserContext';

export default function MyApp({ Component, pageProps }) {
  const { user } = pageProps;

  return (
    <UserProvider user={user}>
      <Component {...pageProps} />
    </UserProvider>
  );
}

3. 在页面组件中通过getServerSideProps获取数据

在需要获取服务端数据的页面组件中,编写getServerSideProps逻辑,将获取到的用户数据作为props返回:

// pages/index.js
export default function HomePage({ user }) {
  return <div>当前用户:{user.name}</div>;
}

export async function getServerSideProps(context) {
  // 模拟从服务端接口获取用户信息,可根据实际业务调整
  const res = await fetch('https://api.example.com/user', {
    headers: {
      Cookie: context.req.headers.cookie || '' // 传递Cookie获取当前登录用户
    }
  });
  const user = await res.json();

  return {
    props: { user } // 该数据会传入_app的pageProps
  };
}

4. 在任意子组件中消费Context

应用内的任何组件都可以通过自定义的useUser Hook获取全局用户数据:

// components/Navbar.js
import { useUser } from '../contexts/UserContext';

export default function Navbar() {
  const user = useUser();
  return <nav>欢迎,{user.name}</nav>;
}

优化:避免重复编写getServerSideProps

如果多个页面都需要获取用户数据,可以封装公共函数复用逻辑:

// utils/withUser.js
export async function getUserFromServer(context) {
  const res = await fetch('https://api.example.com/user', {
    headers: {
      Cookie: context.req.headers.cookie || ''
    }
  });
  return await res.json();
}

// 页面组件中直接调用
export async function getServerSideProps(context) {
  const user = await getUserFromServer(context);
  return { props: { user } };
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 07:28:28