在 Next.js 中,如何使用来自 getServerSideProps 的数据更新 React Context 状态?

Posted

技术标签:

【中文标题】在 Next.js 中,如何使用来自 getServerSideProps 的数据更新 React Context 状态?【英文标题】:In Next.js, how can I update React Context state with data from getServerSideProps? 【发布时间】:2021-12-31 02:03:40 【问题描述】:

我在学习如何将数据正确加载到我的 todo 应用中的状态时遇到了很多麻烦。

我有一个 next.js 页面组件 pages/index.tsx,我通过 getServerSideProps 从我的 API 加载数据并将其作为名为 tasksData 的页面道具返回。

tasksData 被正确返回,我可以通过 prop 解构在我的页面组件中访问它们:const Home = ( tasksData : Home) =>

我在 _app.tsx 中还有一个名为 BoardProvider 的 React 上下文提供程序。这为我的任务板存储状态,并使用 React Context API 中的useReducer() 来更新上下文消费者中的此状态,例如pages/index.tsx

我面临的挑战是如何使我的 UI 的“真实来源”成为存储在我的上下文提供程序中的状态(例如,const tasks , dispatch = useBoard();,而不是从我的 API 返回的页面页面道具(例如tasksData 道具)。

我考虑的一种方法是简单地将数据加载到 getServerSideProps 中,然后通过 useEffect 钩子中的调度操作设置状态:

useEffect(() => 
  // On first render only, set the Context Provider state with data from my page props.
  dispatch( type: TaskAction.SET_TASKS, payload: tasksData );
);

但是,这似乎不起作用,因为有时 tasksDataundefined,大概是因为 Next.js 尚未使其在页面装载上可用。

我听说另一个suggestion 是获取数据并将其作为pageProps 传递给_app.tsx 中的上下文提供程序。我相信这意味着在_app.tsx 中使用getInitialProps(),以便我的提供者的初始状态由我的API 填充。但是,这会禁用静态优化和其他有用的功能。

谁能帮助我提供一些伪代码、文档或如何将 getServerSideProps 与 React Context API 结合使用的示例?

【问题讨论】:

第一次获取数据时为什么不设置任务? @SILENT 我无法做到这一点,因为 React Hooks 不能在 Next.js 中使用服务器端 getServerSideProps(). 如果可以,那绝对是理想的解决方案! 您可以通过getServerSideProps获取数据并将其传递到相应的页面。如果页面将其检测为undefined,则该页面应获取它。但是,您提到了待办事项。 Todos 是多租户的(即特定于用户/组织的)。你不应该加载这种类型的数据服务器端。 【参考方案1】:

几点:

    getServerSideProps 应该在页面被渲染之前被调用。所以理论上你的tasksDataundefined 是一个错误!您不能让服务器数据不可用,除非您真的打算一开始就发生这种情况。

    假设getServerSideProps 总是返回正确的数据,但您想使用自己的数据来覆盖它。在你的上下文中,你可以有这个逻辑。

  const Home = ( tasksData ) => 
    const value =  tasksData: 
      // let me override it
    
    return (
      <Context.Provider value=value>
      ...
      <Context.Provider>
    )
  

如果你有一个页面下提供的context,那么上面的代码就是你所需要的。但是,如果您的上下文是在根(页面的父级)中提供的,您仍然可以添加上述代码以重新提供具有覆盖值的相同上下文。因为这就是 context 的设计方式,请阅读 https://javascript.plainenglish.io/react-context-is-a-global-variable-b4b049812028 了解更多信息。

【讨论】:

以上是关于在 Next.js 中,如何使用来自 getServerSideProps 的数据更新 React Context 状态?的主要内容,如果未能解决你的问题,请参考以下文章

如何在类组件中使用 next.js 中的“useRouter()”?

如何使用 Next.js 在组件级别导入 SCSS

如何将 favicon 添加到 Next.js 静态站点?

如何在 Next.js 中实现身份验证

Next.js - 如何将 id 从查询传递到 getInitialProps 函数

如何在 Next 应用中缓存动态图像?