# Migration Guide from v1 to v2 _A few notes to help with migrating from v1 to v2._ The `` component has been removed. A `` component has been added for use with the new `` component to accomplish the same tasks. ### tl;dr: - `transitionName` -> `classNames` - `transitionEnterTimeout` and `transitionLeaveTimeout` -> `timeout={{ exit, enter }}` - `transitionAppear` -> `appear` - `transitionEnter` -> `enter` - `transitionLeave` -> `exit` ## Walkthrough Let's take the [original docs example](https://github.com/reactjs/react-transition-group/tree/v1-stable/#high-level-api-csstransitiongroup) and migrate it. Starting with this CSS: ```css .example-enter { opacity: 0.01; } .example-enter.example-enter-active { opacity: 1; transition: opacity 500ms ease-in; } .example-leave { opacity: 1; } .example-leave.example-leave-active { opacity: 0.01; transition: opacity 300ms ease-in; } ``` And this component: ```js class TodoList extends React.Component { constructor(props) { super(props); this.state = {items: ['hello', 'world', 'click', 'me']}; this.handleAdd = this.handleAdd.bind(this); } handleAdd() { const newItems = this.state.items.concat([ prompt('Enter some text') ]); this.setState({items: newItems}); } handleRemove(i) { let newItems = this.state.items.slice(); newItems.splice(i, 1); this.setState({items: newItems}); } render() { const items = this.state.items.map((item, i) => (
this.handleRemove(i)}> {item}
)); return (
{items}
); } } ``` The most straightforward way to migrate is to use `` instead of ``: ```diff render() { const items = this.state.items.map((item, i) => (
this.handleRemove(i)}> {item}
)); return (
- + {items} - +
) } ``` That doesn't get us much, since we haven't included anything to do the animation. For that, we'll need to wrap each item in a ``. First, though, let's adjust our CSS: ```diff .example-enter { opacity: 0.01; } .example-enter.example-enter-active { opacity: 1; transition: opacity 500ms ease-in; } -.example-leave { +.example-exit { opacity: 1; } -.example-leave.example-leave-active { +.example-exit.example-exit-active { opacity: 0.01; transition: opacity 300ms ease-in; } ``` All we did was replace `leave` with `exit`. v2 uses "exit" instead of "leave" to be more symmetric, avoiding awkwardness with English tenses (like with "entered" and "leaved"). Now we add the `` component: ```diff render() { const items = this.state.items.map((item, i) => ( +
this.handleRemove(i)}> {item}
+
)); return (
{items}
) } ``` Note that we replaced `transitionName` with `classNames`. `` otherwise has essentially the same signature as ``. We also replaced `transitionEnterTimeout` and `transitionLeaveTimeout` with a single `timeout` prop with an object. > **Hint:** If your enter and exit timeouts are the same you can use the shorthand `timeout={500}`. If we want to make this a bit more encapsulated, we can wrap our `` into a separate component for reuse later: ```js const FadeTransition = (props) => ( ); ``` We can then use it like: ```diff render() { const items = this.state.items.map((item, i) => ( - +
this.handleRemove(i)}> {item}
-
+ )); return (
{items}
) } ``` > **Hey!** You may not need `` at all! The lower level `` component is very flexible and may be easier to work with for simpler or more custom cases. Check out how we migrated [React-Bootstrap](https://react-bootstrap.github.io/)'s simple transitions to v2 for the [``](https://github.com/react-bootstrap/react-bootstrap/pull/2676/files#diff-4f938f648d04d4859be417d6590ca7c4) and [``](https://github.com/react-bootstrap/react-bootstrap/pull/2676/files#diff-8f766132cbd9f8de55ee05d63d75abd8) components. ## Wrapping `` Components The old `` component managed transitions through custom static lifecycle methods on its children. In v2 we removed that API in favor of requiring that `` be used with a `` component, and using traditional prop passing to communicate between the two. This means that ``s inject their children with ``-specific props that _must_ be passed through to the `` component for the transition to work. ```js const MyTransition = ({ children: child, ...props }) => ( // NOTICE THE SPREAD! THIS IS REQUIRED! {transitionState => React.cloneElement(child, { style: getStyleForTransitionState(transitionState) })} ); const MyList = () => ( {items.map(item => ( {item} )} ); ``` Note how `` passes all props other than its own to ``. ## Lifecycle Callbacks As noted, child lifecycle methods have been removed. If you do need to do some work when the `` changes from one state to another, use the lifecycle callback props. ```js ``` Each callback is called with the DOM node of the transition component. Note also that there are now _three_ states per enter/exit transition instead of the original two. See the [full documentation](https://reactcommunity.org/react-transition-group/#Transition) for more details.