2016-02-12 54 views
12

我知道window在Node.js中不存在,但我在客户端和服务器上都使用了React和相同的代码。任何方法我用它来检查,如果存在window网我:错误Node.js中的`窗口未定义'

Uncaught ReferenceError: window is not defined

,我不能做window && window.scroll(0, 0)如何回避的事实得到什么?

回答

15

Sawtaytoes已经得到它。我会运行任何代码你componentDidMount(有),并围绕着它:

if (typeof(window) !== 'undefined') { 
    // code here 
} 

如果仍没有被时间所创建的窗口对象发生反应呈现组件,你总是可以运行你的代码的一小部分第二次在组件渲染后(并且窗口对象肯定是在那时创建的),所以用户无法区分这种差异。

if (typeof(window) !== 'undefined') { 
    var timer = setTimeout(function() { 
     // code here 
    }, 200); 
} 

我会建议不要在setTimeout中放置状态。

+0

感谢您的提示!在'componentDidMount'中放置'window.'解决了这个问题:) – protoEvangelion

4

这将解决这一问题,为您提供:

typeof(window) === 'undefined' 

即使没有定义的变量,你可以使用typeof()来检查它。

1

这种代码甚至不应该在服务器上运行,它应该在一些componentDidMountsee doc)钩子里面,它只调用客户端。这是因为滚动窗口服务器端没有意义。但是,如果您必须在真正运行客户端和服务器的部分代码中引用窗口,请改用global(代表全局范围 - 例如客户端上的window)。

+0

在一种情况下,我需要做的'新的音频()',我需要检查是否'window'和'window.Audio'存在。不幸的是,如果我在componentDidMount()中执行它,它会出现在我放入子模块的道具中时未定义,即使我使用onClick。 – Sawtaytoes

0
<Router onUpdate={() => window.scrollTo(0, 0)} history= {browserHistory}> 

,如果您需要在上面打开新的一页阵营JS应用程序,使用router.js

+1

只需要删除一段代码就没有什么帮助。请添加解释。 – lexicore

+0

虽然此代码可能回答问题,但提供有关如何解决问题和/或解决问题原因的其他上下文会提高答案的长期价值。 – Badacadabra

0

这个代码这是年纪大一点的,但对于ES6风格反应组件类,你可以使用这个类装饰我创建了一个解决方案,用于定义仅应在客户端呈现的组件。我喜欢它比任何地方的窗口检查更好。

import { clientOnly } from 'client-component'; 

@clientOnly 
class ComponentThatAccessesWindowThatIsNotSafeForServerRendering extends Component { 
    render() { 
     const currentLocation = window.location; 
     return (
      <div>{currentLocation}</div> 
     ) 
    }; 
} 

https://github.com/peterlazzarino/client-component

相关问题