import { prefix } from './config'; const systemInfo = wx.getSystemInfoSync(); export const debounce = function (func, wait = 500) { let timerId; return function (...rest) { if (timerId) { clearTimeout(timerId); } timerId = setTimeout(() => { func.apply(this, rest); }, wait); }; }; export const throttle = (func, wait = 100, options = null) => { let previous = 0; let timerid = null; if (!options) { options = { leading: true, }; } return function (...args) { const now = Date.now(); if (!previous && !options.leading) previous = now; const remaining = wait - (now - previous); const context = this; if (remaining <= 0) { if (timerid) { clearTimeout(timerid); timerid = null; } previous = now; func.apply(context, args); } }; }; export const classNames = function (...args) { const hasOwn = {}.hasOwnProperty; const classes = []; args.forEach((arg) => { if (!arg) return; const argType = typeof arg; if (argType === 'string' || argType === 'number') { classes.push(arg); } else if (Array.isArray(arg) && arg.length) { const inner = classNames(...arg); if (inner) { classes.push(inner); } } else if (argType === 'object') { for (const key in arg) { if (hasOwn.call(arg, key) && arg[key]) { classes.push(key); } } } }); return classes.join(' '); }; export const styles = function (styleObj) { return Object.keys(styleObj) .map((styleKey) => `${styleKey}: ${styleObj[styleKey]}`) .join('; '); }; export const getAnimationFrame = function (cb) { return wx .createSelectorQuery() .selectViewport() .boundingClientRect() .exec(() => { cb(); }); }; export const getRect = function (context, selector, needAll = false) { return new Promise((resolve, reject) => { wx.createSelectorQuery() .in(context)[needAll ? 'selectAll' : 'select'](selector) .boundingClientRect((rect) => { if (rect) { resolve(rect); } else { reject(rect); } }) .exec(); }); }; const isDef = function (value) { return value !== undefined && value !== null; }; export const isNumber = function (value) { return /^\d+(\.\d+)?$/.test(value); }; export const addUnit = function (value) { if (!isDef(value)) { return undefined; } value = String(value); return isNumber(value) ? `${value}px` : value; }; export const getCharacterLength = (type, str, max) => { if (!str || str.length === 0) { return { length: 0, characters: '', }; } if (type === 'maxcharacter') { let len = 0; for (let i = 0; i < str.length; i += 1) { let currentStringLength = 0; if (str.charCodeAt(i) > 127 || str.charCodeAt(i) === 94) { currentStringLength = 2; } else { currentStringLength = 1; } if (len + currentStringLength > max) { return { length: len, characters: str.slice(0, i), }; } len += currentStringLength; } return { length: len, characters: str, }; } else if (type === 'maxlength') { const length = str.length > max ? max : str.length; return { length, characters: str.slice(0, length), }; } return { length: str.length, characters: str, }; }; export const chunk = (arr, size) => Array.from({ length: Math.ceil(arr.length / size) }, (v, i) => arr.slice(i * size, i * size + size)); export const getInstance = function (context, selector) { if (!context) { const pages = getCurrentPages(); const page = pages[pages.length - 1]; context = page.$$basePage || page; } const instance = context ? context.selectComponent(selector) : null; if (!instance) { console.warn('未找到组件,请检查selector是否正确'); return null; } return instance; }; export const unitConvert = (value) => { var _a; if (typeof value === 'string') { if (value.includes('rpx')) { return (parseInt(value, 10) * ((_a = systemInfo === null || systemInfo === void 0 ? void 0 : systemInfo.screenWidth) !== null && _a !== void 0 ? _a : 750)) / 750; } return parseInt(value, 10); } return value; }; export const setIcon = (iconName, icon, defaultIcon) => { if (icon) { if (typeof icon === 'string') { return { [`${iconName}Name`]: icon, [`${iconName}Data`]: {}, }; } else if (typeof icon === 'object') { return { [`${iconName}Name`]: '', [`${iconName}Data`]: icon, }; } else { return { [`${iconName}Name`]: defaultIcon, [`${iconName}Data`]: {}, }; } } return { [`${iconName}Name`]: '', [`${iconName}Data`]: {}, }; }; export const isBool = (val) => typeof val === 'boolean'; export const isObject = (val) => typeof val === 'object' && val != null; export const isString = (val) => typeof val === 'string'; export const toCamel = (str) => str.replace(/-(\w)/g, (match, m1) => m1.toUpperCase()); export const getCurrentPage = function () { const pages = getCurrentPages(); return pages[pages.length - 1]; }; export const uniqueFactory = (compName) => { let number = 0; return () => `${prefix}_${compName}_${number++}`; }; export const calcIcon = (icon, defaultIcon) => { if ((isBool(icon) && icon && defaultIcon) || isString(icon)) { return { name: isBool(icon) ? defaultIcon : icon }; } if (isObject(icon)) { return icon; } return null; };