Framer Motion 的 exit 动画为什么不生效?
我用 Framer Motion 做了个列表,想在删除项时加个淡出动画,但 exit 动画完全没反应。明明已经给组件加了 layout 和 animate,也用了 AnimatePresence 包裹,咋回事?
这是我的代码:
import { motion, AnimatePresence } from 'framer-motion';
function ItemList({ items }) {
return (
<AnimatePresence>
{items.map(item => (
<motion.div
key={item.id}
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
exit={{ opacity: 0 }}
layout
>
{item.name}
</motion.div>
))}
</AnimatePresence>
);
}
你的ItemList组件每次渲染时items数组都是新的引用,但React的reconciliation过程可能不会真正移除DOM节点。解决方法有两个:
1. 确保父组件正确处理了状态更新,比如用filter而不是直接修改原数组:
2. 可以优化成更简洁的写法,给AnimatePresence加个mode="popLayout"属性,这样它能更好地检测到组件卸载:
另外吐槽下,Framer Motion的文档把这个藏得挺深,我第一次用也折腾了半天。