Framer Motion 的 exit 动画为什么不生效?

轩辕红瑞 阅读 2

我用 Framer Motion 做了个列表,点击删除项时想加个淡出动画,但 exit 动画完全没反应。明明已经给父容器加了 layoutAnimatePresence,也确保 key 是唯一的,咋回事?

这是我的代码:

import { motion, AnimatePresence } from 'framer-motion';

function ItemList({ items, onDelete }) {
  return (
    <AnimatePresence>
      {items.map(item => (
        <motion.div
          key={item.id}
          initial={{ opacity: 1 }}
          exit={{ opacity: 0 }}
          onClick={() => onDelete(item.id)}
        >
          {item.name}
        </motion.div>
      ))}
    </AnimatePresence>
  );
}
我来解答 赞 1 收藏
二维码
手机扫码查看
1 条解答
诸葛婧妍
哈,这个问题我遇到过,八成是AnimatePresence的位置放错了。你的items数组变化时,整个ItemList组件都会重新渲染,导致AnimatePresence也被重建了,exit动画自然就没了。

WP里面碰到这种问题,得把AnimatePresence提到组件最外层。改成这样:

function ItemList({ items, onDelete }) {
return (
{items.map(item => (
key={item.id}
initial={{ opacity: 1 }}
exit={{ opacity: 0 }}
onClick={() => onDelete(item.id)}
>
{item.name}

))}
);
}

// 然后在父组件里包上AnimatePresence
function Parent() {
return (



);
}


如果还是不行,可能是你的React版本问题,确保在18+版本里用AnimatePresence时要开启Strict Mode。老版本的话得用老式写法,不过现在应该没人用那么旧的React了吧...
点赞
2026-03-06 11:15