更新记录

1.0.0(2026-09-09) 下载此版本

  1. 首次发布:幸运转盘抽奖组件(底座 + 灯圈闪烁 + 可旋转转盘,由 wheel-board / wheel-panel 两个组件组成)
  2. wheel-board 组合底座图、双帧灯圈闪烁与 wheel-panel,暴露 draw / spin-end 事件
  3. wheel-panel 负责奖品自适应扇形布局、扇区分隔线与旋转动画
  4. 精准停位:ref 调用 spinTo(prize) 支持奖品对象或奖品 ID,转动 6 整圈后停到对应扇区并触发 spin-end
  5. stopSpin() 支持抽奖接口异常时复位旋转锁定状态
  6. prizeList / remainCount 可配:自动处理"暂无奖品 / 抽奖次数已用完"提示,旋转期间防重复点击
  7. 底座 / 灯圈 / 按钮图片内置插件 static 目录
  8. 视觉换肤:bg-img / ring-img-a / ring-img-b / draw-btn-img 四个 props 自定义底座、两帧灯圈与抽奖按钮图,不传使用插件内置默认图(也可直接替换 static 同名文件)
  9. 抽奖按钮文案可配:draw-text(默认"抽奖")经 wheel-board 透传给内部 wheel-panel
  10. 提示文案可配:empty-text(默认"暂无奖品")、no-chance-text(默认"抽奖次数已用完")经 wheel-board 透传,便于接入方做国际化或自定义提示
  11. 文字与图片样式可配:prize-text-size / prize-text-color(奖品名)、prize-img-size(奖品图宽高)、draw-text-size / draw-text-color(按钮文字),均经 wheel-board 透传,不传保持插件默认

平台兼容性

uni-app(5.24)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
-
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟

其他

多语言 暗黑模式 宽屏模式
×

Wheel Board 幸运转盘

一款基于 uni-app(Vue3)的幸运转盘抽奖组件。整体由 wheel-board(底座 + 灯圈闪烁 + 转盘容器) 与内部 wheel-panel(可旋转奖品转盘 + 抽奖按钮) 组成,内置转动动画与"停到指定奖品"的精准停位逻辑,开箱即用。

🚀 功能特性

  • 组合式转盘wheel-board 封装底座图、灯圈闪烁与转盘,wheel-panel 负责扇形布局与旋转逻辑,二者可拆开独立使用
  • 精准停位:通过 ref 调用 spinTo(prize) 传入奖品对象或奖品 ID,转盘自动旋转并停在对应奖品扇区
  • 灯圈闪烁:两帧灯圈图交替闪烁(静止不随转盘旋转),营造"开奖氛围"
  • 抽奖状态控制:自动处理"无奖品 / 次数用尽"提示,旋转期间点击抽奖按钮不重复触发;接口异常可调 stopSpin() 复位
  • 奖品自适应排布:奖品数量 4 / 8 / 以上自动调节锚点半径与缩放,扇区文字图片沿半径方向展示
  • 事件完整:点击抽奖派发 draw,转动结束派发 spin-end(回传中奖奖品)
  • 视觉换肤可配:底座背景图与两帧灯圈图通过 bg-img / ring-img-a / ring-img-b 传自定义图片即可换肤,不传使用插件内置默认图
  • 静态资源内置:底座 / 灯圈 / 抽奖按钮图片均随插件 static 目录发布,可直接在 DCloud 市场发布使用
  • 多端适配:纯 view/text/image + CSS 动画实现,适配 H5 / App-vue / 小程序

📦 安装引入

  1. uni_modules/wheel-board 整个目录复制到项目的 uni_modules 目录下;
  2. 开启 easycom 时可直接使用 <wheel-board> 标签,无需手动引入;
  3. 若未开启 easycom,可在页面中手动引入:
<script setup>
import WheelBoard from "@/uni_modules/wheel-board/components/wheel-board/wheel-board.vue";
</script>

