我知道window
在Node.js中不存在,但我在客户端和服务器上都使用了React和相同的代码。任何方法我用它来检查,如果存在window
网我:错误Node.js中的`窗口未定义'
Uncaught ReferenceError: window is not defined
,我不能做window && window.scroll(0, 0)
如何回避的事实得到什么?
我知道window
在Node.js中不存在,但我在客户端和服务器上都使用了React和相同的代码。任何方法我用它来检查,如果存在window
网我:错误Node.js中的`窗口未定义'
Uncaught ReferenceError: window is not defined
,我不能做window && window.scroll(0, 0)
如何回避的事实得到什么?
Sawtaytoes已经得到它。我会运行任何代码你componentDidMount(有),并围绕着它:
if (typeof(window) !== 'undefined') {
// code here
}
如果仍没有被时间所创建的窗口对象发生反应呈现组件,你总是可以运行你的代码的一小部分第二次在组件渲染后(并且窗口对象肯定是在那时创建的),所以用户无法区分这种差异。
if (typeof(window) !== 'undefined') {
var timer = setTimeout(function() {
// code here
}, 200);
}
我会建议不要在setTimeout中放置状态。
这将解决这一问题,为您提供:
typeof(window) === 'undefined'
即使没有定义的变量,你可以使用typeof()
来检查它。
这种代码甚至不应该在服务器上运行,它应该在一些componentDidMount
(see doc)钩子里面,它只调用客户端。这是因为滚动窗口服务器端没有意义。但是,如果您必须在真正运行客户端和服务器的部分代码中引用窗口,请改用global
(代表全局范围 - 例如客户端上的window
)。
在一种情况下,我需要做的'新的音频()',我需要检查是否'window'和'window.Audio'存在。不幸的是,如果我在componentDidMount()中执行它,它会出现在我放入子模块的道具中时未定义,即使我使用onClick。 – Sawtaytoes
<Router onUpdate={() => window.scrollTo(0, 0)} history= {browserHistory}>
,如果您需要在上面打开新的一页阵营JS应用程序,使用router.js
只需要删除一段代码就没有什么帮助。请添加解释。 – lexicore
虽然此代码可能回答问题,但提供有关如何解决问题和/或解决问题原因的其他上下文会提高答案的长期价值。 – Badacadabra
这个代码这是年纪大一点的,但对于ES6风格反应组件类,你可以使用这个类装饰我创建了一个解决方案,用于定义仅应在客户端呈现的组件。我喜欢它比任何地方的窗口检查更好。
import { clientOnly } from 'client-component';
@clientOnly
class ComponentThatAccessesWindowThatIsNotSafeForServerRendering extends Component {
render() {
const currentLocation = window.location;
return (
<div>{currentLocation}</div>
)
};
}
感谢您的提示!在'componentDidMount'中放置'window.'解决了这个问题:) – protoEvangelion