如何解决 Next.js 开启 useFileSystemPublicRoutes 后的页面刷新问题

阅读时长 3 分钟读完

最近在开发一个基于 Next.js 的前端项目时,遇到了一个问题:在开启了 useFileSystemPublicRoutes 后,页面在刷新时会出现 404 错误页面。经过一番研究和实践,我找到了解决办法,现在分享给大家。

问题分析

首先,我们需要了解 useFileSystemPublicRoutes 的作用。该选项开启后,Next.js 会按照文件系统路径生成路由。例如,你的页面文件路径为 pages/about.js,那么访问 /about 就会加载该页面。这样做的好处是可以自动生成路由,不需要手动配置路由文件,同时也能够避免路由名称和路径不一致的问题。

但是,当开启了该选项后,在页面刷新时就会出现 404 错误页面。这是因为 Next.js 默认使用了服务端渲染,而服务端渲染需要先执行后台逻辑生成 HTML,再返回给浏览器显示。但是,当在浏览器中刷新页面时,会直接向服务器请求该页面的 HTML,而服务器并没有这个页面的 HTML,因此会返回 404 错误页面。

解决办法

1. 使用 Link 组件

我们可以使用 Link 组件来解决这个问题。Link 组件会将页面渲染到客户端,而不是服务器。这样,当在客户端刷新页面时,就能够正确地加载页面。

-- -------------------- ---- -------
------ ---- ---- -----------

------ ------- -------- ------- -
  ------ -
    -----
      --------- ---------
      ------- -- --- ----- --------
      ----- ---------
        ----- ---- -- --------
      -------
    ------
  -
-
展开代码

2. 使用 next/router

如果你需要在页面刷新时执行一些后台逻辑,例如刷新数据、重置状态等,你可以使用 next/router 模块。该模块提供了 useRouterwithRouter 两个 API,可以方便地获取当前路由对象和路由参数。

-- -------------------- ---- -------
------ - --------- - ---- -------------
------ - --------- - ---- -------

------ ------- -------- ------- -
  ----- ------ - -----------

  ------------ -- -
    -- --------------
    ----------------- -----------
  -- ---

  ------ -
    -----
      --------- ---------
      ------- -- --- ----- --------
      ------- ----------- -- ----------------- -------------
    ------
  -
-
展开代码

需要注意的是,使用 next/router 时,如果你在 getInitialProps 方法中获取数据,该方法只会在服务器端执行。为了确保客户端和服务器端获取到的数据一致,你需要在 useEffect 中再次执行该方法。

总结

以上就是解决 Next.js 开启 useFileSystemPublicRoutes 后的页面刷新问题的两种方法。使用 Link 组件可以快速解决问题,而使用 next/router 则更灵活,可以执行一些后台逻辑。需要根据具体情况选择方法。希望本文能够帮助到大家。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6656ffb6d3423812e4c19eb0

纠错
反馈

纠错反馈