货无忧
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

319 lines
7.9 KiB

/* eslint-disable no-prototype-builtins */
import { RegUtil } from '../../index'
/**
* 生成uuid
* @returns string
*/
function uuid() {
return CommonUtil.s4() + CommonUtil.s4() + CommonUtil.s4() + CommonUtil.s4() + CommonUtil.s4() + CommonUtil.s4() + CommonUtil.s4() + CommonUtil.s4()
}
function s4() {
return Math.floor((1 + Math.random()) * 0x10000)
.toString(16)
.substring(1)
}
/**
* 深层取值
* 例如获取address.province.city.district.name
* 用法 let name = getDeepObj(['province', 'city', 'district', 'name'], address)
*/
function getDeepObj(p: Array<object>, o: string) {
return p.reduce(function (xs: any, x: any) {
return xs && xs[x] ? xs[x] : null
}, o)
}
/**
* 获取节点信息
* @param selector 节点 #id,.class
* @param all 是否返回所有 selector 对应的节点
* @param scope 作用域(支付宝小程序无效)
* @returns
*/
function getRect(selector: string, all: boolean, scope?: any) {
return new Promise((resolve) => {
let query: UniNamespace.SelectorQuery | null = null
// #ifndef MP-ALIPAY
query = uni.createSelectorQuery().in(scope)
// #endif
// #ifdef MP-ALIPAY
query = uni.createSelectorQuery()
// #endif
query[all ? 'selectAll' : 'select'](selector)
.boundingClientRect((rect) => {
if (all && Array.isArray(rect) && rect.length) {
resolve(rect)
}
if (!all && rect) {
resolve(rect)
}
})
.exec()
})
}
/**
* 获取当前页面
* @returns 页面对象
*/
function getCurrentPage() {
const pages = getCurrentPages()
return pages[pages.length - 1]
}
/**
*
* 用于获取用户传递值的px值
* 如果用户传递了"xxpx"或者"xxrpx",取出其数值部分,如果是"xxxrpx"还需要用过uni.upx2px进行转换
* @param value 用户传递的值
* @param unit 是否加上单位
* @returns
*/
function getPx(value: string | number, unit: boolean = false) {
if (RegUtil.isNumber(String(value))) {
return unit ? `${value}px` : value
}
// 如果带有rpx,先取出其数值部分,再转为px值
if (/(rpx|upx)$/.test(String(value))) {
return unit ? `${uni.upx2px(parseInt(String(value)))}px` : uni.upx2px(parseInt(String(value)))
}
// 如果带有px,直接取出数值
if (/(px)$/.test(String(value))) {
return unit ? value : parseInt(String(value))
}
return unit ? `${parseInt(String(value))}px` : parseInt(String(value))
}
/**
* 获取机器系统
* @returns 系统
*/
function os() {
return uni.getSystemInfoSync().platform.toLowerCase()
}
/**
* 动画
* @param cb 回调
* @returns
*/
function requestAnimationFrame(cb: () => void) {
const timer = setTimeout(() => {
clearTimeout(timer)
cb()
}, 1000 / 60)
}
/**
* 深拷贝
* @param obj 深度拷贝的对象
* @param cache
* @returns
*/
function deepClone(obj, cache: any = []) {
if (obj === null || typeof obj !== 'object') {
return obj
}
if (Object.prototype.toString.call(obj) === '[object Date]') return new Date(obj)
if (Object.prototype.toString.call(obj) === '[object RegExp]') return new RegExp(obj)
if (Object.prototype.toString.call(obj) === '[object Error]') return new Error(obj)
const item: any = cache.filter((item: any) => item.original === obj)[0]
if (item) return item.copy
const copy = Array.isArray(obj) ? [] : {}
cache.push({
original: obj,
copy
})
Object.keys(obj).forEach((key) => {
copy[key] = CommonUtil.deepClone(obj[key], cache)
})
return copy
}
// JS对象深度合并
function deepMerge(target = {}, source = {}) {
target = CommonUtil.deepClone(target)
if (typeof target !== 'object' || typeof source !== 'object') return false
for (const prop in source) {
if (!source.hasOwnProperty(prop)) continue
if (prop in target) {
if (typeof target[prop] !== 'object') {
target[prop] = source[prop]
} else if (typeof source[prop] !== 'object') {
target[prop] = source[prop]
} else if (target[prop].concat && source[prop].concat) {
target[prop] = target[prop].concat(source[prop])
} else {
target[prop] = CommonUtil.deepMerge(target[prop], source[prop])
}
} else {
target[prop] = source[prop]
}
}
return target
}
/**
* 去除空格
*/
function trim(str: string, pos: string = 'both') {
str = String(str)
if (pos == 'both') {
return str.replace(/^\s+|\s+$/g, '')
}
if (pos == 'left') {
return str.replace(/^\s*/, '')
}
if (pos == 'right') {
return str.replace(/(\s*$)/g, '')
}
if (pos == 'all') {
return str.replace(/\s+/g, '')
}
return str
}
/**
* 驼峰转短横线
* @param word 待转换词条
* @returns
*/
function kebabCase(word) {
const newWord = word
.replace(RegExp('[A-Z]', 'g'), function (i) {
return '-' + i
})
.toLowerCase()
return newWord
}
/**
* 外部传入样式格式化为css可读样式
* @param styles 外部传入样式
* @returns
*/
function style(styles) {
if (RegUtil.isArray(styles)) {
return styles
.filter(function (item) {
return item != null && item !== ''
})
.map(function (item) {
return CommonUtil.style(item)
})
.join(';')
}
if (RegUtil.isObject(styles)) {
return Object.keys(styles)
.filter(function (key) {
return styles[key] != null && styles[key] !== ''
})
.map(function (key) {
return [CommonUtil.kebabCase(key), [styles[key]]].join(':')
})
.join(';')
}
return styles
}
/**
* 将日期格式化为指定格式
* @param date
* @param fmt
* @returns {*|string}
*/
function dateFormat(date, fmt = 'yyyy-MM-dd HH:mm:ss') {
date = date === undefined ? new Date() : date
date = typeof date === 'number' ? new Date(date) : date
fmt = fmt || 'yyyy-MM-dd HH:mm:ss'
const obj = {
y: date.getFullYear(), // 年份,注意必须用getFullYear
M: date.getMonth() + 1, // 月份,注意是从0-11
d: date.getDate(), // 日期
q: Math.floor((date.getMonth() + 3) / 3), // 季度
w: date.getDay(), // 星期,注意是0-6
H: date.getHours(), // 24小时制
h: date.getHours() % 12 === 0 ? 12 : date.getHours() % 12, // 12小时制
m: date.getMinutes(), // 分钟
s: date.getSeconds(), // 秒
S: date.getMilliseconds() // 毫秒
}
const week = ['天', '一', '二', '三', '四', '五', '六']
for (const i in obj) {
fmt = fmt.replace(new RegExp(i + '+', 'g'), function (m) {
let val = obj[i] + ''
if (i === 'w') return (m.length > 2 ? '星期' : '周') + week[val]
for (let j = 0, len = val.length; j < m.length - len; j++) val = '0' + val
return m.length === 1 ? val : val.substring(val.length - m.length)
})
}
return fmt
}
// 针对IOS端对部分日期无效的问题, 包装下fmt的方法
function mobileFormat(value, fmt = 'yyyy-MM-dd HH:mm:ss') {
if (typeof value === 'string') {
// new Date('2020-02-22 18:18:18') ios无效,所以用/替换-
return CommonUtil.dateFormat(new Date(value.replace(/-/g, '/')), fmt)
} else {
return CommonUtil.dateFormat(value, fmt)
}
}
/**
* 添加单位
* 判断是否为数字类型,数字类型添加rpx单位,否则返回原值
*/
function addUnit(value: string | number, unit: 'rpx' | 'px' = 'rpx'): string {
if (!RegUtil.isDef(value)) {
return ''
}
value = String(value)
return RegUtil.isNumber(value) ? `${value}${unit}` : value
}
/**
* 设置参数
* @param path 路径(无参数)
* @param params (参数)
* @returns
*/
function setUrlParams(path: string, params: Record<string, string>) {
for (const key in params) {
if (path.indexOf('?') > -1) {
path = path + `&${key}=${params[key]}`
} else {
path = path + `?${key}=${params[key]}`
}
}
return path
}
export const CommonUtil = {
uuid,
s4,
getDeepObj,
getRect,
getCurrentPage,
getPx,
os,
deepClone,
deepMerge,
trim,
kebabCase,
style,
dateFormat,
mobileFormat,
addUnit,
requestAnimationFrame,
setUrlParams
}