Customizable page transitions, which works with React 16.x, React Router 4/5, Redux 4 and Redux First Router.
Demo: https://jussikinnula.github.io/react-router-page-transition-v2/example/
I'll give most of the credit to @trungdq88 who implemented https://github.com/trungdq88/react-router-page-transition component, which unfortunately isn't yet functional with later React & React Router versions. This project is simplified from the original, so it's not exactly a replacement.
The biggest difference of react-router-page-transition-v2 and https://github.com/trungdq88/react-router-page-transition are how children change is checked. While in this component the children change is just checked from location.pathname, the latter tries to more profoundly check if component did actually change. The implementation by the time this component was done was, however, incomplete.
The implementation of react-router-page-transition-v2 component is done in TypeScript, since many people do prefer type-checking nowadays. You don't need to use TypeScript in order to use the component, so just skip ahead any propName: string definitions when using the component.
Note! I'll probably add this to NPM repository later, after adding tests.
npm install react-router-page-transition-v2
import { PageTransition } from 'react-router-page-transition-v2';
const App = (props) => (
<PageTransition timeout={500}>
<Switch location={props.location}>
<Route path="/" component={List} />
<Route path="/item" component={Item} />
</Switch>
</PageTransition>
);.transition-wrapper
position relative
z-index 1
.transition-item
position absolute
top 0
right 0
left 0
transition transform 0.5s
&.transition-appear.transition-appear-active
transform translate3d(0, 0, 0)
&.transition-appear
transform translate3d(100%, 0, 0)
&.transition-leave
transform translate3d(0, 0, 0)
&.transition-leave.transition-leave-active
transform translate3d(-100%, 0, 0) You can hook into onTransitionStart and onTransitionEnd events, and also pass CSS class names into PageTransition component.
interface Props {
location: any;
}
interface State {
transitionActive: boolean;
}
class App extends React.Component<Props, State> {
constructor(props: any) {
super(props);
this.state = { transitionActive: false };
}
onTransitionStart = () => {
console.log('transition started');
this.setState({ transitionActive: true });
}
onTransitionEnd = () => {
console.log('transition ended');
this.setState({ transitionActive: false });
}
render() {
const className = this.state.transitionActive
? 'transition-active'
: undefined;
return (
<PageTransition
timeout={500}
location={this.props.location}
onTransitionStart={this.onTransitionStart}
onTransitionEnd={this.onTransitionEnd}
className={className}
>
...
</PageTransition>
);
}
}