2016-02-03

React-router と Scroll Position

react-router と ReactCSSTransitionGroup を組み合わせてページ遷移時のアニメーションを実装したメモ。
サンプルを参考に進めれば容易であった。

しかし細かい挙動に凝り始めると、提供されているハイレベルなAPIでは難しくなってくる。
今回はページ遷移時にスクロールポジションが維持されてしまう問題の修正に少しハマった。

結果的に react-router 側を微調整して完了となった。

1 window.scrollTo(0, 0)} history={createBrowserHistory()}> 2 ...</Router>

これでページ遷移時に強制的にスクロールポジションをトップへ固定することができる。
ただこの方法だとブラウザバックの際にも window.scrollTo(0, 0) が発動してしまいユーザビリティが損なわれる。
結果的に下記の方法を採用した。

1const history = createBrowserHistory(); 2history.listen(location => { 3 setTimeout(() => { 4 if (location.action === 'POP') { 5 return; 6 } 7 8 window.scrollTo(0, 0); 9 }); 10}); 11 12const routes = ( 13 // ... </Router> 14);

これでブラウザバック時は前回のスクロールポジションを維持することができる。
ちなみに下記のようなものもあるらしい。

rackt/scroll-behavior - JavaScript