2022-12-05 16:53:29 +08:00

143 lines
3.0 KiB
TypeScript

import { isDef, isNumber, isPlainObject, isPromise, isObj } from './validator';
import {
canIUseGroupSetData,
canIUseNextTick,
getSystemInfoSync,
} from './version';
export { isDef } from './validator';
export { getSystemInfoSync } from './version';
export function range(num: number, min: number, max: number) {
return Math.min(Math.max(num, min), max);
}
export function nextTick(cb: (...args: any[]) => void) {
if (canIUseNextTick()) {
wx.nextTick(cb);
} else {
setTimeout(() => {
cb();
}, 1000 / 30);
}
}
export function addUnit(value?: string | number): string | undefined {
if (!isDef(value)) {
return undefined;
}
value = String(value);
return isNumber(value) ? `${value}px` : value;
}
export function requestAnimationFrame(cb: () => void) {
const systemInfo = getSystemInfoSync();
if (systemInfo.platform === 'devtools') {
return setTimeout(() => {
cb();
}, 1000 / 30);
}
return wx
.createSelectorQuery()
.selectViewport()
.boundingClientRect()
.exec(() => {
cb();
});
}
export function pickExclude(obj: unknown, keys: string[]) {
if (!isPlainObject(obj)) {
return {};
}
return Object.keys(obj).reduce((prev, key) => {
if (!keys.includes(key)) {
prev[key] = obj[key];
}
return prev;
}, {});
}
export function getRect(
context: WechatMiniprogram.Component.TrivialInstance,
selector: string
) {
return new Promise<WechatMiniprogram.BoundingClientRectCallbackResult>(
(resolve) => {
wx.createSelectorQuery()
.in(context)
.select(selector)
.boundingClientRect()
.exec((rect = []) => resolve(rect[0]));
}
);
}
export function getAllRect(
context: WechatMiniprogram.Component.TrivialInstance,
selector: string
) {
return new Promise<WechatMiniprogram.BoundingClientRectCallbackResult[]>(
(resolve) => {
wx.createSelectorQuery()
.in(context)
.selectAll(selector)
.boundingClientRect()
.exec((rect = []) => resolve(rect[0]));
}
);
}
export function groupSetData(
context: WechatMiniprogram.Component.TrivialInstance,
cb: () => void
) {
if (canIUseGroupSetData()) {
context.groupSetData(cb);
} else {
cb();
}
}
export function toPromise(promiseLike: Promise<unknown> | unknown) {
if (isPromise(promiseLike)) {
return promiseLike;
}
return Promise.resolve(promiseLike);
}
export function getCurrentPage<T>() {
const pages = getCurrentPages();
return pages[pages.length - 1] as T & WechatMiniprogram.Page.TrivialInstance;
}
export function deepClone<T extends Record<string, any> | null | undefined>(
obj: T
): T {
if (!isDef(obj)) {
return obj;
}
if (Array.isArray(obj)) {
return obj.map((item) => deepClone(item)) as unknown as T;
}
if (isObj(obj)) {
const to = {} as Record<string, any>;
Object.keys(obj).forEach((key: string) => {
// @ts-ignore
to[key] = deepClone(obj[key]);
});
return to as T;
}
return obj;
}