wux-weapp
Version:
一套组件化、可复用、易扩展的微信小程序 UI 组件库
215 lines (211 loc) • 5.67 kB
JavaScript
import baseComponent from '../helpers/baseComponent'
import classNames from '../helpers/libs/classNames'
import styleToCssString from '../helpers/libs/styleToCssString'
import eventsMixin from '../helpers/mixins/eventsMixin'
import { useNativeRoute } from '../helpers/hooks/useNativeRoute'
import { useRect } from '../helpers/hooks/useDOM'
const defaultEvents = {
onClick() {},
onError() {},
}
baseComponent({
behaviors: [eventsMixin({ defaultEvents })],
relations: {
'../cell-group/index': {
type: 'ancestor',
},
'../picker/index': {
type: 'parent',
},
'../date-picker/index': {
type: 'parent',
},
'../popup-select/index': {
type: 'parent',
},
},
properties: {
prefixCls: {
type: String,
value: 'wux-cell',
},
disabled: {
type: Boolean,
value: false,
},
hoverClass: {
type: String,
value: 'default',
},
hoverStopPropagation: {
type: Boolean,
value: false,
},
hoverStartTime: {
type: Number,
value: 20,
},
hoverStayTime: {
type: Number,
value: 70,
},
lang: {
type: String,
value: 'en',
},
sessionFrom: {
type: String,
value: '',
},
sendMessageTitle: {
type: String,
value: '',
},
sendMessagePath: {
type: String,
value: '',
},
sendMessageImg: {
type: String,
value: '',
},
showMessageCard: {
type: Boolean,
value: false,
},
appParameter: {
type: String,
value: '',
},
thumb: {
type: String,
value: '',
},
title: {
type: String,
value: '',
},
label: {
type: String,
value: '',
},
extra: {
type: String,
value: '',
},
hasLine: {
type: Boolean,
value: true,
},
isLink: {
type: Boolean,
value: false,
},
openType: {
type: String,
value: 'navigateTo',
},
url: {
type: String,
value: '',
},
delta: {
type: Number,
value: 1,
},
wrapStyle: {
type: [String, Object],
value: '',
observer(newVal) {
this.setData({
extStyle: styleToCssString(newVal),
})
},
},
align: {
type: String,
value: 'center',
},
},
data: {
isLast: false,
extStyle: '',
},
computed: {
classes: ['prefixCls, hoverClass, isLast, hasLine, isLink, disabled, align', function(prefixCls, hoverClass, isLast, hasLine, isLink, disabled, align) {
const wrap = classNames(prefixCls, {
[`${prefixCls}--last`]: isLast,
[`${prefixCls}--has-line`]: hasLine,
[`${prefixCls}--access`]: isLink,
[`${prefixCls}--disabled`]: disabled,
[`${prefixCls}--align-${align}`]: align,
})
const hd = `${prefixCls}__hd`
const thumb = `${prefixCls}__thumb`
const bd = `${prefixCls}__bd`
const text = `${prefixCls}__text`
const desc = `${prefixCls}__desc`
const ft = `${prefixCls}__ft`
const arrow = `${prefixCls}__arrow`
const hover = hoverClass && hoverClass !== 'default' ? hoverClass : `${prefixCls}--hover`
return {
wrap,
hd,
thumb,
bd,
text,
desc,
ft,
arrow,
hover,
}
}],
},
methods: {
onTap() {
const { disabled, url, isLink, openType, delta } = this.data
if (!disabled) {
this.triggerEvent('click')
if (isLink && url) {
useNativeRoute({
url,
openType,
delta,
}, this)
}
}
},
bindgetuserinfo(e) {
this.triggerEvent('getuserinfo', e.detail)
},
bindcontact(e) {
this.triggerEvent('contact', e.detail)
},
bindgetphonenumber(e) {
this.triggerEvent('getphonenumber', e.detail)
},
bindopensetting(e) {
this.triggerEvent('opensetting', e.detail)
},
bindlaunchapp(e) {
this.triggerEvent('launchapp', e.detail)
},
bindchooseavatar(e) {
this.triggerEvent('chooseavatar', e.detail)
},
onError(e) {
this.triggerEvent('error', e.detail)
},
updateIsLastElement(isLast) {
if(isLast === this.data.isLast) return;
this.setData({ isLast })
},
getBoundingClientRect(callback) {
useRect(`.${this.data.prefixCls}`, this)
.then((rect) => {
if (!rect) return
callback.call(this, rect.height, rect)
})
},
},
})