質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
JavaScript

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

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

Q&A

解決済

1回答

5204閲覧

画面が読み込まれた時にスクロール位置を一番下にしたい

kakedashidesu

総合スコア50

JavaScript

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

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

0グッド

0クリップ

投稿2020/11/04 17:03

画面が読み込まれた時にスクロールの位置を一番下にしたいです。
useRefを使いスクロールの高さを取得してscrollTopにその値を入れようと思い refa.current.scrollTop = scroll;としたのですがconsoloe.logでみたところ代入したscrollの値に書き換わっていませんでした。
どうやって、スクロール位置を一番下にすることができるのしょうか??

const Test: FunctionComponent = () => { const refa = useRef<HTMLDivElement>(null); if (process.browser) { const test = () => { if (refa.current !== null) { const scroll = refa.current.scrollHeight; refa.current.scrollTop = scroll; // scrollの値が入っていない console.log(refa.current.scrollTop); } }; test(); } return ( <> <Header /> <Sidebar /> <div style={{ height: '500px', overflowY: 'auto', background: 'blue' }} ref={refa}> <p style={{ height: '50px', textAlign: 'center' }}>aaa</p> <p style={{ height: '50px', textAlign: 'center' }}>aaa</p> <p style={{ height: '50px', textAlign: 'center' }}>aaa</p> <p style={{ height: '50px', textAlign: 'center' }}>aaa</p> <p style={{ height: '50px', textAlign: 'center' }}>aaa</p> <p style={{ height: '50px', textAlign: 'center' }}>aaa</p> <p style={{ height: '50px', textAlign: 'center' }}>aaa</p> <p style={{ height: '50px', textAlign: 'center' }}>aaa</p> <p style={{ height: '50px', textAlign: 'center' }}>aaa</p> <p style={{ height: '50px', textAlign: 'center' }}>aaa</p> <p style={{ height: '50px', textAlign: 'center' }}>aaa</p> <p style={{ height: '50px', textAlign: 'center' }}>aaa</p> <p style={{ height: '50px', textAlign: 'center' }}>aaa</p> <p style={{ height: '50px', textAlign: 'center' }}>aaa</p> <p style={{ height: '50px', textAlign: 'center' }}>aaa</p> </div> </> ); };

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

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

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

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

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

kazatsuyu

2020/11/04 23:03

「scrollの値が入っていない」というのは、コンソールに何らかの値が出力されて、それが意図した値とは異なっていたということでしょうか? 見たところ、単純にこのコンポーネントのレンダリングが一回呼び出されただけの場合、それ以前にconsole.logの箇所には到達しないように見えます
kakedashidesu

2020/11/05 00:41

scrollの値をいれているのですが、console.logでみてみると値が変わっていないです
guest

回答1

0

ベストアンサー

適当に動くように process.browserHeader など素では存在しない物を削って動かして見ましたが、初回のレンダリングではDOMオブジェクトが存在しないためscrollTopをsetしている箇所に到達せず、2回目以降(適当にクリックでstateを更新するようにして再レンダリングさせています)のレンダリング時にはスクロールしました。
https://codesandbox.io/s/little-cache-ygj4p?file=/src/App.tsx
少なくとも、DOMエレメントに対するscrollTopの設定自体はこのコードでも動くようなので、console.logの箇所で更新されないのは不可解です。上記のcodesandboxで動いているコードとあなたの手元のコードを比較してみれば何か分かるかもしれません。

なお、DOMエレメントに対する直接の操作は副作用なので、レンダリング時に行うべきではありません。
useEffectを使うか、このケースならDOMエレメントがマウントされた直後にスクロールする処理を入れれば良いように思うので、コールバック形式のrefを利用するのが良いのではないでしょうか。

投稿2020/11/05 02:24

kazatsuyu

総合スコア158

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

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

kakedashidesu

2020/11/05 02:45

ありがとうございます。 useEffectを使ったらうまく行きました!! useEffectを使うよりコールバック形式のrefというものを使う方がいいのでしょうか? const refa = useRef<HTMLDivElement>(null); useEffect(() => { if (process.browser) { if (refa.current != null) { const scroll = refa.current.scrollHeight; refa.current.scrollTop = scroll; } } });
kazatsuyu

2020/11/05 03:12

useEffectは第2引数を省略した場合はレンダリングごとに毎回呼び出されるはずです。つまりこのままだとレンダリングが行われる度に末尾までスクロールしてしまうことになります。 第2引数に依存する値の配列を渡せば、それらが更新されない場合は呼ばれなくなり、空の配列にすればコンポーネントのマウント時に一回だけ呼び出されます。 コールバック形式のrefの場合は、仮想DOMから生のDOMオブジェクトが新規に作成された時に呼び出されるので、特に何もしなくても、ページを開いている間永続的に存在するDOMオブジェクトに関しては一度だけ呼び出されることになります。
kakedashidesu

2020/11/05 05:24

ありがとうございます!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問