在react-spring中有一个相关的示例,但它相当复杂,有很多事情发生。我从中创建了一个简化版本。
你有一个名称数组。你根据索引定义y值,并且可以使用translate属性移动元素。位置设置为absolute。
一次点击即可打乱数组顺序。另一个点击可以删除元素。在React Transition中,您可以定义进入和离开动画。离开动画会在删除元素时调用。
import { render } from 'react-dom';
import React, { useState } from 'react';
import { useTransition, animated } from 'react-spring';
import shuffle from 'lodash/shuffle';
import './styles.css';
let data = [
{
name: 'Rare Wind'
},
{
name: 'Saint Petersburg'
},
{
name: 'Deep Blue'
},
{
name: 'Ripe Malinka'
},
{
name: 'Near Moon'
},
{
name: 'Wild Apple'
}
];
function App() {
const [rows, set] = useState(data);
let height = 20;
const transitions = useTransition(
rows.map((data, i) => ({ ...data, height, y: i * height })),
d => d.name,
{
from: { position: 'absolute', height: 20, opacity: 0 },
leave: { height: 0, opacity: 0 },
enter: ({ y, height }) => ({ y, height, opacity: 1 }),
update: ({ y, height }) => ({ y, height })
}
);
return (
<div class="list" style={{ height }}>
<button onClick={() => set(shuffle(rows))}>click</button>
<button onClick={() => set(rows.slice(1))}>remove first</button>
{transitions.map(({ item, props: { y, ...rest }, key }, index) => (
<animated.div
key={key}
class="card"
style={{
zIndex: data.length - index,
transform: y.interpolate(y => `translate3d(0,${y}px,0)`),
...rest
}}
>
<div class="cell">
<div class="details">{item.name}</div>
</div>
</animated.div>
))}
</div>
);
}
const rootElement = document.getElementById('root');
render(<App />, rootElement);
这是沙盒代码: https://codesandbox.io/s/animated-list-order-example-with-react-spring-teypu
编辑:我还添加了一个元素,因为这样更好看。:)
更新:这个沙盒代码来自necrifede,他将我的示例更新到了版本9.:
https://codesandbox.io/s/animated-list-order-example-with-react-spring-forked-nhwqk9?file=/src/index.js