React API 参考
完整参考: @reelkit/react 的组件、属性与方法。
Reel 属性
ReelProps
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
count | number | required | 条目总数 |
size | [number, number] | - | 以 [宽, 高] 表示的尺寸。省略时通过 ResizeObserver 自动测量 |
itemBuilder | (index, indexInRange, size) => ReactElement | required | 渲染每张幻灯片的函数 |
direction | 'vertical' | 'horizontal' | 'vertical' | 滚动方向 |
initialIndex | number | 0 | 起始索引 |
loop | boolean | false | 启用无限循环 |
enableWheel | boolean | false | 启用鼠标滚轮导航 |
wheelDebounceMs | number | 200 | 滚轮事件防抖时长(毫秒) |
enableNavKeys | boolean | true | 启用键盘导航 |
onNavKeyPress | (increment: -1 | 1) => void | - | 方向键导航的自定义处理器。会替换默认的上一张 / 下一张行为。 |
transition | TransitionTransformFn | slideTransition | 过渡效果函数。内置有 slideTransition、fadeTransition、flipTransition、cubeTransition、zoomTransition |
transitionDuration | number | 300 | 动画时长(毫秒) |
enableGestures | boolean | true | 启用触摸 / 鼠标拖拽导航 |
swipeDistanceFactor | number | 0.12 | 滑动阈值(0-1) |
rangeExtractor | (index: number, count: number) => number[] | defaultRangeExtractor | 自定义函数,决定渲染哪些索引 |
keyExtractor | (index: number) => string | - | 供 React 协调使用的自定义 key 函数(配合 loop 时很有用) |
apiRef | RefObject<ReelApi> | - | 用于访问 API 方法的 ref |
className | string | - | 容器元素的 CSS 类名 |
style | CSSProperties | - | 容器元素的内联样式 |
ariaLabel | string | - | 轮播区域的无障碍标签,供屏幕阅读器朗读 |
回调
| 属性 | 类型 | 说明 |
|---|---|---|
afterChange | (index, indexInRange) => void | 幻灯片切换完成后调用 |
beforeChange | (index, nextIndex, indexInRange) => void | 幻灯片切换开始前调用 |
onSlideDragStart | (index) => void | 拖拽手势开始时调用 |
onSlideDragEnd | (index) => void | 拖拽手势结束时调用 |
onSlideDragCanceled | (index) => void | 拖拽被取消时调用 |
ReelApi 方法
通过 apiRef:
typescript
const apiRef = useRef<ReelApi>(null);
// Navigation
apiRef.current?.next();
apiRef.current?.prev();
apiRef.current?.goTo(5); // instant
apiRef.current?.goTo(5, true); // animated
// Lifecycle
apiRef.current?.adjust(); // recalculate positions
apiRef.current?.observe(); // start observing keyboard
apiRef.current?.unobserve(); // stop observing keyboard| 方法 | 类型 | 说明 |
|---|---|---|
next() | () => void | 切到下一张幻灯片 |
prev() | () => void | 切到上一张幻灯片 |
goTo(index, animate?) | (number, boolean?) => Promise | 切到指定幻灯片 |
adjust() | () => void | 重新计算幻灯片位置 |
observe() | () => void | 开始监听键盘 |
unobserve() | () => void | 停止监听键盘 |
ReelIndicator 属性
ReelIndicatorProps
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
count | number | auto | 条目总数。嵌套在 Reel 内部时会自动从父级连接;单独使用时请显式传入 |
active | number | auto | 当前活动索引。嵌套在 Reel 内部时会自动从父级连接;单独使用时请显式传入 |
direction | 'vertical' | 'horizontal' | 'vertical' | 指示器方向 |
radius | number | 3 | 圆点尺寸(像素) |
visible | number | 5 | 正常尺寸圆点的最大可见数量 |
gap | number | 4 | 圆点之间的间距(像素) |
activeColor | string | '#fff' | 活动圆点颜色 |
inactiveColor | string | 'rgba(255,255,255,0.5)' | 非活动圆点颜色 |
edgeScale | number | 0.5 | 溢出边缘圆点的缩放比例 |
onDotClick | (index: number) => void | - | 点击圆点时的回调 |
className | string | - | 自定义 CSS 类名 |
style | CSSProperties | - | 自定义内联样式 |
观察者组件
Observe
把核心信号桥接到 React 渲染,且不会引起父组件重渲染。订阅的信号变化时,只有 children 函数会重新执行。
tsx
import { Observe } from '@reelkit/react';
<Observe signals={[controller.state.index]}>
{() => <span>Current: {controller.state.index.value}</span>}
</Observe>| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
signals | Subscribable[] | required | 要订阅的信号。其中任意一个发出通知都会重新执行 children 函数 —— 且只有这个函数,父组件不受影响。之后的渲染传入不同的信号时,会转而跟随新信号,替换掉原来的那个。 |
children | () => ReactElement | null | required | 渲染函数,每次变化都会重新执行。请在它内部读取信号的值;在外部读取的值只会被捕获一次,然后就过期了。 |
AnimatedObserve
订阅动画值信号,并用 requestAnimationFrame.
tsx
import { AnimatedObserve } from '@reelkit/react';
<AnimatedObserve signal={controller.state.axisValue}>
{(value) => (
<div style={{ transform: `translateY(${value}px)` }} />
)}
</AnimatedObserve>| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
signal | Signal<AnimatedValue> | required | 发出 { value, duration, done? } 的信号。duration 大于 0 时会从当前值插值过渡到新值;为 0 则直接跳过去。 |
children | (value: number) => ReactElement | required | 渲染函数,接收当前帧的插值结果,并同步提交,让 DOM 跟得上动画。 |
SwipeToClose
<SwipeToClose> 把子元素包进一个跟随垂直滑动的容器,滑动超过阈值后调用 onClose