更新记录
v0.1.0(2026-07-11)
下载此版本
首次上传
平台兼容性
uni-app(3.7.10)
| Vue2 |
Vue3 |
Chrome |
Safari |
app-vue |
app-nvue |
Android |
iOS |
鸿蒙 |
| - |
√ |
√ |
√ |
- |
- |
√ |
√ |
- |
| 微信小程序 |
支付宝小程序 |
抖音小程序 |
百度小程序 |
快手小程序 |
京东小程序 |
鸿蒙元服务 |
QQ小程序 |
飞书小程序 |
小红书小程序 |
快应用-华为 |
快应用-联盟 |
| √ |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
幸运转盘组件 (lucky-wheel)
组件介绍
lucky-wheel 是一个幸运转盘组件,支持自定义奖品列表、旋转动画、中心按钮样式、中奖高亮闪烁、指针指示等功能,适用于抽奖营销场景。
组件属性
| 属性 |
类型 |
默认值 |
说明 |
| size |
Number |
550 |
转盘尺寸(rpx) |
| list |
WheelPrize[] |
[] |
奖品列表(不传或空数组时默认显示6个空扇区) |
| indexKey |
String |
'' |
奖品列表中用于标识唯一索引的字段名,指定后 spin() 参数为该字段值 |
| duration |
Number |
5 |
旋转动画时长(秒) |
| btnText |
String |
'开始' |
中心按钮文字 |
| disabled |
Boolean |
false |
是否禁用(禁止点击) |
| colors |
String[] |
['#fef4e6', '#ffe8c3'] |
奖品背景色列表,按顺序分配,不够则循环使用 |
| dotBlink |
Boolean |
false |
装饰点是否闪烁 |
| btnBgImage |
String |
'' |
中心按钮背景图(溢出自动裁剪) |
| highlightColor |
String |
'rgb(255, 171, 95)' |
中奖奖品闪烁背景色 |
| innerDividerColor |
String |
'#FFFEFA' |
奖品格之间的内边框颜色 |
| outerCircleBg |
String |
'' |
外圆盘背景色 |
| scrollToTopOnEnd |
Boolean |
false |
是否将中奖奖品旋转至正顶部(默认停在初始布局,高亮标识中奖) |
| showPointer |
Boolean |
false |
是否显示顶部指针(需 scrollToTopOnEnd 为 true) |
组件事件
| 事件 |
参数 |
说明 |
| beforeStart |
- |
点击开始按钮(旋转前触发,返回 false 可阻止旋转) |
| start |
- |
开始旋转 |
| end |
{ prize: WheelPrize, targetIndex: number } |
旋转结束,返回中奖奖品与索引 |
组件插槽
| 插槽名称 |
作用域 |
说明 |
| item |
{ item, index } |
自定义奖品展示内容 |
| btn |
- |
自定义中心按钮内容 |
| pointer |
- |
自定义顶部指针内容(需 scrollToTopOnEnd + showPointer 为 true) |
暴露方法
| 方法 |
参数 |
说明 |
| spin |
target: number | string |
开始旋转,参数为目标奖品索引或 indexKey 对应的字段值 |
内部类型定义
interface WheelPrize {
prizeName: string
imageUrl: string
entryId?: string
[key: string]: any
}
interface WheelSpinResult {
prize: WheelPrize
targetIndex: number
}
使用示例
<script setup lang="ts">
import { ref } from 'vue'
import type { WheelPrize, WheelSpinResult } from '@/components/ui/game/lucky-wheel.vue'
const wheelRef = ref()
const prizeList: WheelPrize[] = [
{ prizeName: '一等奖', imageUrl: '/static/prize-1.png' },
{ prizeName: '二等奖', imageUrl: '/static/prize-2.png' },
{ prizeName: '三等奖', imageUrl: '/static/prize-3.png' },
{ prizeName: '四等奖', imageUrl: '/static/prize-4.png' },
{ prizeName: '五等奖', imageUrl: '/static/prize-5.png' },
{ prizeName: '六等奖', imageUrl: '/static/prize-6.png' },
]
function handleStart() {
// 模拟请求接口得到中奖索引
const targetIndex = 2
wheelRef.value.spin(targetIndex)
}
function handleEnd(result: WheelSpinResult) {
console.log('中奖:', result.prize.prizeName)
}
</script>
<template>
<lucky-wheel
ref="wheelRef"
:list="prizeList"
:size="600"
:duration="5"
btn-text="抽奖"
:dot-blink="true"
:scroll-to-top-on-end="true"
:show-pointer="true"
@before-start="handleStart"
@end="handleEnd"
>
<template #item="{ item }">
<text>{{ item.prizeName }}</text>
<image :src="item.imageUrl" mode="aspectFit" />
</template>
</lucky-wheel>
</template>
注意事项
list 为空或不传时,转盘默认显示 6 个空扇区,可通过 colors 自定义扇区颜色
- 调用
spin() 前需确保不在旋转状态(isSpinning 为 false)
beforeStart 事件返回 false 可阻止本次旋转,常用于前置校验
scrollToTopOnEnd 为 true 时中奖奖品会旋转至正顶部,否则停在初始位置通过高亮闪烁标识
showPointer 仅在 scrollToTopOnEnd 为 true 时生效
- 可通过
indexKey 指定奖品唯一标识字段,此时 spin() 参数传入该字段值而非索引
在线示例
完整示例及效果预览请访问:https://plum-ui.isixe.com/#/pages-example/wheel/index