时间轴 - Timeline
上一篇
画布 - Canvas
下一篇
图表 - Chart
Loading...
Timeline 组件用于创建按时间顺序播放的动画序列,让子组件依次显示。常用于动态排名变化、时间序列数据展示等场景。
interface TimelineProps {/** 起始索引,从第几个子组件开始播放 */start?: number;/** 组件播放的延迟时间(毫秒) */delay?: number;/** 是否自动循环播放 */loop?: boolean;/** 是否自动播放(内部使用) */autoPlay?: boolean;/** 子组件 */children?: any;}
import { Canvas, Chart, Interval, Axis, Timeline } from '@antv/f2';// 准备多个时间点的数据const data = [[{ genre: 'Sports', sold: 5 },{ genre: 'Strategy', sold: 10 },{ genre: 'Action', sold: 20 },],[{ genre: 'Sports', sold: 50 },{ genre: 'Strategy', sold: 5 },{ genre: 'Action', sold: 2 },],[{ genre: 'Sports', sold: 15 },{ genre: 'Strategy', sold: 30 },{ genre: 'Action', sold: 25 },],];<Canvas context={context} pixelRatio={window.devicePixelRatio}><Timeline delay={1000}>{data.map((frameData) => (<Chart data={frameData}><Axis field="genre" /><Axis field="sold" /><Interval x="genre" y="sold" color="genre" /></Chart>))}</Timeline></Canvas>
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
delay | number | 0 | 每个组件播放的延迟时间(毫秒) |
start | number | 0 | 从第几个子组件开始播放(索引从 0 开始) |
loop | boolean | false | 是否自动循环播放 |
autoPlay | boolean | - | 是否自动播放(通常不需要手动设置) |
children | any | - | 子组件,通常为多个 Chart 或 Component |
让多个图表依次播放:
const data = [{ genre: 'Sports', sold: 5 },{ genre: 'Strategy', sold: 10 },{ genre: 'Action', sold: 20 },{ genre: 'Shooter', sold: 40 },];const frames = [data, [...data].reverse(), data];<Canvas context={context}><Timeline delay={500}>{frames.map((frameData, index) => (<Chart key={index} data={frameData}><Axis field="genre" /><Interval x="genre" y="sold" color="genre" /></Chart>))}</Timeline></Canvas>
展示随时间变化的排名动画:
const timelineData = [[{ name: 'A', value: 10 },{ name: 'B', value: 20 },{ name: 'C', value: 30 },],[{ name: 'A', value: 35 },{ name: 'B', value: 15 },{ name: 'C', value: 25 },],[{ name: 'A', value: 40 },{ name: 'B', value: 30 },{ name: 'C', value: 10 },],];<Canvas context={context}><Timeline delay={1000}>{timelineData.map((data, index) => {const sorted = [...data].sort((a, b) => a.value - b.value);return (<Chart key={index} data={sorted} coord={{ transposed: true }}><Axis field="name" /><Interval x="name" y="value" color="name" /></Chart>);})}</Timeline></Canvas>
使用 start 属性从特定帧开始:
<Canvas context={context}><Timeline delay={800} start={2}>{dataFrames.map((frame, index) => (<Chart key={index} data={frame}><Interval x="x" y="y" /></Chart>))}</Timeline></Canvas>
设置 loop 为 true 实现循环播放:
<Canvas context={context}><Timeline delay={1000} loop={true}>{frames.map((frame, index) => (<Chart key={index} data={frame}><Line x="date" y="value" /></Chart>))}</Timeline></Canvas>
展示数据随时间的演变:
const yearlyData = [{ year: '2020', value: 100 },{ year: '2021', value: 150 },{ year: '2022', value: 200 },{ year: '2023', value: 180 },];// 创建累积数据帧const frames = yearlyData.map((_, i) => yearlyData.slice(0, i + 1));<Canvas context={context}><Timeline delay={600}>{frames.map((frame, index) => (<Chart key={index} data={frame}><Axis field="year" /><Axis field="value" /><Line x="year" y="value" /><Point x="year" y="value" /></Chart>))}</Timeline></Canvas>
设置 delay={0} 实现连续播放:
<Canvas context={context}><Timeline delay={0}>{frames.map((frame, index) => (<Chart key={index} data={frame}><Interval x="category" y="value" animation={{ duration: 300 }} /></Chart>))}</Timeline></Canvas>
确保 delay 属性设置正确,且子组件支持动画:
// 错误:delay 设置过大<Timeline delay={60000}>// 正确:设置合理的 delay<Timeline delay={1000}>
确保子组件配置了正确的 animation 属性:
<Timeline delay={500}><Chart data={data}>{/* 确保组件有动画配置 */}<Intervalx="genre"y="sold"animation={{appear: {duration: 500,easing: 'linear',},update: {duration: 500,},}}/></Chart></Timeline>
检查 start 的值是否在有效范围内(0 到子组件数量 - 1):
// 如果有 5 个子组件,start 的有效范围是 0-4<Timeline delay={1000} start={2}> {/* 正确 */}<Timeline delay={1000} start={10}> {/* 错误:超出范围 */}
调整 delay 值和子组件动画时长,使其匹配:
<Timeline delay={500} loop={true}><Chart data={data}>{/* 动画时长应与 delay 匹配 */}<Intervalx="x"y="y"animation={{ duration: 500 }}/></Chart></Timeline>
一个 Canvas 中建议只使用一个 Timeline 组件:
// 推荐:使用单个 Timeline<Canvas context={context}><Timeline delay={1000}>{frames.map((frame) => (<Chart data={frame}><Interval x="x" y="y" /><Line x="x" y="y" /></Chart>))}</Timeline></Canvas>
@antv/f-engine,F2 通过 export * from '@antv/f-engine' 重新导出