質問するログイン新規登録
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

2回答

1171閲覧

document is not defined, window is not defined, React.useEffectが使えない

reactq

総合スコア51

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2022/03/04 15:06

編集2022/03/05 09:40

0

0

Reactで作られたプロダクト内で、特定のDOMの高さを取得しようとしています。
やりたいこととしては、

jsx

1const hoge = document.querySelector('#hoge'); 2const height = hoge.clientHeight;

のようなシンプルなものです。
ただ、

  • document.querySelector('#hoge');をしようとするとdocument is not definedと怒られる
  • window.hogehogeのようなことをしようとするとwindow is not definedと怒られる
  • React.useEffect内にconsoleを仕込んでも表示されない

と言った形になっています

jsx

1import * as React from 'react'; 2 3function Hoge() { 4 const hoge = document.querySelector('#hoge'); 5 // -> document is not defined 6 7 const hoge2 = window.dataLayer; 8 // -> window is not defined 9 10 React.useEffect(() => { 11 console.log('hogehoge'); 12 // -> 表示されない 13 }); 14 15 return ( 16 <> 17 <div id="hoge">hoge</div> 18 </> 19 ); 20};

if (typeof document !== 'undefined')if (typeof window === 'object')のような分岐をさせてみてもelseの方に入ってしまい引っかからず、documentやwindowが使えません

このような場合、どうしたら良いのでしょうか、、? 🙇‍♀️

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2022/03/04 22:45

React で document.querySelector する時点で何かが間違ってる気が…。
maisumakun

2022/03/05 00:33

> document is not definedと怒られる 「何が」出したエラーメッセージですか?
reactq

2022/03/05 04:17

> React で document.querySelector する時点で何かが間違ってる気が 具体的にどう言うところが間違っているのでしょうか?🙇‍♀️ また、Reactで特定のDOMの高さを取得しようとした場合、document.querySelectorする以外でどのように取得するのでしょうか?🙇‍♀️ > 「何が」出したエラーメッセージですか? terminalに出たエラーメッセージです🙇‍♀️
maisumakun

2022/03/05 04:55

> terminalに出たエラーメッセージです 周辺も含めてご提示いただけないでしょうか。
reactq

2022/03/05 06:59

> 周辺も含めてご提示いただけないでしょうか。 例えば上記のHoge functionの中で`const hoge = document.querySelector('#hoge');`のように呼び出した場合、以下のようなエラーが発生します🙇‍♀️ ``` ErrorHandler: ReferenceError: document is not defined at Hoge (/Users/hoge/hoge/dist/server.js:4157:16) at processChild (/Users/hoge/hoge/node_modules/react-dom/cjs/react-dom-server.node.development.js:3043:14) at resolve (/Users/hoge/hoge/node_modules/react-dom/cjs/react-dom-server.node.development.js:2960:5) at ReactDOMServerRenderer.render (/Users/hoge/hoge/node_modules/react-dom/cjs/react-dom-server.node.development.js:3435:22) at ReactDOMServerRenderer.read (/Users/hoge/hoge/node_modules/react-dom/cjs/react-dom-server.node.development.js:3373:29) at renderToString (/Users/hoge/hoge/node_modules/react-dom/cjs/react-dom-server.node.development.js:3988:27) at ./src/core/router/serverRouter.jsx.__webpack_exports__.default (/Users/hoge/hoge/dist/server.js:7789:91) at processTicksAndRejections (internal/process/task_queues.js:95:5) ```
hoshi-takanori

2022/03/05 07:58

関数コンポーネントの先頭で document.querySelector してますが、まず最初はまだ DOM 要素が作られてませんから undefined が返ると思いますし、その後も正しい DOM 要素を取得できる保証はないはず。 React から DOM 要素にアクセスするには通常 useRef あたりを使うと思いますが、height を使って何をしたいかによってもやり方は変わってくる可能性があるかと。(というか、本当に DOM 要素にアクセスする必要があるのかの検討から…。)
reactq

2022/03/05 09:42

なるほど、、!Reactに詳しくなく、大変勉強になります🙇‍♀️ 今回やりたいこととしてはuseRefの使用で事足りそうですので、useRefを使用して実装し直してみたいと思います!ありがとうございます!
guest

回答2

0

自己解決

useRefを使用して実装できました

投稿2022/03/05 14:14

reactq

総合スコア51

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

エラーメッセージのとおり、サーバサイドにはdocumentなどのDOMは存在しません。

「特定のDOMの高さを取得」するのは、そもそもサーバサイドでやるにはふさわしくない作業ですので、ブラウザ内で行ってください。

投稿2022/03/05 08:10

maisumakun

総合スコア146775

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問