更新记录

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>

注意事项

  1. list 为空或不传时,转盘默认显示 6 个空扇区,可通过 colors 自定义扇区颜色
  2. 调用 spin() 前需确保不在旋转状态(isSpinning 为 false)
  3. beforeStart 事件返回 false 可阻止本次旋转,常用于前置校验
  4. scrollToTopOnEnd 为 true 时中奖奖品会旋转至正顶部,否则停在初始位置通过高亮闪烁标识
  5. showPointer 仅在 scrollToTopOnEnd 为 true 时生效
  6. 可通过 indexKey 指定奖品唯一标识字段,此时 spin() 参数传入该字段值而非索引

在线示例

完整示例及效果预览请访问:https://plum-ui.isixe.com/#/pages-example/wheel/index

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议

暂无用户评论。