【问题标题】:NextJS initial state is not updating when routing to same page with different params路由到具有不同参数的同一页面时,NextJS 初始状态未更新
【发布时间】:2020-08-05 05:26:52
【问题描述】:

这个项目正在使用NextJS

我有一个 URL 看起来像这样的页面

localhost:3000/first/second

我在该页面上致电getInitialProps。数据按原样从getInitialProps 传递到组件,我正在使用这样的数据设置初始状态

const Index = ({ data }) => {
  const [state, setState] = useState(data.results)
}

现在当我将用户发送到

localhost:3000/first/third

getInitialprops 被调用。 data 是组件的一个参数,始终填充来自 getInitialProps 的最新结果,但 state 不是。它填充了其中的先前数据。当我进行客户端路由时,它不会重置。只有当我硬刷新页面时。

正如NextJS GitHub 所建议的那样,我厌倦了在 ``getInitialProps` 中添加 data.key = data.id,这总是一个不同的数字来强制状态更新,但它不起作用。

任何信息都会很有用。

感谢您的宝贵时间:)

【问题讨论】:

    标签: javascript reactjs state url-routing next.js


    【解决方案1】:

    当使用 NextJS 时,getInitialProps 在页面第一次渲染之前被调用。在随后的页面渲染(客户端路由)中,NextJS 在客户端执行它,但这意味着在页面渲染之前数据不可用。

    来自docs

    对于初始页面加载,getInitialProps 将仅在服务器上运行。当通过 next/link 组件或使用 next/router 导航到不同的路由时,getInitialProps 将在客户端上运行。

    您需要useEffect 来同步状态:

    const Index = ({ data }) => {
      const [state, setState] = useState(data.results);
    
      useEffect(() => {
        setState(data.results);
      }, [data]);
    }
    

    【讨论】:

    • 嗯..这很容易..不是吗..哈哈哈..非常感谢:)
    • 我脑子里想着 nextjs 应该只在 props 更新时渲染组件,但确实如此,我不得不使用直接 href 直到我找到它,这是一个令人惊叹的时刻。谢谢。
    猜你喜欢
    • 2020-02-20
    • 2019-09-06
    • 2023-02-03
    • 2023-03-05
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 2022-11-24
    相关资源
    最近更新 更多