wux-weapp
Version:
一套组件化、可复用、易扩展的微信小程序 UI 组件库
132 lines (124 loc) • 3.13 kB
JavaScript
import baseComponent from '../helpers/baseComponent'
baseComponent({
useExport: true,
properties: {
prefixCls: {
type: String,
value: 'wux-backdrop',
},
transparent: {
type: Boolean,
value: false,
},
zIndex: {
type: Number,
value: 1000,
},
classNames: {
type: null,
value: 'wux-animate--fadeIn',
},
mountOnEnter: {
type: Boolean,
value: true,
},
unmountOnExit: {
type: Boolean,
value: true,
},
visible: {
type: Boolean,
value: false,
observer(newVal) {
this.setActive(newVal)
if (!newVal) {
this._backdropHolds = 0
}
},
},
},
data: {
active: false,
},
computed: {
classes: ['prefixCls, transparent', function(prefixCls, transparent) {
const wrap = transparent ? `${prefixCls}--transparent` : prefixCls
const bd = `${prefixCls}__bd`
const btn = `${prefixCls}__aria-btn`
return {
wrap,
bd,
btn,
}
}],
},
methods: {
/**
* 设置组件是否可见
*/
setActive(active) {
if (this.data.active !== active) {
this.setData({
active,
})
}
},
/**
* 完全展示后触发
*/
onEntered() {
this.triggerEvent('showed')
},
/**
* 完全关闭后触发
*/
onExited() {
this.triggerEvent('closed')
},
/**
* 点击事件
*/
onClick() {
this.triggerEvent('click')
},
/**
* 阻止冒泡
*/
noop() {},
['export']() {
const self = this
/**
* 保持锁定
*/
const retain = () => {
if (typeof this._backdropHolds !== 'number' || !this._backdropHolds) {
this._backdropHolds = 0
}
this._backdropHolds = this._backdropHolds + 1
if (this._backdropHolds === 1) {
this.setActive(true)
}
}
/**
* 释放锁定
*/
const release = () => {
if (this._backdropHolds === 1) {
this.setActive(false)
}
this._backdropHolds = Math.max(0, this._backdropHolds - 1)
}
return {
retain,
release,
get backdropHolds() {
return self._backdropHolds || 0
},
}
},
},
attached() {
const { visible: active } = this.data
this.setActive(active)
},
})