edu/uniapp/src/utils/util.ts

205 lines
5.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { isObject } from '@vue/shared'
import { getToken } from './auth'
import { parseQuery } from 'uniapp-router-next'
/**
* @description 获取元素节点信息在组件中的元素必须要传ctx
* @param { String } selector 选择器 '.app' | '#app'
* @param { Boolean } all 是否多选
* @param { ctx } context 当前组件实例
*/
export const getRect = (selector: string, all = false, context?: any) => {
return new Promise((resolve, reject) => {
let qurey = uni.createSelectorQuery()
if (context) {
qurey = uni.createSelectorQuery().in(context)
}
qurey[all ? 'selectAll' : 'select'](selector)
.boundingClientRect(function (rect) {
if (all && Array.isArray(rect) && rect.length) {
return resolve(rect)
}
if (!all && rect) {
return resolve(rect)
}
reject('找不到元素')
})
.exec()
})
}
/**
* @description 获取当前页面实例
*/
export function currentPage() {
const pages = getCurrentPages()
const currentPage = pages[pages.length - 1]
return currentPage || {}
}
/**
* @description 后台选择链接专用跳转
*/
interface Link {
path: string
name?: string
type: string
canTab: boolean
query?: Record<string, any>
}
export enum LinkTypeEnum {
'SHOP_PAGES' = 'shop',
'CUSTOM_LINK' = 'custom',
'MINI_PROGRAM' = 'mini_program'
}
export function navigateTo(
link: Link,
navigateType: 'navigateTo' | 'switchTab' | 'reLaunch' = 'navigateTo'
) {
// 如果是小程序跳转
if (link.type === LinkTypeEnum.MINI_PROGRAM) {
navigateToMiniProgram(link)
return
}
const url = link?.query ? `${link.path}?${objectToQuery(link?.query)}` : link.path
;(navigateType == 'switchTab' || link.canTab) && uni.switchTab({ url })
navigateType == 'navigateTo' && uni.navigateTo({ url })
navigateType == 'reLaunch' && uni.reLaunch({ url })
}
/**
* @description 小程序跳转
* @param link 跳转信息,由装修数据进行输入
*/
export function navigateToMiniProgram(link: Link) {
const query = link.query
// #ifdef H5
window.open(
`weixin://dl/business/?appid=${query?.appId}&path=${query?.path}&env_version=${
query?.env_version
}&query=${encodeURIComponent(query?.query)}`
)
// #endif
// #ifdef MP
uni.navigateToMiniProgram({
appId: query?.appId,
path: query?.path,
extraData: parseQuery(query?.query),
envVersion: query?.env_version
})
// #endif
}
/**
* @description 将一个数组分成几个同等长度的数组
* @param { Array } array[分割的原数组]
* @param { Number } size[每个子数组的长度]
*/
export const sliceArray = (array: any[], size: number) => {
const result = []
for (let x = 0; x < Math.ceil(array.length / size); x++) {
const start = x * size
const end = start + size
result.push(array.slice(start, end))
}
return result
}
/**
* @description 是否为空
* @param {unknown} value
* @return {Boolean}
*/
export const isEmpty = (value: unknown) => {
return value == null && typeof value == 'undefined'
}
/**
* @description 对象格式化为Query语法
* @param { Object } params
* @return {string} Query语法
*/
export function objectToQuery(params: Record<string, any>): string {
let query = ''
for (const props of Object.keys(params)) {
const value = params[props]
const part = encodeURIComponent(props) + '='
if (!isEmpty(value)) {
console.log(encodeURIComponent(props), isObject(value))
if (isObject(value)) {
for (const key of Object.keys(value)) {
if (!isEmpty(value[key])) {
const params = props + '[' + key + ']'
const subPart = encodeURIComponent(params) + '='
query += subPart + encodeURIComponent(value[key]) + '&'
}
}
} else {
query += part + encodeURIComponent(value) + '&'
}
}
}
return query.slice(0, -1)
}
/**
* @description 添加单位
* @param {String | Number} value 值 100
* @param {String} unit 单位 px em rem
*/
export const addUnit = (value: string | number, unit = 'rpx') => {
return !Object.is(Number(value), NaN) ? `${value}${unit}` : value
}
/**
* @description 格式化输出价格
* @param { string } price 价格
* @param { string } take 小数点操作
* @param { string } prec 小数位补
*/
export function formatPrice({ price, take = 'all', prec = undefined }: any) {
const [integer, decimals = ''] = (price + '').split('.')
// 小数位补
if (prec !== undefined) {
const LEN = decimals.length
for (let i = prec - LEN; i > 0; --i) decimals += '0'
decimals = decimals.substr(0, prec)
}
switch (take) {
case 'int':
return integer
case 'dec':
return decimals
case 'all':
return integer + '.' + decimals
}
}
/**
* @description 组合异步任务
* @param { string } task 异步任务
*/
export function series(...task: Array<(_arg: any) => any>) {
return function (): Promise<any> {
return new Promise((resolve, reject) => {
const iteratorTask = task.values()
const next = (res?: any) => {
const nextTask = iteratorTask.next()
if (nextTask.done) {
resolve(res)
} else {
Promise.resolve(nextTask.value(res)).then(next).catch(reject)
}
}
next()
})
}
}