reactjs - Gatsby 中的 useLocation 钩子和服务器端渲染错误
问题描述
在我的一个页面中,我想page
从路径中获取数字参数并使用useLocation
从@reach/router
.
import { useLocation } from '@reach/router';
路径如下所示:
http://localhost:4000/joboffers/?page=7
我从路径中获取页码,如下所示:
const pageParam = Number(useLocation().search?.split('=')[1]);
好吧,如果我console.log
是pageParam
变量,在浏览器的控制台中我会得到正确的页码,但是如果我在 Visual Studio Code 中检查终端,相同变量的值是NaN
并且 Gatsby 会抛出以下错误:
Gatsby 中的 React 组件必须在浏览器和 Node.js 环境中成功呈现。当我们尝试在 Node.js 中呈现您的页面组件时,它出错了。
有谁知道为什么会这样?如果我跳过 SSR,一切正常!
解决方案
好吧,你完全发现了这个问题。在 SSR(服务器端渲染)和其他全局window
对象尚未定义(出于显而易见的原因,您在服务器中,而不是在客户端中),因此对该变量的任何引用都将失败。
解决方案(许多可能性之一)很简单:
let pageParam;
if (typeof window !== "undefined") {
pageParam = Number(useLocation().search?.split('=')[1]);
} else {
pageParam = 0;
}
这只发生在gatsby build
因为gatsby develop
命令直接在客户端运行项目期间(总结了很多)。
推荐阅读
- bash - 如何在用户输入的循环中运行 f(x)
- django - 同一视图中的条件执行
- java - SpringBoot:如何将蛇案例转换为骆驼案例
- laravel - Laravel Vue.js 在 ./resources/js/app.js 中构建错误
- netcdf - 如何在 NCO 中按经度裁剪 NetCDF 文件
- javascript - 使用 d3.js 将贝塞尔路径附加到当前 svg
- sqlite - 从 sqlite 数据库读取日期时间的转换器错误
- node.js - 在 express/nestjs 中跨域设置 cookie(Cloud 上的后端 / Localhost 上的 NextJS)
- mariadb - Windows 10 上 MariaDB 中的查询日志记录
- docker - 如何在 Google Cloud Build 中为 Kaniko 使用非执行入口点(启用构建参数定义)