turntable-react
v0.1.0
Published
React 抽奖转盘组件,基于 HTML canvas,支持即时转动
Downloads
6
Maintainers
Readme
turntable-react
React 抽奖转盘组件,基于 HTML canvas
在线demo演示
Features
- 即时启动,不必等待抽奖结果的接口返回再启动转盘,先转起来再说~
- 超时控制
- 支持主动中断
- 支持渲染多行文本,多张图片
- 支持自动旋转
- 样式完全自定义
- 缓慢结束效果
TODO
- 支持指针旋转模式
- ~~增加延时启动的模式(即等待抽奖接口结果返回再转动抽奖)~~
Use
npm install turntable-react
or use yarn
yarn add turntable-react
Example
detail example
import Turntable from 'turntable-react';
<Turntable
size={300}
prizes={prizes}
onStart={fetchPrizeResult}
onComplete={complete}
onTimeout={timeout}
>
{/* 转盘指针 点击按钮 */}
<div className="turntable-pointer">
<img className="pointer-img" src={require('./pointer.png')} alt="" />
</div>
</Turntable>
Run sample
git clone https://github.com/f840415070/turntable-react.git
cd turntable-react
yarn && yarn start
- open broswer:
http://localhost:8080/
Turntable Props
| propName | type | desc | required | default | | :-: | :-: | :-: | :-: | :-: | :-: | | size | number | 转盘大小,数值,像素单位 | true | - | | prizes | Prize[] | 奖品数据 | true | - | | onStart | (abort: () => void) => Promise or false | 点击指针时执行的函数,请求的中奖数据的接口可以写在 Promise 中并返回;返回 Promise 对象时,resolve 奖品在 prizes 里的索引,返回 false 时,转盘不会启动;在转盘转动时可使用 abort 函数主动中止转动 | true | - | | children | React.ReactNode | 转盘指针,点击按钮的自定义样式,被 Turntable 组件包裹的子代节点,如 example | false | - | | mode | string | ['immediate', 'waiting'] 两种抽奖模式,immediate 发送接口后直接转动转盘,等待有中奖数据后再结束;waiting 等待有中奖数据后再转动转盘 | false | immediate | | duration | number | 至少要转多长时间,单位毫秒,最小值3000 | false | 3000 | onComplete | (prizeIndex: number) => void | 抽奖结束即转盘停止转动后执行的回调函数,组件传递的参数是中奖的索引 | false | - | | timeout | number | 超时时间,毫秒 | false | 10000 | | onTimeout | () => void | 超时执行的回调 | false | - | | onStateChange | (isDrawing: boolean) => void | 抽奖状态改变方法,isDrawing true 进入抽奖状态,false 抽奖状态结束 | false | - | | auto | boolean | 如果转盘没有被启动,将匀速自动转动 | false | true | autoSpeed | number | 自动转动的速度,取值范围 [1, 5] | false | 2 | | autoDelay | number | 指定时间如果转盘没有被启动,将匀速自动转动,单位毫秒 | false | 5000 | | renderIfLoaded | boolean | 如果有图片需要绘制,组件会等待图片加载完成后才绘制转盘(图片没有下载完,canvas drawImage 会失败)| false | true | | renderIfLoadedTimeout | number | 开启 renderIfLoaded 后,若指定时间没有加载完所有图片,将不会等待直接绘制转盘。单位毫秒 | false | 300 | | pointToMiddle | boolean | 转盘指针指向第一个奖品正中心,而不是第一个与最后一个间隙 | false | false | | turntableBackground | string | 转盘背景色 | false | transparent |
Turntable sub types
Prize
| propName | type | desc | required | default | | :-: | :-: | :-: | :-: | :-: | :-: | | texts | PrizeText[] | 待绘制文本数组 | true | - | | background | string | 奖品块的背景色 | true | - | | images | PrizeImage[] | 待绘制的图片数组 | false | - |
PrizeText
| propName | type | desc | required | default | | :-: | :-: | :-: | :-: | :-: | :-: | | text | string | 文本 | true | - | | fontStyle | string | 与css font 属性相同,注意要传入默认字体,如 '16px Arial' | true | - | | fontColor | string | 字体颜色 | false | #000000 | | fromCenter | number | 文字距中心位置距离,取值范围 [0, 1] | true | - |
PrizeImage
| propName | type | desc | required | default |
| :-: | :-: | :-: | :-: | :-: | :-: |
| src | string | 图片链接,可选(与 canvasImageSource 二选一),使用 src 属性,组件将 new Image()
创建 img 对象,对图片有其它需求的可以自己创建图片对象到 canvasImageSource | false | - |
| canvasImageSource | CanvasImageSource | 自行创建 canvas 支持的图片对象 type CanvasImageSource = <HTMLOrSVGImageElement>, <HTMLVideoElement>, <HTMLCanvasElement>, <ImageBitmap>, <OffscreenCanvas>
| false | - |
| width | number | 图片宽度 | true | - |
| height | number | 图片高度 | true | - |
| fromCenter | number | 图片距中心位置距离,取值范围 [0, 1] | true | - |