内部组件 wheel-panel 随插件一并提供:开启 easycom 时亦可用 <wheel-panel> 直接引入;wheel-board 内部通过相对路径引用,不依赖 easycom。

🚀 快速开始

<template>
  <view>
    <!-- 基础用法:传入奖品列表与剩余次数 -->
    <wheel-board
      ref="wheelRef"
      :prize-list="prizeList"
      :remain-count="remainCount"
      @draw="handleDraw"
      @spin-end="handleSpinEnd"
    />
  </view>
</template>

<script setup>
import { ref } from "vue";

const wheelRef = ref(null);
const prizeList = ref([
  { id: 1, prizeName: "华为mate30", prizeImg: "https://.../a.png" },
  { id: 2, prizeName: "谢谢参与", prizeImg: "https://.../b.png" },
]);
const remainCount = ref(3);

// 点击抽奖按钮:通常在此请求后端接口,拿到中奖结果后调用 spinTo
const handleDraw = async () => {
  const res = await drawApi();
  // 传奖品对象(含 prizeName)或仅奖品 id 均可
  wheelRef.value?.spinTo(res);
};

// 转动结束:回传中奖奖品,可在此弹出结果弹窗
const handleSpinEnd = (prize) => {
  console.log("中奖奖品:", prize);
};
</script>

🔧 Props 属性配置

属性名 类型 默认值 说明
prizeList Array [] 奖品列表,每项需含 id(停位匹配用)与 prizeName(展示文字),可选 prizeImg(展示图片)
remainCount Number 0 剩余抽奖次数,<= 0 时点击抽奖会提示"抽奖次数已用完"
drawText String 抽奖 中央抽奖按钮文案,传自定义文字即可(如"GO""立即抽")
emptyText String 暂无奖品 奖品列表为空时点击抽奖的 Toast 提示文案
noChanceText String 抽奖次数已用完 剩余次数为 0 时点击抽奖的 Toast 提示文案

视觉资源(可选换肤)

属性名 类型 默认值 说明
bgImg String 插件内置 zp-bg.png 底座背景图,不传用内置默认图;可传网络图或项目内路径
ringImgA String 插件内置 zp-1.png 灯圈图 A(闪烁动画的"亮起"帧之一)
ringImgB String 插件内置 zp-2.png 灯圈图 B(与 A 交替显隐形成闪烁效果)
drawBtnImg String 插件内置 lp-bg.png 中央抽奖按钮背景图,不传用内置默认图

文字与奖品图样式(可选)

属性名 类型 默认值 说明
prizeTextSize String 22rpx 奖品名称字号
prizeTextColor String #1D1E21 奖品名称颜色
prizeImgSize String 96rpx 奖品图片宽高(正方形,同时控制宽与高)
drawTextSize String 30rpx 抽奖按钮文字字号
drawTextColor String #FFFFFF 抽奖按钮文字颜色
<!-- 样式定制示例:按钮/奖品文字与奖品图尺寸均可自定义(不传则保持插件默认) -->
<wheel-board
  draw-text="GO"
  draw-text-size="36rpx"
  draw-text-color="#FFD700"
  prize-text-size="24rpx"
  prize-text-color="#333333"
  prize-img-size="120rpx"
  :prize-list="prizeList"
  :remain-count="remainCount"
/>
<!-- 换肤示例:底座/灯圈/按钮图均可自定义(不传则保持插件默认) -->
<wheel-board
  bg-img="https://xxx.com/your-base.png"
  ring-img-a="/static/your-ring-a.png"
  ring-img-b="/static/your-ring-b.png"
  draw-btn-img="https://xxx.com/your-btn.png"
  :prize-list="prizeList"
  :remain-count="remainCount"
/>

自定义图片建议与原默认图保持相同的比例与圆心位置:底座需满足"白圆圆心在 (50%, 44.8%) 附近",灯圈需覆盖底座蓝色环带,否则需同步微调 .wheel-stage-coretop / scale

prizeList 项结构参考:

