¶Ô±ÈÐÂÎļþ |
| | |
| | | import test from './test.js' |
| | | import { round } from './digit.js' |
| | | /** |
| | | * @description 妿valueå°äºminï¼åminï¼å¦ævalue大äºmaxï¼åmax |
| | | * @param {number} min |
| | | * @param {number} max |
| | | * @param {number} value |
| | | */ |
| | | function range(min = 0, max = 0, value = 0) { |
| | | return Math.max(min, Math.min(max, Number(value))) |
| | | } |
| | | |
| | | /** |
| | | * @description ç¨äºè·åç¨æ·ä¼ éå¼çpxå¼ å¦æç¨æ·ä¼ éäº"xxpx"æè
"xxrpx"ï¼ååºå
¶æ°å¼é¨åï¼å¦ææ¯"xxxrpx"è¿éè¦ç¨è¿uni.upx2pxè¿è¡è½¬æ¢ |
| | | * @param {number|string} value ç¨æ·ä¼ éå¼çpxå¼ |
| | | * @param {boolean} unit |
| | | * @returns {number|string} |
| | | */ |
| | | function getPx(value, unit = false) { |
| | | if (test.number(value)) { |
| | | return unit ? `${value}px` : Number(value) |
| | | } |
| | | // 妿另ærpxï¼å
ååºå
¶æ°å¼é¨åï¼å转为pxå¼ |
| | | if (/(rpx|upx)$/.test(value)) { |
| | | return unit ? `${uni.upx2px(parseInt(value))}px` : Number(uni.upx2px(parseInt(value))) |
| | | } |
| | | return unit ? `${parseInt(value)}px` : parseInt(value) |
| | | } |
| | | |
| | | /** |
| | | * @description è¿è¡å»¶æ¶ï¼ä»¥è¾¾å°å¯ä»¥ç®å代ç çç®ç æ¯å¦: await uni.$u.sleep(20)å°ä¼é»å¡20ms |
| | | * @param {number} value å µå¡æ¶é´ åä½ms æ¯«ç§ |
| | | * @returns {Promise} è¿åpromise |
| | | */ |
| | | function sleep(value = 30) { |
| | | return new Promise((resolve) => { |
| | | setTimeout(() => { |
| | | resolve() |
| | | }, value) |
| | | }) |
| | | } |
| | | /** |
| | | * @description è¿è¡æå¤æå¹³å° |
| | | * @returns {string} è¿åæå¨å¹³å°(å°å) |
| | | * @link è¿è¡æå¤æå¹³å° https://uniapp.dcloud.io/frame?id=å¤æå¹³å° |
| | | */ |
| | | function os() { |
| | | return uni.getSystemInfoSync().platform.toLowerCase() |
| | | } |
| | | /** |
| | | * @description è·åç³»ç»ä¿¡æ¯åæ¥æ¥å£ |
| | | * @link è·åç³»ç»ä¿¡æ¯åæ¥æ¥å£ https://uniapp.dcloud.io/api/system/info?id=getsysteminfosync |
| | | */ |
| | | function sys() { |
| | | return uni.getSystemInfoSync() |
| | | } |
| | | |
| | | /** |
| | | * @description åä¸ä¸ªåºé´æ° |
| | | * @param {Number} min æå°å¼ |
| | | * @param {Number} max æå¤§å¼ |
| | | */ |
| | | function random(min, max) { |
| | | if (min >= 0 && max > 0 && max >= min) { |
| | | const gab = max - min + 1 |
| | | return Math.floor(Math.random() * gab + min) |
| | | } |
| | | return 0 |
| | | } |
| | | |
| | | /** |
| | | * @param {Number} len uuidçé¿åº¦ |
| | | * @param {Boolean} firstU å°è¿åçé¦åæ¯ç½®ä¸º"u" |
| | | * @param {Nubmer} radix çæuuidçåºæ°(æå³çè¿åçåç¬¦ä¸²é½æ¯è¿ä¸ªåºæ°),2-äºè¿å¶,8-å
«è¿å¶,10-åè¿å¶,16-åå
è¿å¶ |
| | | */ |
| | | function guid(len = 32, firstU = true, radix = null) { |
| | | const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('') |
| | | const uuid = [] |
| | | radix = radix || chars.length |
| | | |
| | | if (len) { |
| | | // 妿æå®uuidé¿åº¦,åªæ¯åéæºçå符,0|x为ä½è¿ç®,è½å»æxçå°æ°ä½,è¿åæ´æ°ä½ |
| | | for (let i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix] |
| | | } else { |
| | | let r |
| | | // rfc4122æ åè¦æ±è¿åçuuidä¸,æäºä½ä¸ºåºå®çå符 |
| | | uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-' |
| | | uuid[14] = '4' |
| | | |
| | | for (let i = 0; i < 36; i++) { |
| | | if (!uuid[i]) { |
| | | r = 0 | Math.random() * 16 |
| | | uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r] |
| | | } |
| | | } |
| | | } |
| | | // ç§»é¤ç¬¬ä¸ä¸ªå符,å¹¶ç¨uæ¿ä»£,å 为第ä¸ä¸ªå符为æ°å¼æ¶,该guuidä¸è½ç¨ä½idæè
class |
| | | if (firstU) { |
| | | uuid.shift() |
| | | return `u${uuid.join('')}` |
| | | } |
| | | return uuid.join('') |
| | | } |
| | | |
| | | /** |
| | | * @description è·åç¶ç»ä»¶çåæ°ï¼å 为æ¯ä»å®å°ç¨åºä¸æ¯æprovide/injectçåæ³ |
| | | this.$parentå¨éH5ä¸ï¼å¯ä»¥åç¡®è·åå°ç¶ç»ä»¶ï¼ä½æ¯å¨H5ä¸ï¼éè¦å¤æ¬¡this.$parent.$parent.xxx |
| | | è¿éé»è®¤å¼çäºundefinedæå®çå«ä¹ï¼å 为æé¡¶å±å
ç´ (ç»ä»¶)ç$parentå°±æ¯undefinedï¼æå³çä¸ä¼ name |
| | | å¼(é»è®¤ä¸ºundefined)ï¼å°±æ¯æ¥æ¾æé¡¶å±ç$parent |
| | | * @param {string|undefined} name ç¶ç»ä»¶çåæ°å |
| | | */ |
| | | function $parent(name = undefined) { |
| | | let parent = this.$parent |
| | | // éè¿whileåéï¼è¿éä¸»è¦æ¯ä¸ºäºH5éè¦å¤å±è§£æçé®é¢ |
| | | while (parent) { |
| | | // ç¶ç»ä»¶ |
| | | if (parent.$options && parent.$options.name !== name) { |
| | | // 妿ç»ä»¶çnameä¸ç¸çï¼ç»§ç»ä¸ä¸çº§å¯»æ¾ |
| | | parent = parent.$parent |
| | | } else { |
| | | return parent |
| | | } |
| | | } |
| | | return false |
| | | } |
| | | |
| | | /** |
| | | * @description æ ·å¼è½¬æ¢ |
| | | * 对象转åç¬¦ä¸²ï¼æè
å符串转对象 |
| | | * @param {object | string} customStyle éè¦è½¬æ¢çç®æ |
| | | * @param {String} target 转æ¢çç®çï¼object-转为对象ï¼string-转为å符串 |
| | | * @returns {object|string} |
| | | */ |
| | | function addStyle(customStyle, target = 'object') { |
| | | // å符串转å符串ï¼å¯¹è±¡è½¬å¯¹è±¡æ
å½¢ï¼ç´æ¥è¿å |
| | | if (test.empty(customStyle) || typeof(customStyle) === 'object' && target === 'object' || target === 'string' && |
| | | typeof(customStyle) === 'string') { |
| | | return customStyle |
| | | } |
| | | // å符串转对象 |
| | | if (target === 'object') { |
| | | // å»é¤åç¬¦ä¸²æ ·å¼ä¸çä¸¤ç«¯ç©ºæ ¼(ä¸é´çç©ºæ ¼ä¸è½å»æï¼æ¯å¦padding: 20px 0妿廿äºå°±éäº)ï¼ç©ºæ ¼æ¯æ ç¨ç |
| | | customStyle = trim(customStyle) |
| | | // æ ¹æ®";"å°å符串转为æ°ç»å½¢å¼ |
| | | const styleArray = customStyle.split(';') |
| | | const style = {} |
| | | // åéæ°ç»ï¼æ¼æ¥æå¯¹è±¡ |
| | | for (let i = 0; i < styleArray.length; i++) { |
| | | // 'font-size:20px;color:red;'ï¼å¦æ¤æåå符串æ";"çè¯ï¼ä¼å¯¼è´styleArrayæåä¸ä¸ªå
ç´ ä¸ºç©ºå符串ï¼è¿ééè¦è¿æ»¤ |
| | | if (styleArray[i]) { |
| | | const item = styleArray[i].split(':') |
| | | style[trim(item[0])] = trim(item[1]) |
| | | } |
| | | } |
| | | return style |
| | | } |
| | | // è¿é为对象转åç¬¦ä¸²å½¢å¼ |
| | | let string = '' |
| | | for (const i in customStyle) { |
| | | // 驼峰转为ä¸å线çå½¢å¼ï¼å¦åcsså
èæ ·å¼ï¼æ æ³è¯å«é©¼å³°æ ·å¼å±æ§å |
| | | const key = i.replace(/([A-Z])/g, '-$1').toLowerCase() |
| | | string += `${key}:${customStyle[i]};` |
| | | } |
| | | // å»é¤ä¸¤ç«¯ç©ºæ ¼ |
| | | return trim(string) |
| | | } |
| | | |
| | | /** |
| | | * @description æ·»å åä½ï¼å¦æærpxï¼upxï¼%ï¼pxçåä½ç»å°¾æè
å¼ä¸ºautoï¼ç´æ¥è¿åï¼å¦åå ä¸pxåä½ç»å°¾ |
| | | * @param {string|number} value éè¦æ·»å åä½çå¼ |
| | | * @param {string} unit æ·»å çåä½å æ¯å¦px |
| | | */ |
| | | function addUnit(value = 'auto', unit = uni?.$u?.config?.unit ?? 'px') { |
| | | value = String(value) |
| | | // ç¨uViewå
ç½®éªè¯è§åä¸çnumber夿æ¯å¦ä¸ºæ°å¼ |
| | | return test.number(value) ? `${value}${unit}` : value |
| | | } |
| | | |
| | | /** |
| | | * @description 深度å
é |
| | | * @param {object} obj éè¦æ·±åº¦å
éç对象 |
| | | * @param cache ç¼å |
| | | * @returns {*} å
éåç对象æè
åå¼ï¼ä¸æ¯å¯¹è±¡ï¼ |
| | | */ |
| | | function deepClone(obj, cache = new WeakMap()) { |
| | | if (obj === null || typeof obj !== 'object') return obj; |
| | | if (cache.has(obj)) return cache.get(obj); |
| | | let clone; |
| | | if (obj instanceof Date) { |
| | | clone = new Date(obj.getTime()); |
| | | } else if (obj instanceof RegExp) { |
| | | clone = new RegExp(obj); |
| | | } else if (obj instanceof Map) { |
| | | clone = new Map(Array.from(obj, ([key, value]) => [key, deepClone(value, cache)])); |
| | | } else if (obj instanceof Set) { |
| | | clone = new Set(Array.from(obj, value => deepClone(value, cache))); |
| | | } else if (Array.isArray(obj)) { |
| | | clone = obj.map(value => deepClone(value, cache)); |
| | | } else if (Object.prototype.toString.call(obj) === '[object Object]') { |
| | | clone = Object.create(Object.getPrototypeOf(obj)); |
| | | cache.set(obj, clone); |
| | | for (const [key, value] of Object.entries(obj)) { |
| | | clone[key] = deepClone(value, cache); |
| | | } |
| | | } else { |
| | | clone = Object.assign({}, obj); |
| | | } |
| | | cache.set(obj, clone); |
| | | return clone; |
| | | } |
| | | |
| | | /** |
| | | * @description JS对象深度åå¹¶ |
| | | * @param {object} target éè¦æ·è´ç对象 |
| | | * @param {object} source æ·è´çæ¥æºå¯¹è±¡ |
| | | * @returns {object|boolean} 深度åå¹¶åç对象æè
falseï¼å
¥åæä¸æ¯å¯¹è±¡ï¼ |
| | | */ |
| | | function deepMerge(target = {}, source = {}) { |
| | | target = deepClone(target) |
| | | if (typeof target !== 'object' || target === null || typeof source !== 'object' || source === null) return target; |
| | | const merged = Array.isArray(target) ? target.slice() : Object.assign({}, target); |
| | | for (const prop in source) { |
| | | if (!source.hasOwnProperty(prop)) continue; |
| | | const sourceValue = source[prop]; |
| | | const targetValue = merged[prop]; |
| | | if (sourceValue instanceof Date) { |
| | | merged[prop] = new Date(sourceValue); |
| | | } else if (sourceValue instanceof RegExp) { |
| | | merged[prop] = new RegExp(sourceValue); |
| | | } else if (sourceValue instanceof Map) { |
| | | merged[prop] = new Map(sourceValue); |
| | | } else if (sourceValue instanceof Set) { |
| | | merged[prop] = new Set(sourceValue); |
| | | } else if (typeof sourceValue === 'object' && sourceValue !== null) { |
| | | merged[prop] = deepMerge(targetValue, sourceValue); |
| | | } else { |
| | | merged[prop] = sourceValue; |
| | | } |
| | | } |
| | | return merged; |
| | | } |
| | | |
| | | /** |
| | | * @description erroræç¤º |
| | | * @param {*} err é误å
容 |
| | | */ |
| | | function error(err) { |
| | | // å¼åç¯å¢ææç¤ºï¼ç产ç¯å¢ä¸ä¼æç¤º |
| | | if (process.env.NODE_ENV === 'development') { |
| | | console.error(`uViewæç¤ºï¼${err}`) |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * @description æä¹±æ°ç» |
| | | * @param {array} array éè¦æä¹±çæ°ç» |
| | | * @returns {array} æä¹±åçæ°ç» |
| | | */ |
| | | function randomArray(array = []) { |
| | | // åçæ¯sortæåº,Math.random()产ç0<= x < 1ä¹é´çæ°,ä¼å¯¼è´x-0.05å¤§äºæè
å°äº0 |
| | | return array.sort(() => Math.random() - 0.5) |
| | | } |
| | | |
| | | // padStart ç polyfillï¼å 为æäºæºåææ
åµï¼è¿æ æ³æ¯æes7çpadStartï¼æ¯å¦çµèçç微信å°ç¨åº |
| | | // æä»¥è¿éåä¸ä¸ªå
¼å®¹polyfillçå
¼å®¹å¤ç |
| | | if (!String.prototype.padStart) { |
| | | // ä¸ºäºæ¹ä¾¿è¡¨ç¤ºè¿é fillString ç¨äºES6 çé»è®¤åæ°ï¼ä¸å½±åçè§£ |
| | | String.prototype.padStart = function(maxLength, fillString = ' ') { |
| | | if (Object.prototype.toString.call(fillString) !== '[object String]') { |
| | | throw new TypeError( |
| | | 'fillString must be String' |
| | | ) |
| | | } |
| | | const str = this |
| | | // è¿å String(str) è¿éæ¯ä¸ºäºä½¿è¿åç弿¯å符串åé¢éï¼å¨æ§å¶å°ä¸æ´ç¬¦åç´è§ |
| | | if (str.length >= maxLength) return String(str) |
| | | |
| | | const fillLength = maxLength - str.length |
| | | let times = Math.ceil(fillLength / fillString.length) |
| | | while (times >>= 1) { |
| | | fillString += fillString |
| | | if (times === 1) { |
| | | fillString += fillString |
| | | } |
| | | } |
| | | return fillString.slice(0, fillLength) + str |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * @description æ ¼å¼åæ¶é´ |
| | | * @param {String|Number} dateTime éè¦æ ¼å¼åçæ¶é´æ³ |
| | | * @param {String} fmt æ ¼å¼åè§å yyyy:mm:dd|yyyy:mm|yyyyå¹´mmæddæ¥|yyyyå¹´mmæddæ¥ hhæ¶MMåç,å¯èªå®ä¹ç»å é»è®¤yyyy-mm-dd |
| | | * @returns {string} è¿åæ ¼å¼ååçå符串 |
| | | */ |
| | | function timeFormat(dateTime = null, formatStr = 'yyyy-mm-dd') { |
| | | let date |
| | | // è¥ä¼ å
¥æ¶é´ä¸ºåå¼ï¼ååå½åæ¶é´ |
| | | if (!dateTime) { |
| | | date = new Date() |
| | | } |
| | | // è¥ä¸ºunixç§æ¶é´æ³ï¼åè½¬ä¸ºæ¯«ç§æ¶é´æ³ï¼é»è¾æç¹å¥æªï¼ä½ä¸æ¢æ¹ï¼ä»¥ä¿è¯åå²å
¼å®¹ï¼ |
| | | else if (/^\d{10}$/.test(dateTime?.toString().trim())) { |
| | | date = new Date(dateTime * 1000) |
| | | } |
| | | // è¥ç¨æ·ä¼ å
¥åç¬¦ä¸²æ ¼å¼æ¶é´æ³ï¼new Dateæ æ³è§£æï¼éåå
¼å®¹ |
| | | else if (typeof dateTime === 'string' && /^\d+$/.test(dateTime.trim())) { |
| | | date = new Date(Number(dateTime)) |
| | | } |
| | | // å¤ç平尿§å·®å¼ï¼å¨Safari/Webkitä¸ï¼new Dateä»
æ¯æ/ä½ä¸ºåå²ç¬¦çå符串æ¶é´ |
| | | // å¤ç '2022-07-10 01:02:03'ï¼è·³è¿ '2022-07-10T01:02:03' |
| | | else if (typeof dateTime === 'string' && dateTime.includes('-') && !dateTime.includes('T')) { |
| | | date = new Date(dateTime.replace(/-/g, '/')) |
| | | } |
| | | // å
¶ä»é½è®¤ä¸ºç¬¦å RFC 2822 è§è |
| | | else { |
| | | date = new Date(dateTime) |
| | | } |
| | | |
| | | const timeSource = { |
| | | 'y': date.getFullYear().toString(), // å¹´ |
| | | 'm': (date.getMonth() + 1).toString().padStart(2, '0'), // æ |
| | | 'd': date.getDate().toString().padStart(2, '0'), // æ¥ |
| | | 'h': date.getHours().toString().padStart(2, '0'), // æ¶ |
| | | 'M': date.getMinutes().toString().padStart(2, '0'), // å |
| | | 's': date.getSeconds().toString().padStart(2, '0') // ç§ |
| | | // æå
¶ä»æ ¼å¼ååç¬¦éæ±å¯ä»¥ç»§ç»æ·»å ï¼å¿
须转åæå符串 |
| | | } |
| | | |
| | | for (const key in timeSource) { |
| | | const [ret] = new RegExp(`${key}+`).exec(formatStr) || [] |
| | | if (ret) { |
| | | // å¹´å¯è½åªéå±ç¤ºä¸¤ä½ |
| | | const beginIndex = key === 'y' && ret.length === 2 ? 2 : 0 |
| | | formatStr = formatStr.replace(ret, timeSource[key].slice(beginIndex)) |
| | | } |
| | | } |
| | | |
| | | return formatStr |
| | | } |
| | | |
| | | /** |
| | | * @description æ¶é´æ³è½¬ä¸ºå¤ä¹
ä¹å |
| | | * @param {String|Number} timestamp æ¶é´æ³ |
| | | * @param {String|Boolean} format |
| | | * æ ¼å¼åè§åå¦æä¸ºæ¶é´æ ¼å¼å符串ï¼è¶
åºä¸å®æ¶é´èå´ï¼è¿ååºå®çæ¶é´æ ¼å¼ï¼ |
| | | * å¦æä¸ºå¸å°å¼falseï¼æ 论ä»ä¹æ¶é´ï¼é½è¿åå¤ä¹
以åçæ ¼å¼ |
| | | * @returns {string} 转ååçå
容 |
| | | */ |
| | | function timeFrom(timestamp = null, format = 'yyyy-mm-dd') { |
| | | if (timestamp == null) timestamp = Number(new Date()) |
| | | timestamp = parseInt(timestamp) |
| | | // å¤æç¨æ·è¾å
¥çæ¶é´æ³æ¯ç§è¿æ¯æ¯«ç§,ä¸è¬å端jsè·åçæ¶é´æ³æ¯æ¯«ç§(13ä½),åç«¯ä¼ è¿æ¥ç为ç§(10ä½) |
| | | if (timestamp.toString().length == 10) timestamp *= 1000 |
| | | let timer = (new Date()).getTime() - timestamp |
| | | timer = parseInt(timer / 1000) |
| | | // 妿å°äº5åé,åè¿å"åå",å
¶ä»ä»¥æ¤ç±»æ¨ |
| | | let tips = '' |
| | | switch (true) { |
| | | case timer < 300: |
| | | tips = 'åå' |
| | | break |
| | | case timer >= 300 && timer < 3600: |
| | | tips = `${parseInt(timer / 60)}åéå` |
| | | break |
| | | case timer >= 3600 && timer < 86400: |
| | | tips = `${parseInt(timer / 3600)}å°æ¶å` |
| | | break |
| | | case timer >= 86400 && timer < 2592000: |
| | | tips = `${parseInt(timer / 86400)}天å` |
| | | break |
| | | default: |
| | | // 妿format为falseï¼åæ 论ä»ä¹æ¶é´æ³ï¼é½æ¾ç¤ºxxä¹å |
| | | if (format === false) { |
| | | if (timer >= 2592000 && timer < 365 * 86400) { |
| | | tips = `${parseInt(timer / (86400 * 30))}个æå` |
| | | } else { |
| | | tips = `${parseInt(timer / (86400 * 365))}å¹´å` |
| | | } |
| | | } else { |
| | | tips = timeFormat(timestamp, format) |
| | | } |
| | | } |
| | | return tips |
| | | } |
| | | |
| | | /** |
| | | * @description å»é¤ç©ºæ ¼ |
| | | * @param String str éè¦å»é¤ç©ºæ ¼çå符串 |
| | | * @param String pos both(å·¦å³)|left|right|all é»è®¤both |
| | | */ |
| | | function trim(str, pos = '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 |
| | | } |
| | | |
| | | /** |
| | | * @description 对象转urlåæ° |
| | | * @param {object} data,对象 |
| | | * @param {Boolean} isPrefix,æ¯å¦èªå¨å ä¸"?" |
| | | * @param {string} arrayFormat è§å indices|brackets|repeat|comma |
| | | */ |
| | | function queryParams(data = {}, isPrefix = true, arrayFormat = 'brackets') { |
| | | const prefix = isPrefix ? '?' : '' |
| | | const _result = [] |
| | | if (['indices', 'brackets', 'repeat', 'comma'].indexOf(arrayFormat) == -1) arrayFormat = 'brackets' |
| | | for (const key in data) { |
| | | const value = data[key] |
| | | // å»æä¸ºç©ºçåæ° |
| | | if (['', undefined, null].indexOf(value) >= 0) { |
| | | continue |
| | | } |
| | | // 妿å¼ä¸ºæ°ç»ï¼å¦è¡å¤ç |
| | | if (value.constructor === Array) { |
| | | // e.g. {ids: [1, 2, 3]} |
| | | switch (arrayFormat) { |
| | | case 'indices': |
| | | // ç»æ: ids[0]=1&ids[1]=2&ids[2]=3 |
| | | for (let i = 0; i < value.length; i++) { |
| | | _result.push(`${key}[${i}]=${value[i]}`) |
| | | } |
| | | break |
| | | case 'brackets': |
| | | // ç»æ: ids[]=1&ids[]=2&ids[]=3 |
| | | value.forEach((_value) => { |
| | | _result.push(`${key}[]=${_value}`) |
| | | }) |
| | | break |
| | | case 'repeat': |
| | | // ç»æ: ids=1&ids=2&ids=3 |
| | | value.forEach((_value) => { |
| | | _result.push(`${key}=${_value}`) |
| | | }) |
| | | break |
| | | case 'comma': |
| | | // ç»æ: ids=1,2,3 |
| | | let commaStr = '' |
| | | value.forEach((_value) => { |
| | | commaStr += (commaStr ? ',' : '') + _value |
| | | }) |
| | | _result.push(`${key}=${commaStr}`) |
| | | break |
| | | default: |
| | | value.forEach((_value) => { |
| | | _result.push(`${key}[]=${_value}`) |
| | | }) |
| | | } |
| | | } else { |
| | | _result.push(`${key}=${value}`) |
| | | } |
| | | } |
| | | return _result.length ? prefix + _result.join('&') : '' |
| | | } |
| | | |
| | | /** |
| | | * æ¾ç¤ºæ¶æ¯æç¤ºæ¡ |
| | | * @param {String} title æç¤ºçå
容ï¼é¿åº¦ä¸ icon å弿å
³ã |
| | | * @param {Number} duration æç¤ºçå»¶è¿æ¶é´ï¼å使¯«ç§ï¼é»è®¤ï¼2000 |
| | | */ |
| | | function toast(title, duration = 2000) { |
| | | uni.showToast({ |
| | | title: String(title), |
| | | icon: 'none', |
| | | duration |
| | | }) |
| | | } |
| | | |
| | | /** |
| | | * @description æ ¹æ®ä¸»é¢typeå¼,è·å对åºç徿 |
| | | * @param {String} type 主é¢åç§°,primary|info|error|warning|success |
| | | * @param {boolean} fill æ¯å¦ä½¿ç¨fillå¡«å
å®ä½ç徿 |
| | | */ |
| | | function type2icon(type = 'success', fill = false) { |
| | | // 妿éé¢ç½®å¼,é»è®¤ä¸ºsuccess |
| | | if (['primary', 'info', 'error', 'warning', 'success'].indexOf(type) == -1) type = 'success' |
| | | let iconName = '' |
| | | // ç®å(2019-12-12),infoåprimary使ç¨åä¸ä¸ªå¾æ |
| | | switch (type) { |
| | | case 'primary': |
| | | iconName = 'info-circle' |
| | | break |
| | | case 'info': |
| | | iconName = 'info-circle' |
| | | break |
| | | case 'error': |
| | | iconName = 'close-circle' |
| | | break |
| | | case 'warning': |
| | | iconName = 'error-circle' |
| | | break |
| | | case 'success': |
| | | iconName = 'checkmark-circle' |
| | | break |
| | | default: |
| | | iconName = 'checkmark-circle' |
| | | } |
| | | // æ¯å¦æ¯å®ä½ç±»å,å ä¸-fill,å¨iconç»ä»¶åºä¸,å®ä½çç±»åæ¯åé¢å -fillç |
| | | if (fill) iconName += '-fill' |
| | | return iconName |
| | | } |
| | | |
| | | /** |
| | | * @description æ°åæ ¼å¼å |
| | | * @param {number|string} number è¦æ ¼å¼åçæ°å |
| | | * @param {number} decimals ä¿çå ä½å°æ° |
| | | * @param {string} decimalPoint å°æ°ç¹ç¬¦å· |
| | | * @param {string} thousandsSeparator ååä½ç¬¦å· |
| | | * @returns {string} æ ¼å¼ååçæ°å |
| | | */ |
| | | function priceFormat(number, decimals = 0, decimalPoint = '.', thousandsSeparator = ',') { |
| | | number = (`${number}`).replace(/[^0-9+-Ee.]/g, '') |
| | | const n = !isFinite(+number) ? 0 : +number |
| | | const prec = !isFinite(+decimals) ? 0 : Math.abs(decimals) |
| | | const sep = (typeof thousandsSeparator === 'undefined') ? ',' : thousandsSeparator |
| | | const dec = (typeof decimalPoint === 'undefined') ? '.' : decimalPoint |
| | | let s = '' |
| | | |
| | | s = (prec ? round(n, prec) + '' : `${Math.round(n)}`).split('.') |
| | | const re = /(-?\d+)(\d{3})/ |
| | | while (re.test(s[0])) { |
| | | s[0] = s[0].replace(re, `$1${sep}$2`) |
| | | } |
| | | |
| | | if ((s[1] || '').length < prec) { |
| | | s[1] = s[1] || '' |
| | | s[1] += new Array(prec - s[1].length + 1).join('0') |
| | | } |
| | | return s.join(dec) |
| | | } |
| | | |
| | | /** |
| | | * @description è·ådurationå¼ |
| | | * 妿另æmsæè
sç´æ¥è¿åï¼å¦æå¤§äºä¸å®å¼ï¼è®¤ä¸ºæ¯msåä½ï¼å°äºä¸å®å¼ï¼è®¤ä¸ºæ¯såä½ |
| | | * æ¯å¦ä»¥30ä½éå¼ï¼é£ä¹300大äº30ï¼å¯ä»¥çè§£ä¸ºç¨æ·æ³è¦çæ¯300msï¼è䏿¯æ³è±300s廿§è¡ä¸ä¸ªå¨ç» |
| | | * @param {String|number} value æ¯å¦: "1s"|"100ms"|1|100 |
| | | * @param {boolean} unit æç¤º: 妿æ¯false é»è®¤è¿ånumber |
| | | * @return {string|number} |
| | | */ |
| | | function getDuration(value, unit = true) { |
| | | const valueNum = parseInt(value) |
| | | if (unit) { |
| | | if (/s$/.test(value)) return value |
| | | return value > 30 ? `${value}ms` : `${value}s` |
| | | } |
| | | if (/ms$/.test(value)) return valueNum |
| | | if (/s$/.test(value)) return valueNum > 30 ? valueNum : valueNum * 1000 |
| | | return valueNum |
| | | } |
| | | |
| | | /** |
| | | * @description æ¥æçæææ¥è¡¥é¶æä½ |
| | | * @param {String} value éè¦è¡¥é¶çå¼ |
| | | */ |
| | | function padZero(value) { |
| | | return `00${value}`.slice(-2) |
| | | } |
| | | |
| | | /** |
| | | * @description å¨u-formçåç»ä»¶å
容åçååï¼æè
失å»ç¦ç¹æ¶ï¼å°è¯éç¥u-formæ§è¡æ ¡éªæ¹æ³ |
| | | * @param {*} instance |
| | | * @param {*} event |
| | | */ |
| | | function formValidate(instance, event) { |
| | | const formItem = uni.$u.$parent.call(instance, 'u-form-item') |
| | | const form = uni.$u.$parent.call(instance, 'u-form') |
| | | // 妿åçååçinputæè
textareaçï¼å
¶ç¶ç»ä»¶ä¸æu-form-itemæè
u-formçï¼å°±æ§è¡formçvalidateæ¹æ³ |
| | | // åæ¶å°form-itemçprosä¼ éç»formï¼è®©å
¶è¿è¡ç²¾ç¡®å¯¹è±¡éªè¯ |
| | | if (formItem && form) { |
| | | form.validateField(formItem.prop, () => {}, event) |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * @description è·åæä¸ªå¯¹è±¡ä¸ç屿§ï¼ç¨äºéè¿ç±»ä¼¼'a.b.c'çå½¢å¼å»è·åä¸ä¸ªå¯¹è±¡çç屿§çå½¢å¼ |
| | | * @param {object} obj 对象 |
| | | * @param {string} key éè¦è·åç屿§å段 |
| | | * @returns {*} |
| | | */ |
| | | function getProperty(obj, key) { |
| | | if (!obj) { |
| | | return |
| | | } |
| | | if (typeof key !== 'string' || key === '') { |
| | | return '' |
| | | } |
| | | if (key.indexOf('.') !== -1) { |
| | | const keys = key.split('.') |
| | | let firstObj = obj[keys[0]] || {} |
| | | |
| | | for (let i = 1; i < keys.length; i++) { |
| | | if (firstObj) { |
| | | firstObj = firstObj[keys[i]] |
| | | } |
| | | } |
| | | return firstObj |
| | | } |
| | | return obj[key] |
| | | } |
| | | |
| | | /** |
| | | * @description 设置对象ç屿§å¼ï¼å¦æ'a.b.c'çå½¢å¼è¿è¡è®¾ç½® |
| | | * @param {object} obj 对象 |
| | | * @param {string} key éè¦è®¾ç½®ç屿§ |
| | | * @param {string} value 设置çå¼ |
| | | */ |
| | | function setProperty(obj, key, value) { |
| | | if (!obj) { |
| | | return |
| | | } |
| | | // éå½èµå¼ |
| | | const inFn = function(_obj, keys, v) { |
| | | // æåä¸ä¸ªå±æ§key |
| | | if (keys.length === 1) { |
| | | _obj[keys[0]] = v |
| | | return |
| | | } |
| | | // 0~length-1个key |
| | | while (keys.length > 1) { |
| | | const k = keys[0] |
| | | if (!_obj[k] || (typeof _obj[k] !== 'object')) { |
| | | _obj[k] = {} |
| | | } |
| | | const key = keys.shift() |
| | | // èªè°ç¨å¤ææ¯å¦åå¨å±æ§ï¼ä¸åå¨åèªå¨å建对象 |
| | | inFn(_obj[k], keys, v) |
| | | } |
| | | } |
| | | |
| | | if (typeof key !== 'string' || key === '') { |
| | | |
| | | } else if (key.indexOf('.') !== -1) { // æ¯æå¤å±çº§èµå¼æä½ |
| | | const keys = key.split('.') |
| | | inFn(obj, keys, value) |
| | | } else { |
| | | obj[key] = value |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * @description è·åå½å页é¢è·¯å¾ |
| | | */ |
| | | function page() { |
| | | const pages = getCurrentPages() |
| | | // æäºç¹æ®æ
åµä¸(æ¯å¦é¡µé¢è¿è¡redirectToæ¶çä¸äºæ¶æº)ï¼pageså¯è½ä¸ºç©ºæ°ç» |
| | | return `/${pages[pages.length - 1]?.route ?? ''}` |
| | | } |
| | | |
| | | /** |
| | | * @description è·åå½åè·¯ç±æ å®ä¾æ°ç» |
| | | */ |
| | | function pages() { |
| | | const pages = getCurrentPages() |
| | | return pages |
| | | } |
| | | |
| | | /** |
| | | * è·å页é¢å岿 æå®å±å®ä¾ |
| | | * @param back {number} [0] - 0æè
è´æ°ï¼è¡¨ç¤ºè·åå岿 çåªä¸å±ï¼0表示è·åå½å页é¢å®ä¾ï¼-1 表示è·åä¸ä¸ä¸ªé¡µé¢å®ä¾ãé»è®¤0ã |
| | | */ |
| | | function getHistoryPage(back = 0) { |
| | | const pages = getCurrentPages() |
| | | const len = pages.length |
| | | return pages[len - 1 + back] |
| | | } |
| | | |
| | | /** |
| | | * @description ä¿®æ¹uViewå
ç½®å±æ§å¼ |
| | | * @param {object} props ä¿®æ¹å
ç½®props屿§ |
| | | * @param {object} config ä¿®æ¹å
ç½®config屿§ |
| | | * @param {object} color ä¿®æ¹å
ç½®color屿§ |
| | | * @param {object} zIndex ä¿®æ¹å
ç½®zIndex屿§ |
| | | */ |
| | | function setConfig({ |
| | | props = {}, |
| | | config = {}, |
| | | color = {}, |
| | | zIndex = {} |
| | | }) { |
| | | const { |
| | | deepMerge, |
| | | } = uni.$u |
| | | uni.$u.config = deepMerge(uni.$u.config, config) |
| | | uni.$u.props = deepMerge(uni.$u.props, props) |
| | | uni.$u.color = deepMerge(uni.$u.color, color) |
| | | uni.$u.zIndex = deepMerge(uni.$u.zIndex, zIndex) |
| | | } |
| | | |
| | | export default { |
| | | range, |
| | | getPx, |
| | | sleep, |
| | | os, |
| | | sys, |
| | | random, |
| | | guid, |
| | | $parent, |
| | | addStyle, |
| | | addUnit, |
| | | deepClone, |
| | | deepMerge, |
| | | error, |
| | | randomArray, |
| | | timeFormat, |
| | | timeFrom, |
| | | trim, |
| | | queryParams, |
| | | toast, |
| | | type2icon, |
| | | priceFormat, |
| | | getDuration, |
| | | padZero, |
| | | formValidate, |
| | | getProperty, |
| | | setProperty, |
| | | page, |
| | | pages, |
| | | getHistoryPage, |
| | | setConfig |
| | | } |