React Animations

37
React Animations

Transcript of React Animations

Page 1: React Animations

React Animations

Page 2: React Animations

Two Types

Component In the DOM

Component Entering/Leaving the DOM

Add a class or whatever

Page 3: React Animations

Two Types

Component In the DOM

Component Entering/Leaving the DOM

Add a class or whatever

Page 4: React Animations

Review: React Lifecycle

Page 5: React Animations

DOM

Page 6: React Animations

Virtual DOM"PotatoHead": { "head": { "peg": null }, "body": { "topPeg": "eyes", "middlePeg": null, "bottomPeg": null }, "bottom": { "peg": "shoes" }}

Page 7: React Animations

dispatch(existentialCrisis())

Page 8: React Animations

Virtual DOM"PotatoHead": { "head": { "peg": null }, "body": { "topPeg": "eyes", "middlePeg": null, "bottomPeg": "mouth" }, "bottom": { "peg": "shoes" }}

Page 9: React Animations

DOM

Page 10: React Animations

Animations don’t really fit. . .

Page 11: React Animations

Lifecycle

componentWillMount

Render!

componentDidMount

Page 12: React Animations

componentWillMount

Page 13: React Animations

componentDidMount

Page 14: React Animations

More Lifecycle Hooks

componentWillMount

Render!

componentDidMount

Page 15: React Animations

More Lifecycle HooksReactTransitionGroups

ReactTransitionGroups

Render!

componentWillMount

componentDidMount

Page 16: React Animations

More Lifecycle HooksReactTransitionGroups

ReactTransitionGroups

Render!

componentWillMount

componentDidMountcomponentWillEnter

Page 17: React Animations

ReactTransitionGroupsclass Box extends React.Component { componentWillEnter (done) { const el = findDOMNode(this); TweenMax.fromTo(el, 0.3, {y: 100}, {y: 0, onComplete: done} ); }

componentWillLeave (done) { const el = findDOMNode(this); TweenMax.fromTo(el, 0.3, {y: 0}, {y: -100, onComplete: done} ); }

render () { return <div className="box"/>; }}

Source: “Animations with ReactTransitionGroup” by Chang Wang on Medium

Page 18: React Animations

ReactCSSTransitionGroups

A simple abstraction that handles many use cases.

Implementation in code at react/src/addons/transitions

Page 19: React Animations

ReactCSSTransitionGroupsconst ShapeContainer = ({elements}) => ( <div id = "shapes"> <ReactCSSTransitionGroup transitionName = "shape" transitionEnterTimeout={2000} transitionLeaveTimeout={2000} > {elements} </ReactCSSTransitionGroup> </div>)

Page 20: React Animations

ReactCSSTransitionGroups.shape-enter { transform: scale(0);}

.shape-enter.shape-enter-active { transform: scale(1); transition: all 2s ease-in;}

Page 21: React Animations

ReactCSSTransitionGroups

<div id="shapes"> <span data-reactid="0.1">

</span></div>

Created by ReactCSSTransitionGroup

Page 22: React Animations

ReactCSSTransitionGroups

<div id="shapes"> <span data-reactid="0.1"> <svg data-reactid=".0.2" class="shape-enter"> <circle data-reactid=".0.2"></circle> </svg> </span></div>

Scale to 0

Page 23: React Animations

ReactCSSTransitionGroups

<div id="shapes"> <span data-reactid="0.1"> <svg data-reactid=".0.2" class="shape-enter shape-enter-active"> <circle data-reactid=".0.2"></circle> </svg> </span></div>

Transition Triggered: Scaling to 1

Page 24: React Animations

ReactCSSTransitionGroups

<div id="shapes"> <span data-reactid="0.1"> <svg data-reactid=".0.2" class=""> <circle data-reactid=".0.2"></circle> </svg> </span></div>

Transition Complete

Page 25: React Animations

ReactCSSTransitionGroups

<div id="shapes"> <span data-reactid="0.1"> <svg data-reactid=".0.2"

… </svg>

</span></div>

Scale to 0

Page 26: React Animations

ReactCSSTransitionGroups

<div id="shapes"> <span data-reactid="0.1"> <svg data-reactid=".0.2"

… </svg> <svg data-reactid=".0.2" class="shape-enter"> <circle data-reactid=".0.2"></circle> </svg> </span></div>

Scale to 0

Page 27: React Animations

ReactCSSTransitionGroups

<div id="shapes"> <span data-reactid="0.1"> <svg data-reactid=".0.2"

… </svg> <svg data-reactid=".0.2" class=“shape-enter shape-enter-active“> <circle data-reactid=".0.2"></circle> </svg> </span></div>

Scaling to 1

Page 28: React Animations

ReactCSSTransitionGroups

<div id="shapes"> <span data-reactid="0.1"> <svg data-reactid=".0.2"

… </svg> <svg data-reactid=".0.2" class=""> <circle data-reactid=".0.2"></circle> </svg> </span></div>

Transition Complete

Page 29: React Animations

Leaving is the same<div id="shapes"> <span data-reactid="0.1"> <svg data-reactid=".0.2"

… </svg> <svg data-reactid=".0.2" class=""> <circle data-reactid=".0.2"></circle> </svg> </span></div>

Page 30: React Animations

ReactCSSTransitionGroups.shape-leave { transform: scale(1);}

.shape-leave.shape-leave-active { transform: scale(0); transition: all .5s ease-in;}

Page 31: React Animations

ReactCSSTransitionGroups

<div id="shapes"> <span data-reactid="0.1"> <svg data-reactid=".0.2"

… </svg> <svg data-reactid=".0.2" class="shape-leave"> <circle data-reactid=".0.2"></circle> </svg> </span></div>

Scale to 1

Page 32: React Animations

ReactCSSTransitionGroups

<div id="shapes"> <span data-reactid="0.1"> <svg data-reactid=".0.2"

… </svg> <svg data-reactid=".0.2" class=“shape-leave shape-leave-active“> <circle data-reactid=".0.2"></circle> </svg> </span></div>

Scaling to 0

Page 33: React Animations

ReactCSSTransitionGroups

<div id="shapes"> <span data-reactid="0.1"> <svg data-reactid=".0.2"

… </svg> <svg data-reactid=".0.2" class=""> <circle data-reactid=".0.2"></circle> </svg> </span></div>

Transition Complete

Page 34: React Animations

ReactCSSTransitionGroups

<div id="shapes"> <span data-reactid="0.1"> <svg data-reactid=".0.2"

… </svg>

</span></div>

Element Disappears

Page 35: React Animations

Demo

http://codepen.io/jsmapr1/pen/KgdNWy

Page 36: React Animations

Takeaways

1. Animations in React rely on new lifecycle hooks

2. ReactTransitions give more control and allow callbacks when animations end

3. ReactCSSTransitions allow a simple hook for CSS-based transitions

Page 37: React Animations

Thanks

blog: thejoemorgan.com

twitter: joesmorgan

github: jsmapr1