Nextjs 在重新加载页面时获取数据

Posted

技术标签:

【中文标题】Nextjs 在重新加载页面时获取数据【英文标题】:Nextjs Fetch data when reloading the page 【发布时间】:2020-02-10 12:12:05 【问题描述】:

在 React 中,我们在重新加载页面时使用 useEffect 获取数据:

useEffect(() => 
  let ignore = false
  const fetchingData = async () => 
    const res = await fetch(<your_path>)
    const data = await res.json()
    if (!ignore) setData(data)
  ; 
  fetchingData()
  return () =>  ignore = true 
, [])

但是如何在 Next.js 中做到这一点?当页面重新加载时,Fetch 不会在 getInitialProps 中触发。

【问题讨论】:

你的问题就是我的答案,谢谢。 @FatemehQasemkhani,我的问题是基于我在 next.js 中的无能,后来我意识到 getInitialProps 中 axios 请求的问题。很高兴为您提供帮助!:) 【参考方案1】:

使用 axios 或 isomorphic-unfetch。它们可以在客户端和服务器环境中工作。 Node.js 环境中不存在 Fetch API。它。如果您仍想在客户端代码中使用 Fetch API,则应使用 isomorphic-unfetch。当您在浏览器中时,它使用 unfetch polyfill。如果您的代码在 Node.js 中运行,它会切换到 node-fetch。

import "axios" from "axios"

static async getInitialProps()
    const res=await axios.get('url')//
    const data=res.data
    return data

更新

除了客户端的 fetch() 之外,Next.js 还在 Node.js 环境中填充了 fetch()。您可以在服务器代码(例如 getStaticProps/getServerSideProps)中使用 fetch(),而无需使用 polyfill,例如 isomorphic-unfetch 或 node-fetch。

https://nextjs.org/docs/basic-features/supported-browsers-features

【讨论】:

我不确定更新何时到来,但在撰写此评论时,Next 有一个用于 fetch 的 polyfill,可在客户端和服务器上运行。 @dkapur17 你是对的。我需要更新答案【参考方案2】:

Next.js 中,您通常使用getInitialProps 中的HTTP 请求加载数据,然后您可以将它们用作道具:

const App = props => (
  <Layout>
  props.data
    ...
  </Layout>
);

App.getInitialProps = async function() 
  const res = await fetch(<your_path>)
  const data = await res.json()
  return 
   data
  
;

export default App;

【讨论】:

看起来它只适用于路线更改,但不适用于页面刷新 刷新页面时,仍应调用 getInitialProps。您的问题的目的是找到您应该在何处/何时进行 fetch 调用并更新您的道具。我给了你标准答案:使用 getInitialProps 但是如果你需要在一个组件中而不是在页面中使用 componentDidMount

以上是关于Nextjs 在重新加载页面时获取数据的主要内容,如果未能解决你的问题,请参考以下文章

react-query 在 nextjs 中重新获取页面更改的数据

重新加载/刷新操作时出现 Nextjs 404 错误

如何开始使用 nextjs 获取每个应用程序的数据

NextJS + Heroku:env变量未加载

如何在不重新加载页面的情况下将服务器端重定向到其他页面并仍将 URL 保留在 Nextjs 应用程序中?

删除突变后不重新获取查询(Apollo Graphql & Nextjs)