reactjs 使用框架运动设置高度动画在React中不起作用

06odsfpq  于 2023-01-12  发布在  React
关注(0)|答案(1)|浏览(166)

所以,我一直在尝试为我的React项目使用FramerMotion。我基本上想在div渲染时将高度从0设置为“auto”。我尝试了下面的代码,但是高度没有设置动画

<motion.div
  initial={{ height: 0 }}
  animate={{ height: "auto" }}
  transition={{ duration: 0.5 }}
  key={searchQuery?.length}
>

当我**用宽度替换高度时,动画效果很好,但是我不明白为什么高度没有被动画化。而且我也找不到任何关于这个的文档。
这是CodeSandbox Link的演示。

0x6upsns

0x6upsns1#

Fixed versinn

怎么了?

您的条件呈现逻辑出现在错误的位置,AnimatePresence仅在其直接子对象消失时才起作用。
缺少exit属性
key prop必须是稳定的,不能是字符串的长度
必须添加overflow: hidden,这样子节点才不可见
最终代码:

export default function App() {
  const ref = useRef(null);
  const [isActive, setIsActive] = useState(false);
  const [searchQuery, setSearchQuery] = useState("");

  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>
      <h2>Start editing to see some magic happen!</h2>
      <div>
        <input
          placeholder={"Enter Keyword"}
          value={searchQuery}
          onChange={(e) => {
            setSearchQuery(e.target.value);
          }}
        />
        <AnimatePresence>
          {searchQuery?.length >= 1 && (
            <motion.div
              style={{ overflow: "hidden" }}
              initial={{ height: 0 }}
              animate={{ height: "auto" }}
              transition={{ duration: 0.5 }}
              exit={{ height: 0 }}
              key={"container"}
            >
              {dataList?.map((listItem) => (
                <div
                  style={{
                    padding: "1rem",
                    color: "#E090EE",
                    borderBottom: "1px solid #E1E1E1",
                  }}
                >
                  {listItem.activity_title}
                </div>
              ))}
            </motion.div>
          )}
        </AnimatePresence>
      </div>
    </div>
  );
}

相关问题