更新记录
1.0.1(2026-06-29) 下载此版本
- 优化中奖弹窗
nny-result入场动画(分层递进、光效、纸屑、扫光) - 内置演示图标迁移至插件
static/icons,导入即可使用 - 新增
index.js统一导出工具函数与演示数据 - 完善插件市场使用说明文档
平台兼容性
uni-app(4.18)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ | √ | √ | √ |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ |
nny-lottery 抽奖组件
一套开箱即用的 uni-app 抽奖组件库,包含 转盘抽奖、九宫格抽奖、中奖结果弹窗 三个组件。轻奢紫韵 UI,一套代码适配微信小程序、H5、Android/iOS App。
功能特性
| 功能 | 说明 |
|---|---|
转盘抽奖 nny-wheel |
CSS 扇形分区 + 流畅旋转,支持 4~12 个奖品 |
九宫格抽奖 nny-grid |
跑马灯高亮,先快后慢绕圈 |
中奖弹窗 nny-result |
分层入场动画、光效纸屑、可自定义文案 |
| 权重随机 | 按 weight 字段控制概率 |
| 次数限制 | 展示剩余次数,耗尽触发 no-chance |
| 指定中奖 | targetIndex 由服务端控制结果 |
| 程序触发 | play(index) 方法外部调用抽奖 |
| 图标灵活 | 支持网络图、本地路径、插件内置 SVG |
安装
方式一:插件市场导入(推荐)
- 打开 DCloud 插件市场,搜索 nny-lottery
- 点击「使用 HBuilderX 导入插件」或「下载插件 ZIP」
- 导入后项目目录出现
uni_modules/nny-lottery即安装成功
方式二:手动复制
将 uni_modules/nny-lottery 整个文件夹复制到目标项目的 uni_modules 目录下。
要求:uni-app Vue3 项目,HBuilderX 3.6+
快速开始
组件通过 easycom 自动注册,无需 import 组件,直接在页面中使用。
转盘抽奖
<template>
<view>
<nny-wheel
ref="wheelRef"
:prizes="prizes"
:chances="chances"
@end="onEnd"
@no-chance="onNoChance"
/>
<nny-result
:visible="showResult"
@update:visible="showResult = $event"
:prize="resultPrize"
:is-win="isWin"
/>
</view>
</template>
<script>
export default {
data() {
return {
chances: 3,
showResult: false,
resultPrize: null,
isWin: true,
prizes: [
{ name: '10元券', icon: 'https://example.com/coupon.png', weight: 20 },
{ name: '100积分', icon: 'https://example.com/coin.png', weight: 30 },
{ name: '谢谢参与', icon: 'https://example.com/smile.png', weight: 50 }
// 建议 4~8 个奖品,体验最佳
]
}
},
methods: {
onEnd({ prize }) {
this.resultPrize = prize
this.isWin = prize.name !== '谢谢参与'
this.showResult = true
if (this.chances > 0) this.chances--
},
onNoChance() {
uni.showToast({ title: '今日次数已用完', icon: 'none' })
}
}
}
</script>
九宫格抽奖
<template>
<nny-grid
:prizes="prizes"
:chances="5"
:rounds="4"
:speed="70"
@end="onEnd"
/>
</template>
<script>
export default {
data() {
return {
// 九宫格固定 8 个奖品(中心为抽奖按钮)
prizes: [
{ name: '一等奖', icon: '/static/prize1.png', weight: 1 },
{ name: '二等奖', icon: '/static/prize2.png', weight: 3 },
{ name: '三等奖', icon: '/static/prize3.png', weight: 5 },
{ name: '优惠券', icon: '/static/coupon.png', weight: 15 },
{ name: '积分', icon: '/static/coin.png', weight: 20 },
{ name: '饮品券', icon: '/static/drink.png', weight: 20 },
{ name: '周边', icon: '/static/gift.png', weight: 15 },
{ name: '谢谢参与', icon: '/static/thanks.png', weight: 26 }
]
}
},
methods: {
onEnd({ prize }) {
console.log('抽中:', prize.name)
}
}
}
</script>
使用插件内置演示数据(可选)
插件提供了可直接使用的演示奖品数据与图标:
import { DEMO_WHEEL_PRIZES, DEMO_GRID_PRIZES } from '@/uni_modules/nny-lottery'
export default {
data() {
return {
prizes: DEMO_WHEEL_PRIZES // 或 DEMO_GRID_PRIZES
}
}
}
组件 API
nny-wheel 转盘
Props
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| prizes | Array | [] |
奖品列表,见「奖品数据结构」 |
| size | Number | 680 |
转盘尺寸(rpx) |
| chances | Number | -1 |
剩余次数,-1 不限制 |
| showChances | Boolean | true |
是否显示剩余次数 |
| centerText | String | '立即抽奖' |
中心按钮文字 |
| rounds | Number | 5 |
最少旋转圈数 |
| duration | Number | 4500 |
旋转时长(ms) |
| colors | Array | 内置配色 | 扇区背景渐变色 |
| disabled | Boolean | false |
禁用抽奖 |
| targetIndex | Number | -1 |
指定中奖索引,-1 为权重随机 |
Events
| 事件 | 回调参数 | 说明 |
|---|---|---|
| start | { index } |
开始旋转 |
| end | { index, prize } |
旋转结束 |
| no-chance | — | 次数为 0 时点击 |
Methods(通过 ref 调用)
| 方法 | 参数 | 说明 |
|---|---|---|
| play(index) | 奖品索引 | 程序触发旋转到指定奖品 |
| reset() | — | 重置转盘角度与状态 |
<nny-wheel ref="wheelRef" :prizes="prizes" />
this.$refs.wheelRef.play(2) // 转到第 3 个奖品
this.$refs.wheelRef.reset() // 重置
nny-grid 九宫格
Props
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| prizes | Array | [] |
奖品列表(8 个) |
| size | Number | 680 |
整体宽度(rpx) |
| chances | Number | -1 |
剩余次数 |
| showChances | Boolean | true |
显示剩余次数 |
| centerText | String | '开始抽奖' |
中心按钮文字 |
| rounds | Number | 3 |
最少绕圈数 |
| speed | Number | 80 |
初始速度(ms/步) |
| disabled | Boolean | false |
禁用抽奖 |
| targetIndex | Number | -1 |
指定中奖索引 |
Events
同 nny-wheel(start / end / no-chance)。
Methods
| 方法 | 参数 | 说明 |
|---|---|---|
| play(index) | 奖品索引 0~7 | 程序触发抽奖 |
| reset() | — | 重置高亮状态 |
nny-result 中奖弹窗
Props
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| visible | Boolean | false |
是否显示(配合 update:visible 实现双向绑定) |
| prize | Object | null |
奖品对象 |
| isWin | Boolean | true |
是否中奖态(控制动画与文案) |
| confirmText | String | '开心收下' |
确认按钮文字 |
| maskClosable | Boolean | true |
点击遮罩是否关闭 |
Events
| 事件 | 回调参数 | 说明 |
|---|---|---|
| update:visible | Boolean |
显示状态变化(用于 v-model) |
| confirm | prize |
点击确认按钮 |
| close | — | 弹窗关闭(确认或点 × 或遮罩) |
用法示例
<!-- Vue3 双向绑定写法 -->
<nny-result
v-model:visible="showResult"
:prize="resultPrize"
:is-win="isWin"
confirm-text="立即领取"
:mask-closable="false"
@confirm="handleClaim"
/>
<!-- 兼容写法 -->
<nny-result
:visible="showResult"
@update:visible="showResult = $event"
:prize="resultPrize"
:is-win="isWin"
/>
奖品数据结构
{
name: '10元券', // 【必填】奖品名称
icon: 'https://.../a.png', // 【推荐】图标地址(网络图或本地路径)
weight: 20, // 【可选】权重,越大越容易中,默认 1
desc: '满50元可用', // 【可选】弹窗描述
tag: '热门', // 【可选】角标文字
color: '#7C3AED' // 【可选】角标背景色
}
图标路径说明:
| 类型 | 示例 | 说明 |
|---|---|---|
| 网络图 | https://cdn.example.com/icon.png |
小程序需配置 downloadFile 合法域名 |
| 项目本地 | /static/icons/gift.png |
放在项目 static 目录 |
| 插件内置 | /uni_modules/nny-lottery/static/icons/gift.svg |
插件自带 SVG,免域名配置 |
服务端控制中奖(推荐)
实际业务中,中奖结果应由服务端决定,前端只负责展示动画:
<template>
<nny-wheel
ref="wheelRef"
:prizes="prizes"
:disabled="drawing"
@start="onStart"
@end="onEnd"
/>
</template>
<script>
export default {
data() {
return {
drawing: false,
prizes: [/* ... */]
}
},
methods: {
async onStart() {
this.drawing = true
try {
const res = await uni.request({ url: 'https://api.example.com/lottery/draw' })
const index = res.data.prizeIndex
this.$refs.wheelRef.play(index)
} catch (e) {
this.drawing = false
uni.showToast({ title: '抽奖失败', icon: 'none' })
}
},
onEnd({ prize }) {
this.drawing = false
// 展示结果弹窗...
}
}
}
</script>
注意:若使用
targetIndex属性,需在用户点击之前设置好值;更推荐用play(index)在接口返回后触发。
工具函数
可从插件入口按需导入:
import {
pickByWeight, // 按权重随机选索引
calcWheelAngle, // 计算转盘目标角度
buildGridSteps, // 生成九宫格跑马灯路径
WHEEL_GRADIENTS, // 默认扇区配色
DEMO_WHEEL_PRIZES, // 转盘演示数据
DEMO_GRID_PRIZES, // 九宫格演示数据
THEME // 主题色常量
} from '@/uni_modules/nny-lottery'
平台兼容
| 平台 | 支持 |
|---|---|
| 微信小程序 | ✓ |
| H5 | ✓ |
| Android App | ✓ |
| iOS App | ✓ |
| 支付宝 / 百度 / 字节 / QQ 等小程序 | ✓ |
目录结构
uni_modules/nny-lottery/
├── components/
│ ├── nny-wheel/ # 转盘组件
│ ├── nny-grid/ # 九宫格组件
│ └── nny-result/ # 中奖弹窗
├── common/
│ └── lottery-utils.js # 工具函数与演示数据
├── static/
│ └── icons/ # 内置 SVG 图标
├── index.js # 插件入口
├── package.json
├── readme.md
└── changelog.md
发布到插件市场(作者)
- 用 HBuilderX 打开包含本插件的项目
- 在项目管理器中找到
uni_modules/nny-lottery - 右键 → 发布到插件市场(或登录 ext.dcloud.net.cn 上传 ZIP)
- 上传时只需包含
uni_modules/nny-lottery目录内容 - 填写插件介绍、截图(建议包含转盘、九宫格、中奖弹窗三张效果图)
演示项目
本仓库为完整演示工程,导入插件后可参考以下页面:
| 页面 | 路径 | 说明 |
|---|---|---|
| 入口 | pages/index |
选择转盘 / 九宫格 |
| 转盘 | pages/wheel |
转盘抽奖完整流程 |
| 九宫格 | pages/grid |
九宫格抽奖完整流程 |
HBuilderX 运行到微信开发者工具 / 浏览器 / 真机即可预览。
常见问题
Q:组件不显示?
确认项目为 Vue3,且 uni_modules/nny-lottery 目录完整。easycom 默认自动扫描 uni_modules,一般无需额外配置。
Q:小程序图标不显示?
网络图需在小程序后台配置 downloadFile 合法域名;或改用 /uni_modules/nny-lottery/static/icons/ 下的本地 SVG。
Q:如何自定义扇区颜色?
给 nny-wheel 传入 colors 数组,每项为 CSS 渐变字符串,参考 WHEEL_GRADIENTS。
Q:九宫格奖品顺序?
8 个奖品按顺时针排列:上排左→右、右列上→下、下排右→左、左列下→上(中心为按钮)。
版权声明
插件内置 SVG 图标仅供演示,商用请替换为自有素材。

收藏人数:
下载插件并导入HBuilderX
下载示例项目ZIP
赞赏(0)
下载 10
赞赏 0
下载 12364649
赞赏 1926
赞赏
京公网安备:11010802035340号