Framer Motion 退出动画不会在带有 React-router-dom 的手风琴上触发

reactjs

1个回答

写回答

lijian8005

2025-07-01 05:40

+ 关注

JS
JS

使用Framer Motion库时,我们可能会遇到一个问题,即退出动画不会在带有React Router Dom的手风琴组件上触发。本文将介绍这个问题,并提供一个案例代码来解决这个问题。

在我们使用React Router Dom和Framer Motion库时,通常会使用手风琴组件来创建一个具有动画效果的导航栏。手风琴组件允许我们在点击导航链接时展开或折叠相应的内容。而Framer Motion库则提供了丰富的动画效果,可以让我们的应用程序更加生动和吸引人。

然而,当我们在手风琴组件上使用退出动画时,可能会发现该动画不会触发。这是因为手风琴组件使用React Router Dom的Link组件来处理导航链接,而Link组件会在点击时立即跳转到相应的页面,导致退出动画无法生效。

为了解决这个问题,我们可以使用Framer Motion的AnimatePresence组件和过渡属性来实现退出动画。AnimatePresence组件可以检测到组件的进入和退出,并根据设置的过渡属性来执行相应的动画效果。

下面是一个示例代码,展示了如何在手风琴组件上实现退出动画:

JSx

import { useState } from 'react';

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

import { Link } from 'react-router-dom';

const Accordion = () => {

const [isOpen, setIsOpen] = useState(false);

const handleToggle = () => {

setIsOpen(!isOpen);

};

return (

<div>

<button onClick={handleToggle}>Toggle</button>

<AnimatePresence>

{isOpen && (

<motion.div</p> initial={{ height: 0 }}

animate={{ height: 'auto' }}

exit={{ height: 0 }}

>

<ul>

<li>

<Link to="/">Home</Link>

</li>

<li>

<Link to="/about">About</Link>

</li>

<li>

<Link to="/contact">Contact</Link>

</li>

</ul>

</motion.div>

)}

</AnimatePresence>

</div>

);

};

export default Accordion;

在上面的代码中,我们首先使用useState钩子来管理手风琴的状态。然后,在按钮的点击事件中切换isOpen的值,以展开或折叠手风琴内容。

在手风琴内容的部分,我们使用AnimatePresence组件包裹要执行退出动画的元素。当isOpen为true时,动画元素将被渲染,并且在退出时执行设置的动画效果。

在motion.div元素中,我们设置了进入动画的初始状态为height为0,退出动画的状态也为height为0。当手风琴内容展开时,高度将自动调整为适应内容的高度。

通过这种方式,我们可以在手风琴组件上实现退出动画效果,即使使用了React Router Dom的Link组件来处理导航链接。

Framer Motion是一个强大的动画库,可以与React Router Dom一起使用,为我们的应用程序添加生动和吸引人的动画效果。然而,在使用手风琴组件时,我们可能会遇到退出动画不触发的问题。

为了解决这个问题,我们可以使用Framer Motion的AnimatePresence组件和过渡属性来实现退出动画。通过设置初始状态和退出状态的动画效果,我们可以让退出动画在带有React Router Dom的手风琴组件上生效。

希望本文对你理解和解决这个问题有所帮助!

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号