我知道window
Node.js 中不存在,但我在客户端和服务器上使用 React 和相同的代码。我用来检查是否window
存在的任何方法都会让我感到:
未捕获的 ReferenceError:未定义窗口
我如何解决我做不到的事实window && window.scroll(0, 0)
?
我知道window
Node.js 中不存在,但我在客户端和服务器上使用 React 和相同的代码。我用来检查是否window
存在的任何方法都会让我感到:
未捕获的 ReferenceError:未定义窗口
我如何解决我做不到的事实window && window.scroll(0, 0)
?
索泰托斯得到了它。我会运行你在 componentDidMount() 中的任何代码,并用以下代码包围它:
if (typeof(window) !== 'undefined') {
// code here
}
如果在 React 渲染组件时仍未创建 window 对象,您始终可以在组件渲染后的几分之一秒内运行您的代码(并且此时 window 对象肯定已创建),因此用户无法分辨其中的不同之处。
if (typeof(window) !== 'undefined') {
var timer = setTimeout(function() {
// code here
}, 200);
}
我建议不要将状态放在 setTimeout 中。
这将为您解决这个问题:
typeof(window) === 'undefined'
即使未定义变量,您也可以使用typeof()
它来检查它。
这种代码甚至不应该在服务器上运行,它应该在一些componentDidMount
(参见 doc)钩子内,它只是调用客户端。这是因为滚动窗口服务器端没有意义。
但是,如果您必须在真正同时运行客户端和服务器的代码的一部分中引用 window,请global
改用(它代表全局范围 - 例如window
在客户端上)。
这有点旧,但是对于 ES6 样式的 React 组件类,您可以使用我创建的这个类装饰器,作为定义仅应在客户端呈现的组件的解决方案。我更喜欢它而不是随处可见的窗口检查。
import { clientOnly } from 'client-component';
@clientOnly
class ComponentThatAccessesWindowThatIsNotSafeForServerRendering extends Component {
render() {
const currentLocation = window.location;
return (
<div>{currentLocation}</div>
)
};
}