在 next.js 中触发客户端重新加载

Jim*_*Jin 14 node.js next.js

设想

索引页使用“getInitialProps”加载数据。然后我们创建一个可以创建新数据的对话框。创建新数据后,应重新加载当前页面。

问题

我们Router.replace('/')用来重新加载页面。但它会触发服务器端渲染。

我们需要的是客户端重新加载。应该在浏览器中调用“getInitialProps”函数。那么,如何进行客户端重载呢?

Ami*_*mit 23

更好的选择是使用router.replace(router.asPath)

替换不会创建新的历史记录项,因此“后退”按钮按预期工作

本文解释了详细信息 https://www.joshwcomeau.com/nextjs/refreshing-server-side-props/

import { useRouter } from "next/navigation";

export default function Component(){
  const router = useRouter();

  router.replace(router.asPath);
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。虽然我认为 `router.asPath` 应该是 `router.replace()` 的默认参数。 (7认同)
  • 只有我还是 aspath 不存在? (3认同)

Abd*_*ama 20

自 NextJs 13 发布以来,新的路由器对象具有该refresh()方法,该方法允许您仅在客户端刷新(重新获取)数据,而无需重新加载整个页面。

它可以像下面这样使用:

import { useRouter } from "next/navigation";

export default function Component(){
  const router = useRouter();

  //this will reload the page without doing SSR
  router.refresh();
}

Run Code Online (Sandbox Code Playgroud)

请记住,这是 NextJs 13 的功能,目前处于测试阶段。

在这里查看测试版文档

感谢 fireship 展示了该功能
https://www.youtube.com/watch?v=__mSgDEOyv8

  • Next 13路由器不再位于“next/router”模块下,而是位于“next/navigation”模块下。我建议您稍微更改一下代码以避免误解和错误。更多信息:https://beta.nextjs.org/docs/routing/linking-and-navigating#userouter-hook (6认同)

Saj*_*eri 13

假设用户在

http://www.example.com/profile

用户已编辑个人资料,并且由于某种原因,您需要重新加载同一页面。

如果您的情况与此类似,您可以使用Router.reload();

请记住,您必须像这样导入 Router 对象import Router from "next/router";

欲了解更多信息:https://nextjs.org/docs/api-reference/next/router#routerreload


小智 9

没有看到我真正想要的答案,

这对我有用:

import Router from 'next/router'

Router.reload(window.location.pathname);
Run Code Online (Sandbox Code Playgroud)

  • Router.reload() 等于 window.location.reload(),您不应该向其传递地址。 (3认同)

小智 7

window.location.reload()如果您想在 nextjs 版本 13 中在客户端刷新,请使用。

  • 使用 Next.js 14,这是我能够执行整页重新加载的唯一方法。 (2认同)