Files
meida_front/uni_modules/v-tabs/components/v-tabs/utils.js
T
liguigong 4ea873c1bd feat(fittingRoom): 新增试衣间功能
- 添加 fittingRoom 存储模块,用于管理试衣间状态和数据
- 实现试衣间页面布局和基础功能,包括轮播图、标签页、衣服网格等组件
- 开发选择模特和上传衣服功能
- 优化页面样式和交互
2025-09-19 19:27:22 +08:00

111 lines
4.0 KiB
JavaScript

/**
* 启动一个微任务。
*
* 该函数旨在兼容不同环境下的微任务调度。微任务是一种在主任务(如事件循环中的回调)之后,但在下一次渲染之前执行的JavaScript任务。
* 它们对于异步编程和性能优化非常重要。此函数尝试使用三种不同的方法来调度微任务,取决于环境的支持情况。
*
* @param {Function} callback - 待执行的微任务回调函数。
*/
export function startMicroTask(callback) {
// 如果队列微任务是可用的,直接使用队列微任务的方法来调度回调。
if (typeof queueMicrotask === 'function') {
queueMicrotask(callback)
} else if (typeof MutationObserver === 'function') {
// 如果MutationObserver可用,使用它来创建一个微任务。
// 这是一种旧的兼容性方法,因为MutationObserver在较早的浏览器版本中就已经支持。
const node = document.createElement('div')
const observer = new MutationObserver(callback)
observer.observe(node, { childList: true })
node.textContent = 'xfjpeter'
} else {
// 如果以上两种方法都不可用,退回到使用setTimeout来模拟微任务。
// 这是最后的选择,因为setTimeout不是真正的微任务,但它可以在不支持微任务的环境中提供类似的功能。
setTimeout(callback, 0)
}
}
/**
* 函数节流器。
* 通过限制函数调用的频率,防止在高频率事件(如窗口滚动或鼠标移动)中过多调用给定的函数,从而优化性能。
*
* @param {Function} fn 要节流的函数。
* @param {number} delay 延迟的毫秒数,在这段时间内只能调用一次给定的函数。
* @returns {Function} 返回一个新的节流函数,它将控制原始函数的调用频率。
*/
/**
* 函数节流器
* @param {Function} fn 要节流的函数
* @param {number} delay 延迟的毫秒数
* @returns {Function} 返回节流后的函数
*/
export function throttle(fn, delay) {
// 用于存储定时器ID
let timeoutId
// 用于记录上一次函数执行的时间
let lastExecuted = 0
// 返回一个节流函数
return function () {
// 保存当前上下文和参数
const context = this
const args = arguments
// 获取当前时间
const now = Date.now()
// 计算剩余时间
const remaining = delay - (now - lastExecuted)
// 实际执行函数的内部函数
function execute() {
lastExecuted = now
// 在当前上下文中调用原始函数,并传入参数
fn.apply(context, args)
}
// 如果剩余时间小于等于0,表示可以执行函数
if (remaining <= 0) {
// 如果存在定时器,则清除定时器
if (timeoutId) {
clearTimeout(timeoutId)
timeoutId = null
}
// 执行函数
execute()
} else {
// 如果不存在定时器,则设置定时器
if (!timeoutId) {
timeoutId = setTimeout(() => {
timeoutId = null
// 执行函数
execute()
}, remaining)
}
}
}
}
/**
* 函数防抖动封装。
* 函数防抖(debounce)是指在事件被触发n秒后,才执行回调,如果在这n秒内事件又被触发,则重新计时。
* 主要用于限制函数调用的频率,常用于输入事件处理函数(如输入框的keyup事件)和窗口大小调整事件等。
*
* @param {Function} fn 需要被延迟执行的函数。
* @param {number} delay 延迟执行的时间,单位为毫秒。
* @returns {Function} 返回一个经过防抖动处理的函数。
*/
export function debounce(fn, delay) {
// 用于存储定时器的变量
let timer = null
// 返回一个封装函数
return function () {
// 如果定时器存在,则清除之前的定时器
if (timer) clearTimeout(timer)
// 设置新的定时器,延迟执行原函数
timer = setTimeout(() => {
// 使用apply确保函数在正确的上下文中执行,并传递所有参数
fn.apply(this, arguments)
}, delay)
}
}