我知道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