react-transition-group
を_app.jsx
の中で使います。_app
ファイルで定義したコンポーネントはクライアント側で唯一マウントし続けるコンポーネントで、このコンポーネントが受け取るプロパティのComponent
に対象のpages/*.jsx
ファイルのコンポーネントが入る形で来ます。
以下にフェードイン・アウトを想定した例です。( TypeScript ) router.route
をCSSTransition
のkey
として使っています。これはページ移動した時にrouter.route
が切り替わり、古いkey
のものはexit
に向かい、新しいkey
のページコンポーネントはenter
に向かうような形になります。Component
は1つしかないはずですが、TransitionGroup
を使うことでアニメーション動作中に限りそれら新古のページコンポーネントを共存させられます。アニメーション中はTransitionGroup
が生かしてくれる為です。
export default class extends App {
addEventListener = (node: HTMLElement, done: () => void) => {
const handle = () => {
node.removeEventListener('transitionend', handle);
done();
};
node.addEventListener('transitionend', handle);
};
render() {
const {Component, pageProps, router} = this.props;
return (
);
}
}
ちなみにFade
はstyled-components
になります。これで.fade-<suffix>
クラス名を使いアニメーションを実装します。
import styled from 'styled-components';
const Fade = styled.div`
.fade-enter {}
.fade-enter-active {}
.fade-enter-done {}
.fade-exit {}
.fade-exit-active {}
.fade-exit-done {}
`;