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
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 |
|
}
|
|
|