Framer 运动新动画并退出不适用于贴图
Framer motion new animation and exit not working with mapping
出于某种原因,我的退出和新动画无法正常工作。我希望每次用户单击不同的菜单时启动新动画 link。我也试过“ animate='visible'” ,我也试过直接放在运动上,但它仍然没有退出或开始新的动画。我同时使用 .map 和 framer motion。有人可以检查一下吗?
这是代码
谢谢
const [forMapping, setForMapping] = useState(wines)
function menuHandler(index, alt) {
setIsActive(index)
if (alt === 'wine') {
setForMapping(wines)
} else if (alt === 'rakia') {
setForMapping(rakia)
}
}
const variants = {
visible: i => ({
y: 0,
transition: {
duration: .7
}
}),
hidden: {
y: '40%'
}
}
<AnimatePresence>
{forMapping.map((item, index) => {
const {
name,
description,
alt,
imageSrc,
price,
glass_price,
iconSrc,
alc
} = item;
return (
<motion.div
exit={{y: '100'}}
viewport={{once: true}}
custom={index}
whileInView='visible'
initial='hidden'
variants={variants}
key={index}
className='item'>
<div className="image">
<Image
width={200}
height={400}
objectFit='cover'
src={imageSrc}
alt={alt}/>
</div>
<div className="info">
<div className="info-header">
<header>
{name}
</header>
<p className="price">
{price.toFixed(2)} EUR
</p>
</div>
<p className="description">
{description}
</p>
<div className="bottom">
<p>
{alc} %VOL
</p>
<div className='image-price'>
<Image
width={18}
height={20}
objectFit='cover'
src={iconSrc}
alt='wine glass'/>
<p className="black">
{glass_price.toFixed(2)} EUR
</p>
</div>
</div>
</div>
</motion.div>
)
})}
</AnimatePresence>
您不应将循环索引用作 motion.div
中的 key
。由于索引(以及键)将始终相同,因此它不会让 <AnimatePresence>
跟踪何时添加或删除元素以对其进行动画处理。
而是为每个元素使用唯一的值 id
属性。这样 React(和 AnimatePresence)将知道它何时渲染不同的元素(相对于具有不同数据的相同元素)。这就是触发退出和进入动画的原因。
这里有更详尽的解释:
react key props and why you shouldn’t be using index
出于某种原因,我的退出和新动画无法正常工作。我希望每次用户单击不同的菜单时启动新动画 link。我也试过“ animate='visible'” ,我也试过直接放在运动上,但它仍然没有退出或开始新的动画。我同时使用 .map 和 framer motion。有人可以检查一下吗?
这是代码
谢谢
const [forMapping, setForMapping] = useState(wines)
function menuHandler(index, alt) {
setIsActive(index)
if (alt === 'wine') {
setForMapping(wines)
} else if (alt === 'rakia') {
setForMapping(rakia)
}
}
const variants = {
visible: i => ({
y: 0,
transition: {
duration: .7
}
}),
hidden: {
y: '40%'
}
}
<AnimatePresence>
{forMapping.map((item, index) => {
const {
name,
description,
alt,
imageSrc,
price,
glass_price,
iconSrc,
alc
} = item;
return (
<motion.div
exit={{y: '100'}}
viewport={{once: true}}
custom={index}
whileInView='visible'
initial='hidden'
variants={variants}
key={index}
className='item'>
<div className="image">
<Image
width={200}
height={400}
objectFit='cover'
src={imageSrc}
alt={alt}/>
</div>
<div className="info">
<div className="info-header">
<header>
{name}
</header>
<p className="price">
{price.toFixed(2)} EUR
</p>
</div>
<p className="description">
{description}
</p>
<div className="bottom">
<p>
{alc} %VOL
</p>
<div className='image-price'>
<Image
width={18}
height={20}
objectFit='cover'
src={iconSrc}
alt='wine glass'/>
<p className="black">
{glass_price.toFixed(2)} EUR
</p>
</div>
</div>
</div>
</motion.div>
)
})}
</AnimatePresence>
您不应将循环索引用作 motion.div
中的 key
。由于索引(以及键)将始终相同,因此它不会让 <AnimatePresence>
跟踪何时添加或删除元素以对其进行动画处理。
而是为每个元素使用唯一的值 id
属性。这样 React(和 AnimatePresence)将知道它何时渲染不同的元素(相对于具有不同数据的相同元素)。这就是触发退出和进入动画的原因。
这里有更详尽的解释:
react key props and why you shouldn’t be using index