Reactの単一ページアプリケーションを作成していますが、スクロール復元がChrome(およびおそらく他のブラウザー)で期待どおりに動作していないようです。
react-router-dom githubリポジトリには、ブラウザーが単一ページアプリのスクロールをネイティブで処理し始めていることを示すページがあり、にhistory.scrollRestoration
設定されている場合、動作は従来の非SPA Webページの動作と同様になります。auto
。
私が必要とする動作はそのページに示されています:
- ナビゲーションを上にスクロールして、一番下までスクロールした新しい画面を開始しないようにします。
- 「戻る」および「進む」クリック(ただし、リンククリックは除く)でのウィンドウとオーバーフロー要素のスクロール位置の復元
しかし、タブやカルーセルを含むルートの動作も無効にする必要があります。
問題に関するChromeの仕様へのリンクは次のとおりです。
OS XのChromeバージョン78.0.3904.97(公式ビルド)(64ビット)で私が観察しているのは、私がhistory.scrollRestoration
manual
設定から期待しているように見えるものです。つまり、ページの下半分までスクロールしてリンクをクリックすると、次のページが前のページと同じポイントまでページの下半分までスクロールされます。
私はhistory.scrollRestoration
さまざまな時点でを確認しましたが、それが開始して留まることauto
、デフォルト、
ここでの重要なポイントの1つは、@ TrevorRobinsonの回答によるものです。「スクロール復元時のブラウザの自動試行... ...ほとんどの場合、単一ページのアプリでは機能しません...」OK ...の一貫したサポートが見つかりましたhistory.scrollRestoration
が、どうやらブラウザは、実際にスクロールの復元を行っているのがおかしい。次に、ここで注意する必要がありますで。これ、今日の時間を節約できました。
次に、これを手動で行う方法を調べましたが、先の方法がわかりません。react-router-scroll
は、React Router v4と互換性がないと述べていますが、この質問の時点で最新のv5については触れていません。では、v5にも互換性がないと思いますか?
私は前方の道のために、さらに見て、約このSOの答えは見つかったので、ルータのV4に反応してスクロール復元を処理する方法を ...万一、私はそれが前提となりますルータV5に反応して動作しますか?更新:v5では私には機能しないようです。私はいくつかの構成を試しました。また、React Router v4で完全に機能させることもできませんでした。新しいページの一番上までスクロールしていたので、少なくとも生きていることはわかっていましたが、履歴の復元は行われません。
また、react-router-scroll-memoryも機能しましたが、タブやカルーセルに必要なものなど、指定されたルートでのスクロールを無効にするオプションはありません。
私はoaf-react-routerの使用を検討しましたが、特定のルートのスクロール復元またはトップへのスクロールの無効化に関するドキュメントには何も記載されていません。編集:私の回答で概説されているように、実際にこれを処理します。
見落としていることはありますか?この機能を必要とするのは私だけではないため、この問題に対処するための標準は何ですか。エッジの効いた、実験的なことをしているようですが、通常のサイトと同じようにスクロールする必要があります。