字段 类型 必填 说明
id String/Number 奖品唯一标识,spinTo 按它匹配扇区
prizeName String 奖品名称,展示在扇区内
prizeImg String 奖品图片地址(网络图或本地图)

📡 Events 事件

事件名 说明
draw 点击抽奖按钮触发(已校验奖品非空且次数足够),此时应在父组件请求抽奖接口
spin-end 转盘转动结束触发,回传中奖奖品对象(含 prizeName 时原样回传,否则为 prizeList 中匹配到的完整项)

🧰 实例方法

<wheel-board>ref 后可调用(内部透传到 wheel-panel):

方法 说明
spinTo(prize) 转动到指定奖品,prize 支持奖品对象或奖品 ID;转动约 4.2s 后停在对应扇区并触发 spin-end
stopSpin() 立即复位为静止态(多在抽奖接口异常时调用,避免按钮一直处于旋转锁定)

若直接使用 wheel-panel,以上方法同样由其暴露。

🎨 样式自定义

组件内部类可在外部覆盖(scoped 样式需 :deep() 穿透):

wheel-board(.wheel-stage 内)

类名 说明
.wheel-stage-bg 底座图(默认铺满全宽,widthFix
.wheel-stage-core 转盘居中容器(灯圈与转盘叠放层,含缩放/居中定位)
.light-ring / .light-ring-a / .light-ring-b 两帧灯圈图,交替闪烁

wheel-panel(.wheel-wrap 内)

类名 说明
.wheel 圆形转盘主体(白色圆底 + 阴影)
.sector-line 扇区放射分隔线
.prize-item / .prize-img / .prize-name 单个奖品位(图片 / 名称)
.draw-btn 中央抽奖按钮(spinning 时降低透明度)

⚠️ 使用注意事项

  1. 停位依赖 idspinTo 通过 idprizeList 中查找对应扇区,请确保奖品数据已提前渲染;未命中时默认停在首个扇区
  2. 剩余次数remainCount 由父组件维护,可在 draw 回调里调接口、在 spin-end 回调里刷新次数
  3. 转动时长:内置转动 6 整圈 + 停位,约 4.2s,spin-end 在动画结束后触发
  4. 图片替换:底座与两帧灯圈通过 bg-img / ring-img-a / ring-img-b、抽奖按钮通过 draw-btn-img props 传自定义图片换肤;不传时使用插件 static 目录内置图(也可直接替换 static/lp-bg.png 等同名文件)。替换后若对位不准,微调 .wheel-stage-core 中的 top / scale
  5. 避免与组件标签同名:页面(<script setup>)内不要定义与标签同名的局部变量或函数(如 wheelBoard),否则 Vue 编译时局部变量优先于 easycom 组件,<wheel-board> 会被解析成该局部变量而非组件,请使用不与标签冲突的命名
  6. 仅转盘骨架:本插件不含弹层/结果弹窗等业务 UI,中奖展示由父页面自行实现(可参考 spin-end 回传的奖品)

📞 更新日志

v1.0.0(2026-09-09)

  • 🎉 首个版本发布:以 uni_modules 插件(easycom 自动引入)形态封装幸运转盘
  • wheel-board 组合底座图 + 双帧灯圈闪烁 + wheel-panel 转盘,暴露 draw / spin-end 事件与 spinTo / stopSpin 实例方法
  • wheel-panel 支持奖品自适应扇形布局、扇区分隔线、旋转动画与精准停位
  • 底座 / 灯圈 / 按钮图片内置插件 static 目录,发布即用
  • 提供 prizeList(含 prizeName / prizeImg)与 remainCount 配置,点击抽奖自动处理空奖品与次数用尽提示
  • 支持换肤:bg-img / ring-img-a / ring-img-b 自定义底座与两帧灯圈图,不传使用插件内置默认图
  • 抽奖按钮文案可配:draw-text 自定义按钮文字,默认"抽奖"

祝您使用愉快! 🎉

隐私、权限声明

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

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

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

许可协议

MIT协议

暂无用户评论。