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.
reagent_manage/vue/src/util/index.js

204 lines
5.8 KiB

export function isEmpty(...str) {
return str.some(i => i === undefined || i === null || i === '')
}
export function emptyOrDefault(v, defaultValue = '') {
return isEmpty(v) ? defaultValue : v
}
export function getInitialValue(v) {
if (v === undefined || v === null) v = null
else if (typeof v === 'string') v = ''
else if (typeof v === 'boolean') v = false
else if (typeof v === 'number') v = 0
else if (typeof v === 'object') v = {}
else if (Array.isArray(v)) v = []
}
//简单重置对象属性
export function resetObj(obj) {
if (isEmpty(obj)) return
Object.keys(obj).forEach(key => {
if (Array.isArray(obj[key])) {
obj[key] = []
}
else if (typeof obj[key] === 'number') {
obj[key] = 0
}
else if (typeof obj[key] === 'boolean') {
obj[key] = false
}
else if (obj[key] !== null && typeof obj[key] === 'object') {
resetObj(obj[key])
}
else obj[key] = null
})
}
//简单合并对象
export function mergeObj(target, source) {
Object.keys(target).forEach(key => {
if (!isEmpty(source) && key in source) {
if (Array.isArray(target[key])) {
target[key] = source[key] || []
}
else if (typeof target[key] === 'number') {
target[key] = source[key] || 0
}
else if (target[key] !== null && typeof target[key] === 'object') {
mergeObj(target[key], source[key])
}
else {
if (typeof source[key] === 'function') {
target[key] = source[key].toString()
}
else target[key] = source[key]
}
}
})
}
export function timeFormat(fmt, date = new Date()) {
if (isEmpty(fmt)) fmt = 'yyyy-MM-dd HH:mm:ss'
const o = {
"M+": date.getMonth() + 1, //月份
"d+": date.getDate(), //日
"H+": date.getHours(), //小时
"m+": date.getMinutes(), //分
"s+": date.getSeconds(), //秒
"q+": Math.floor((date.getMonth() + 3) / 3), //季度
"S": date.getMilliseconds() //毫秒
}
if (/(y+)/.test(fmt)) {
const replace = (date.getFullYear() + "").substring(4 - RegExp.$1.length)
fmt = fmt.replace(RegExp.$1, [...replace].join(''))
}
for (const k in o) {
if (new RegExp(`(${k})`).test(fmt)) {
const firstMatch = RegExp.$1
const replace = firstMatch.length === 1 ? o[k] : ("00" + o[k]).substring(("" + o[k]).length)
fmt = fmt.replace(firstMatch, [...replace].join(''))
}
}
return fmt
}
export function debounce(func, wait = 100, immediate = false) {
let timeout, args, context, timestamp, result
const later = function () {
// 据上一次触发时间间隔
const last = new Date().getTime() - timestamp
// 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait
if (last < wait && last > 0) {
timeout = setTimeout(later, wait - last)
}
else {
timeout = null
// 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用
if (!immediate) {
result = func.apply(context, args)
if (!timeout) context = args = null
}
}
}
return function () {
context = this
args = arguments
timestamp = new Date().getTime()
const callNow = immediate && !timeout
// 如果延时不存在,重新设定延时
if (!timeout) timeout = setTimeout(later, wait)
if (callNow) {
result = func.apply(context, args)
context = args = null
}
return result
}
}
export function throttle(func, delay = 100) {
let timeoutID
let lastExec = 0
function wrapper() {
const self = this
const elapsed = Date.now() - lastExec
const args = arguments
function exec() {
lastExec = Date.now()
func.apply(self, args)
}
clearTimeout(timeoutID)
if (elapsed > delay) exec()
else timeoutID = setTimeout(exec, delay - elapsed)
}
return wrapper
}
/**
* 循环等待成功事件
* @param success 判断是否成功,true or false
* @param callback 成功后的回调
* @param interval 循环间隔,毫秒
* @param maxTryTime 最大循环次数,超出reject,小于1视为Infinity
*/
export function waitUntilSuccess(success, callback, interval = 1000, maxTryTime = 0) {
return new Promise((resolve, reject) => {
let fun,
count = 0
const check = () => {
if (success()) {
window.clearInterval(fun)
typeof callback === 'function' && callback()
return resolve()
}
if (maxTryTime >= 1) {
count++
if (count >= maxTryTime) return reject()
}
}
if (success()) return check()
fun = setInterval(check, interval)
})
}
//store中根据state批量生成对应的mutation
export function createMutations(state, all = false) {
const keys = Object.keys(state)
const obj = {}
keys.forEach(key => {
obj[key] = (s, v) => s[key] = v
})
if (all) {
obj['$all'] = (s, v) => {
keys.forEach(key => {
s[key] = v && v[key] || getInitialValue(s[key])
})
}
}
return obj
}
//删除所有url参数
export function delAllUrlParam() {
let paramStartIndex = location.href.indexOf('?')
if (paramStartIndex > -1) {
const href = location.href.substring(0, paramStartIndex)
history.replaceState(null, null, [...href].join(''))
}
}