feat: ui update
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
import { logger } from '../../utils/logger'
|
||||
|
||||
// 日志模块名
|
||||
const LOG = 'v2-overlay'
|
||||
|
||||
/**
|
||||
* v2 统一玻璃弹层。
|
||||
*
|
||||
* 三类形态:
|
||||
* modal 居中玻璃卡(确认/提示),buttons 决定按钮,事件 confirm/cancel
|
||||
* actionsheet 底部动作表(选择),items 决定条目,事件 select/cancel
|
||||
* toast 深色玻璃胶囊,duration 后自动关闭并抛出 close
|
||||
*
|
||||
* 页面侧只维护 visible 与文案数据,回调分支与原生 wx.showModal 一一对应。
|
||||
*/
|
||||
Component({
|
||||
properties: {
|
||||
visible: { type: Boolean, value: false },
|
||||
type: { type: String, value: 'modal' },
|
||||
title: { type: String, value: '' },
|
||||
content: { type: String, value: '' },
|
||||
// modal 按钮:[{ text, value, type: 'main' | 'normal' }]
|
||||
buttons: { type: Array, value: [] },
|
||||
// actionsheet 条目:['拍照', '从相册选择'] 或 [{ text, value }]
|
||||
items: { type: Array, value: [] },
|
||||
cancelText: { type: String, value: '取消' },
|
||||
// toast 自动关闭时长(ms)
|
||||
duration: { type: Number, value: 1800 },
|
||||
},
|
||||
|
||||
observers: {
|
||||
visible(v: boolean) {
|
||||
if (!v) {
|
||||
this.clearTimer()
|
||||
return
|
||||
}
|
||||
if (this.data.type === 'toast') this.startTimer()
|
||||
},
|
||||
},
|
||||
|
||||
lifetimes: {
|
||||
detached() {
|
||||
this.clearTimer()
|
||||
},
|
||||
},
|
||||
|
||||
methods: {
|
||||
startTimer() {
|
||||
this.clearTimer()
|
||||
const t = setTimeout(() => {
|
||||
logger.debug(LOG, 'toast 自动关闭')
|
||||
this.triggerEvent('close')
|
||||
}, this.data.duration)
|
||||
;(this as any).timer = t
|
||||
},
|
||||
|
||||
clearTimer() {
|
||||
const t = (this as any).timer
|
||||
if (t) {
|
||||
clearTimeout(t)
|
||||
;(this as any).timer = null
|
||||
}
|
||||
},
|
||||
|
||||
onBtn(e: WechatMiniprogram.TouchEvent) {
|
||||
const index = Number((e.currentTarget.dataset as any).index) || 0
|
||||
const btn = (this.data.buttons[index] || {}) as any
|
||||
logger.debug(LOG, 'modal 按钮点击, index=', index, 'value=', btn.value)
|
||||
this.triggerEvent('confirm', { index, value: btn.value || '' })
|
||||
},
|
||||
|
||||
onItem(e: WechatMiniprogram.TouchEvent) {
|
||||
const index = Number((e.currentTarget.dataset as any).index) || 0
|
||||
const raw = this.data.items[index] as any
|
||||
const value = raw && typeof raw === 'object' ? raw.value || '' : raw
|
||||
logger.debug(LOG, 'actionsheet 条目点击, index=', index, 'value=', value)
|
||||
this.triggerEvent('select', { index, value })
|
||||
},
|
||||
|
||||
onCancel() {
|
||||
logger.debug(LOG, '弹层取消')
|
||||
this.triggerEvent('cancel')
|
||||
},
|
||||
|
||||
// 阻断蒙层下的页面滚动
|
||||
noop() {},
|
||||
},
|
||||
})
|
||||
Reference in New Issue
Block a user