A higher order component to make mobile animated page views easier with react-router
npm install react-animated-views --save
(for now, until I publish it... has to be npm install https://github.com/devgeeks/react-animated-views --save
)
It has a very small API overall. It comes down to setting up your routes, wrapping your components in the higher-order component, and using the push()
and pop()
methods passed in to this.props
instead of the usual react-router versions.
Built in animations available (custom animations coming soon):
- slideLeft
- slideUp
- popFade
e.g.: push('/two', 'slideLeft');
e.g.: pop()
or pop('popFade');
Sometimes when switching animations, the pop()
will also need the animation passed in.
e.g.: <div style={ style }>
Styles passed in to do the actual animations
See full example in the examples folder.
import React from 'react';
import ReactDOM from 'react-dom';
import { hashHistory, Redirect, Router, Route } from 'react-router';
import TransitionGroup from 'react-addons-transition-group';
// bring in the higher order component from react-animated-views
import animateView from 'react-animated-views';
// Top level App component for transitioning the page components
const App = React.createClass({
displayName: 'App',
render() {
const {
location: { pathname: key, action: direction },
} = this.props;
const props = {
key,
direction: direction.toLowerCase(),
};
return (
<TransitionGroup>
{ React.cloneElement(this.props.children || <div />, props) }
</TransitionGroup>
);
},
});
// Page One component
const PageOne = React.createClass({
displayName: 'PageOne',
propTypes: {
push: React.PropTypes.func,
style: React.PropTypes.object,
},
goToPageTwo() {
const { push } = this.props;
push('/two', 'slideLeft');
},
render() {
const { style } = this.props;
return (
<div className="pageone" style={ style }>
<p>Page One</p>
<a
className="button-next-page"
onClick={ this.goToPageTwo }
>
Slide Left to page two »
</a>
</div>
);
},
});
// Now, wrap PageOne in the animateView higher order component
const AnimatedPageOne = animateView(PageOne);
// Page Two component
const PageTwo = React.createClass({
displayName: 'PageTwo',
propTypes: {
push: React.PropTypes.func,
style: React.PropTypes.object,
},
goBack() {
const { pop } = this.props;
pop('slideLeft');
},
render() {
const { style } = this.props;
return (
<div className="pagetwo" style={ style }>
<p>Page Two</p>
<a
className="button-back"
onClick={ this.goBack }
>
« Go back to to page one
</a>
</div>
);
},
});
// Now, wrap PageTwo in the animateView higher order component
const AnimatedPageTwo = animateView(PageTwo);
// Finally we set up our routes
ReactDOM.render((
<Router history={ hashHistory }>
<Route component={ App }>
<Route path="one" component={ AnimatedPageOne } />
<Route path="two" component={ AnimatedPageTwo } />
<Redirect from="/" to="/one" />
</Route>
</Router>
), document.getElementById('app'));