-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
[BUG] AnimatePresence not working with layout animations #1983
Description
1. Read the FAQs 👇
2. Describe the bug
Not sure if I'm just doing something wrong here but it seems AnimatePresence doesn't reliably perform the exit animation when the children has the layout prop:
CleanShot.2023-02-25.at.08.12.04.mp4
More specifically, it seems that the animation won't happen if a current exit animation is in progress. If you click on "remove" slowly (i.e. wait for the exit animation to finish and the element to be removed from the DOM), then the exit animations work as expected.
3. IMPORTANT: Provide a CodeSandbox reproduction of the bug
https://codesandbox.io/s/affectionate-alex-mjc72j?file=/src/App.js
4. Steps to reproduce
- Click on "add" to extend the list
- Click on "remove" a few times quickly
5. Expected behavior
Multiple numbers can perform the exit animation at the same time.
7. Environment details
MacOS Monterey 12.6.3, Chrome 110.0.5481.177
FAQs
Framer Motion won't install
Framer Motion 7+ uses React 18 as a minimum. If you can't upgrade React, install the latest version of Framer Motion 6.
height: "auto" is jumping
Animating to/from auto requires measuring the DOM. There's no perfect way to do this and if you have also applied padding to the same element, these measurements might be wrong.
The recommended solution is to move padding to a child element. See this issue for the full discussion.
Type error with AnimateSharedLayout
AnimateSharedLayout was deprecated in 5.0. Refer to the upgrade guide for instructions on how to remove.
Preact isn't working
Framer Motion isn't compatible with Preact.
AnimatePresence isn't working
Have all of its immediate children got a unique key prop that remains the same for that component every render?
// Bad: The index could be given to a different component if the order of items changes
<AnimatePresence>
{items.map((item, index) => <Component key={index} />)}
</AnimatePresence>// Good: The item ID is unique to each component
<AnimatePresence>
{items.map((item, index) => <Component key={item.id} />)}
</AnimatePresence>Is the AnimatePresence correctly outside of the controlling conditional? AnimatePresence must be rendered whenever you expect an exit animation to run - it can't do so if it's unmounted!
// Bad: AnimatePresence is unmounted - exit animations won't run
{isVisible && (
<AnimatePresence>
<Component />
</AnimatePresence>
)}// Good: Only the children are unmounted - exit animations will run
<AnimatePresence>
{isVisible && <Component />}
</AnimatePresence>