【发布时间】: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 });
});
但是,这似乎不起作用,因为有时 tasksData 是 undefined,大概是因为 Next.js 尚未使其在页面装载上可用。
我听说另一个suggestion 是获取数据并将其作为pageProps 传递给_app.tsx 中的上下文提供程序。我相信这意味着在_app.tsx 中使用getInitialProps(),以便我的提供者的初始状态由我的API 填充。但是,这会禁用静态优化和其他有用的功能。
谁能帮助我提供一些伪代码、文档或如何将 getServerSideProps 与 React Context API 结合使用的示例?
【问题讨论】:
-
第一次获取数据时为什么不设置任务?
-
@SILENT 我无法做到这一点,因为 React Hooks 不能在 Next.js 中使用服务器端
getServerSideProps().如果可以,那绝对是理想的解决方案! -
您可以通过
getServerSideProps获取数据并将其传递到相应的页面。如果页面将其检测为undefined,则该页面应获取它。但是,您提到了待办事项。 Todos 是多租户的(即特定于用户/组织的)。你不应该加载这种类型的数据服务器端。
标签: reactjs next.js react-context