反应 - 在添加时淡入,在删除项目时淡出



各位反应开发人员大家好!

我正在尝试通过两个基本操作来列出项目:添加项目和删除项目。

我想做的是,每当我添加一个项目时,我希望它有一个很好的淡入效果(新添加的项目淡入(,当我删除它时,我希望它淡出(删除的项目淡出(。

在给定实现上实现此效果的最简单或最直接的方法是什么(或者如果需要调整实现才能做到这一点,那也可以:)(?

function App() {
const [items, setItems] = useState([]);
return (
<div>
<button 
className='button-add' 
onClick={() => setItems([...items, {
id: new Date().getUTCMilliseconds().toString()}])}
>
Add item
</button>
{items.map(item => (
<div className='item'>
<span className='item-name'>{item.id}</span>
<button className='button-remove' onClick={() => setItems(items.filter((itemInner) => itemInner.id !== item.id))}>Remove item</button>
</div>
))}
</div>
)
}

代码笔上的工作示例(添加/删除(

关键帧就是您要查找的。

我想出了这个解决方案,您可能需要调整它以满足您的需求:

css 文件:

.item {
-webkit-animation: fadein .3s linear forwards;
animation: fadein .3s linear forwards;
padding: 10px;
}
.item-fadeout{
display: flex;
align-items: center;
padding: 10px;
-webkit-animation: fadeout .3s linear forwards;
animation: fadeout .3s linear forwards;
}

@-webkit-keyframes fadein {
0% { opacity: 0; }
100% { opacity: 1; }
}

@keyframes fadein {
0% { opacity: 0; }
100% { opacity: 1; }
}

@-webkit-keyframes fadeout {
0% { opacity: 1; }
100% { opacity: 0; }
}

@keyframes fadeout {
0% { opacity: 1; }
100% { opacity: 0; }
}

.JS:

const { useState } = React;

function Item(props) {
const [isFadingOut, setIsFadingOut] = useState(false);

const fadeOut = (cb) => {
setIsFadingOut(true);
cb();
};
const handleRemoveItem = () => {
props.removeItem();
setIsFadingOut(false);
};
return (
<div className={isFadingOut ? 'item-fadeout' : 'item'}>
<span className='item-name'>{props.item.id}</span>
<button
className='button-remove'
onClick={() => fadeOut(setTimeout(() => handleRemoveItem(), 300))}
>
Remove item
</button>
</div>
);
}

function App() {
const [items, setItems] = useState([]);

return (
<div>
<button
className='button-add'
onClick={() =>
setItems([
...items,
{
id: new Date().getUTCMilliseconds().toString(),
},
])
}
>
Add item
</button>
{items.map((item) => (
<Item
item={item}
removeItem={() =>
setItems(items.filter((itemInner) => itemInner.id !== item.id))
}
/>
))}
</div>
);
}

ReactDOM.render(<App />, document.getElementById('app'));

工作样品:https://codepen.io/luismendes535/pen/YzyJXdR

最新更新