更新记录

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

安装

方式一:插件市场导入(推荐)

  1. 打开 DCloud 插件市场,搜索 nny-lottery
  2. 点击「使用 HBuilderX 导入插件」或「下载插件 ZIP」
  3. 导入后项目目录出现 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-wheelstart / 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

发布到插件市场(作者)

  1. 用 HBuilderX 打开包含本插件的项目
  2. 在项目管理器中找到 uni_modules/nny-lottery
  3. 右键 → 发布到插件市场(或登录 ext.dcloud.net.cn 上传 ZIP)
  4. 上传时只需包含 uni_modules/nny-lottery 目录内容
  5. 填写插件介绍、截图(建议包含转盘、九宫格、中奖弹窗三张效果图)

演示项目

本仓库为完整演示工程,导入插件后可参考以下页面:

页面 路径 说明
入口 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 图标仅供演示,商用请替换为自有素材。

更新日志

changelog.md

隐私、权限声明

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

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

插件不采集任何用户数据

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

许可协议

MIT协议

暂无用户评论。