rtaro-ui
Version:
UI KIT for Taro
269 lines (238 loc) • 6.29 kB
text/typescript
import Taro, { SelectorQuery } from '@rtarojs/taro'
const ENV = Taro.getEnv()
declare const process: any
function delay(delayTime = 25): Promise<null> {
return new Promise(resolve => {
setTimeout(() => {
resolve(null)
}, delayTime)
})
}
function delayQuerySelector(
selectorStr: string,
delayTime = 500
): Promise<any[]> {
return new Promise(resolve => {
Taro.nextTick(() => {
const selector: SelectorQuery = Taro.createSelectorQuery()
delay(delayTime).then(() => {
selector
.select(selectorStr)
.boundingClientRect()
.exec((res: any[]) => {
resolve(res)
})
})
})
})
}
function delayGetScrollOffset({ delayTime = 500 }): Promise<any[]> {
return new Promise(resolve => {
delay(delayTime).then(() => {
Taro.createSelectorQuery()
.selectViewport()
.scrollOffset()
.exec((res: any[]) => {
resolve(res)
})
})
})
}
function delayGetClientRect({ selectorStr, delayTime = 500 }): Promise<any[]> {
const selector: SelectorQuery = Taro.createSelectorQuery()
return new Promise(resolve => {
delay(delayTime).then(() => {
selector
.select(selectorStr)
.boundingClientRect()
.exec((res: any[]) => {
resolve(res)
})
})
})
}
function uuid(len = 8, radix = 16): string {
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('')
const value: string[] = []
let i = 0
radix = radix || chars.length
if (len) {
// Compact form
for (i = 0; i < len; i++) value[i] = chars[0 | (Math.random() * radix)]
} else {
// rfc4122, version 4 form
let r
// rfc4122 requires these characters
/* eslint-disable-next-line */
value[8] = value[13] = value[18] = value[23] = '-'
value[14] = '4'
// Fill in random data. At i==19 set the high bits of clock sequence as
// per rfc4122, sec. 4.1.5
for (i = 0; i < 36; i++) {
if (!value[i]) {
r = 0 | (Math.random() * 16)
value[i] = chars[i === 19 ? (r & 0x3) | 0x8 : r]
}
}
}
return value.join('')
}
interface EventDetail {
pageX: number
pageY: number
clientX: number
clientY: number
offsetX: number
offsetY: number
x: number
y: number
}
function getEventDetail(event: any): EventDetail {
let detail: EventDetail
switch (ENV) {
case Taro.ENV_TYPE.WEB:
detail = {
pageX: event.pageX,
pageY: event.pageY,
clientX: event.clientX,
clientY: event.clientY,
offsetX: event.offsetX,
offsetY: event.offsetY,
x: event.x,
y: event.y
}
break
case Taro.ENV_TYPE.WEAPP:
detail = {
pageX: event.touches[0].pageX,
pageY: event.touches[0].pageY,
clientX: event.touches[0].clientX,
clientY: event.touches[0].clientY,
offsetX: event.target.offsetLeft,
offsetY: event.target.offsetTop,
x: event.target.x,
y: event.target.y
}
break
case Taro.ENV_TYPE.ALIPAY:
detail = {
pageX: event.target.pageX,
pageY: event.target.pageY,
clientX: event.target.clientX,
clientY: event.target.clientY,
offsetX: event.target.offsetLeft,
offsetY: event.target.offsetTop,
x: event.target.x,
y: event.target.y
}
break
case Taro.ENV_TYPE.SWAN:
detail = {
pageX: event.changedTouches[0].pageX,
pageY: event.changedTouches[0].pageY,
clientX: event.target.clientX,
clientY: event.target.clientY,
offsetX: event.target.offsetLeft,
offsetY: event.target.offsetTop,
x: event.detail.x,
y: event.detail.y
}
break
default:
detail = {
pageX: 0,
pageY: 0,
clientX: 0,
clientY: 0,
offsetX: 0,
offsetY: 0,
x: 0,
y: 0
}
console.warn('getEventDetail暂未支持该环境')
break
}
return detail
}
function initTestEnv(): void {
if (process.env.NODE_ENV === 'test') {
Taro.initPxTransform({
designWidth: 750,
deviceRatio: {
'640': 2.34 / 2,
'750': 1,
'828': 1.81 / 2
}
})
}
}
function isTest(): boolean {
return process.env.NODE_ENV === 'test'
}
let scrollTop = 0
function handleTouchScroll(flag: any): void {
if (ENV !== Taro.ENV_TYPE.WEB) {
return
}
if (flag) {
scrollTop = document.documentElement.scrollTop
// 使body脱离文档流
document.body.classList.add('at-frozen')
// 把脱离文档流的body拉上去!否则页面会回到顶部!
document.body.style.top = `${-scrollTop}px`
} else {
document.body.style.top = ''
document.body.classList.remove('at-frozen')
document.documentElement.scrollTop = scrollTop
}
}
function pxTransform(size: number): string {
if (!size) return ''
return Taro.pxTransform(size)
}
function objectToString(style: object | string): string {
if (style && typeof style === 'object') {
let styleStr = ''
Object.keys(style).forEach(key => {
const lowerCaseKey = key.replace(/([A-Z])/g, '-$1').toLowerCase()
styleStr += `${lowerCaseKey}:${style[key]};`
})
return styleStr
} else if (style && typeof style === 'string') {
return style
}
return ''
}
/**
* 合并 style
* @param {Object|String} style1
* @param {Object|String} style2
* @returns {String}
*/
function mergeStyle(
style1: object | string,
style2: object | string
): object | string {
if (
style1 &&
typeof style1 === 'object' &&
style2 &&
typeof style2 === 'object'
) {
return Object.assign({}, style1, style2)
}
return objectToString(style1) + objectToString(style2)
}
export {
delay,
delayQuerySelector,
uuid,
getEventDetail,
initTestEnv,
isTest,
pxTransform,
handleTouchScroll,
delayGetClientRect,
delayGetScrollOffset,
mergeStyle
}