smoke-record-dialog 组件
📦 组件说明
抽烟记录弹框组件,用于记录抽烟或抵抗记录。从底部弹出,半屏展示。
🎯 组件特性
- ✅ 符合 uni-app/微信小程序规范的组件结构
- ✅ 使用 Options API(兼容性更好)
- ✅ 从底部弹出动画效果
- ✅ 半屏展示,优化用户体验
- ✅ 支持两种模式:抽烟记录 / 忍住记录
- ✅ 完整的表单功能
- ✅ 已配置 easycom 自动导入
📁 文件结构
components/
└── smoke-record-dialog/
├── smoke-record-dialog.vue # 组件主文件
└── README.md # 组件文档
🚀 快速使用
组件已配置 easycom 自动导入,无需手动 import:
<template>
<view>
<button @tap="showDialog = true">记录抽烟</button>
<smoke-record-dialog
v-model:show="showDialog"
type="smoke"
@submit="handleSubmit"
/>
</view>
</template>
<script setup>
import { ref } from 'vue'
const showDialog = ref(false)
function handleSubmit(data) {
console.log('提交数据:', data)
// 处理提交逻辑...
}
</script>
📝 Props
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| show | Boolean | false | 控制弹框显示/隐藏(支持 v-model) |
| type | String | 'smoke' | 记录类型:'smoke'(抽烟) 或 'resisted'(忍住) |
🎪 Events
| 事件名 | 参数 | 说明 |
|---|---|---|
| update:show | Boolean | 弹框状态改变时触发(v-model 绑定) |
| submit | Object | 提交表单时触发 |
📤 提交数据格式
{
smoke_time: "2025-01-25", // 日期
smoke_at: "2025-01-25 14:30:00", // 完整时间
remark: "压力大", // 备注(可选)
level: 2, // 烟瘾等级 1-5
num: 3 // 数量(忍住时为0)
}
💡 使用示例
示例 1:记录抽烟
<template>
<view>
<button @tap="openSmokeDialog">记录抽烟</button>
<smoke-record-dialog
v-model:show="showDialog"
type="smoke"
@submit="onSmokeSubmit"
/>
</view>
</template>
<script setup>
import { ref } from 'vue'
import * as api from '@/api'
const showDialog = ref(false)
function openSmokeDialog() {
showDialog.value = true
}
async function onSmokeSubmit(data) {
await api.createLog(data)
uni.showToast({ title: '记录成功', icon: 'success' })
}
</script>
示例 2:记录忍住
<template>
<view>
<button @tap="openResistedDialog">想抽忍住了</button>
<smoke-record-dialog
v-model:show="showDialog"
type="resisted"
@submit="onResistedSubmit"
/>
</view>
</template>
<script setup>
import { ref } from 'vue'
import * as api from '@/api'
const showDialog = ref(false)
function openResistedDialog() {
showDialog.value = true
}
async function onResistedSubmit(data) {
await api.createLog(data)
uni.showToast({ title: '太棒了!', icon: 'success' })
}
</script>
🎨 样式说明
- 弹框背景:半透明黑色遮罩
- 容器样式:纯白背景,顶部圆角
- 主题色:#10B981(翡翠绿)
- 动画效果:0.3s 缓入缓出过渡
⚙️ 配置说明
组件已在 pages.json 中配置 easycom:
{
"easycom": {
"autoscan": true,
"custom": {
"^smoke-record-dialog$": "@/components/smoke-record-dialog/smoke-record-dialog.vue"
}
}
}
🔧 技术栈
- Vue 2 Options API
- uni-app 组件规范
- 微信小程序兼容
⚠️ 注意事项
- 组件使用 Options API 而非 Composition API,以确保更好的兼容性
- 组件名使用小写加连字符(kebab-case),符合 uni-app 规范
- 已配置 easycom,无需手动导入
- 提交后弹框会自动关闭
- 表单数据会在打开时自动初始化为当前时间