javascript - 功能性反应组件上的窗口对象问题
问题描述
我需要访问window
我的反应组件中的对象以从查询字符串中获取某些内容。这是我的组件的样子:
export function MyComponent() {
return (
<div>
Display the qs: {(window && window.location.search) || 'nothing'}
</div>
)
}
如果我运行应用程序然后访问我需要访问窗口的页面,这一切都很好,但是如果我在需要窗口的页面上启动应用程序,我会收到以下错误:
ReferenceError:未定义窗口
到目前为止,我看到的大多数解决方案都使用componentWillMount
来解决问题。所以我的问题是,如何在功能组件中解决这个问题?或者不使用生命周期方法的最佳方法是什么?
不确定这是否相关,但我也在使用 NextJS。
解决方案
请参阅Next.js 维基
Next.js 是通用的,这意味着它首先在服务器端执行代码,然后是客户端。window 对象仅存在于客户端,因此如果您绝对需要在某些 React 组件中访问它,您应该将该代码放在 componentDidMount 中。此生命周期方法将仅在客户端上执行。您可能还想检查是否没有其他可能适合您需求的通用库。
export function MyComponent() {
const isAvailable = useRef(false);
useEffect(() => {
isAvailable.current = typeof window !== "undefined" && window.location.search;
}, []);
return <div>Display the qs: {isAvailable.current || 'nothing'}</div>;
}
推荐阅读
- ios - MDCOverlayWindow 没有激活或显示任何东西
- c# - 路径不是在 sharepoint 上下载 .xls 文件的合法形式
- postgresql - 从 EC2 实例连接到 RDS 时出现问题:服务器是否在主机上运行/接受端口 5432 上的 TCP/IP 连接?
- bash - 在 bash 中,当发送 curl 请求时,有没有办法将一个很长的 url 分解到下一行?
- docker - 如何在 [1002120000, 1002129999] 范围内获取 UID:GID 以使其在 OpenShift 中运行?
- nginx - Nginx server_name 52.com - 如何使用数字域名?
- windows - 如何在 Windows cmd 中找到不属于管理员的文件?
- scala - 对象 testkit 不是包 akka 的成员
- java - 方法 sendMessageViaCloudSync 在代号一中删除
- php - 外键值的 PHP/MYSQLI insert_id - $id 变量集但在 INSERT 查询中不起作用