• 微信 头条小程序 记录一次电商项目倒计时活动优化


    微信 头条小程序 记录一次电商项目倒计时活动优化

    为了解决同一个页面需要开启多个定时器影响页面性能问题,封装了如下方法
    封装一下函数 coundown.js

    /**
     * @function initSeckill 初始化函数,激活定时器调用
     * @function clearCountdown  清除定时器
     * 参数传入格式:[key:{},key:{}] 
     *    key: {
     *      endTime startTime currentTime
     *   }
     * key唯一标识,用于页面for循环渲染时能够准确找到对应的定时器key
     */
    
    export function initSeckill(event) {
    	let obj = {};
    	for (let key in event) {
    		let t;
    		let endTime = event[key].endTime.split('.')[0].replace(new RegExp(/(-)/g), '/');
    		let startTime = event[key].startTime.split('.')[0].replace(new RegExp(/(-)/g), '/');
    		startTime = new Date(startTime).getTime();
    		endTime = new Date(endTime).getTime();
    		let currentTime = event[key].currentTime.replace(new RegExp(/(-)/g), '/');
    		currentTime = new Date(currentTime).getTime();
    
    		if(startTime > currentTime) {
    			t = (startTime - currentTime) / 1000;
    		}else {
    			t = (endTime - currentTime) / 1000;
    		}
    		obj[key] = t;
    	}
    	startCountDown(obj);
    }
    let times = null;
    
    function startCountDown(t) {
    	let currentPages = getCurrentPages();
    	currentPages = currentPages[currentPages.length - 1];
    	times = setInterval(() => {
    		let resultsObj = {};
    		for (let key in t) {
    			if (t[key] > 0) {
    				t[key]--;
    				let {
    					day,
    					hour,
    					minute,
    					second
    				} = formatTime(t[key]);
    				if(day > 0) {
    					hour = (day * 24 + hour) >= 100 ? 99 : (day * 24 + hour)
    				}
    				hour = leadingZeros(hour);
    				minute = leadingZeros(minute);
    				second = leadingZeros(second);
    				resultsObj[key] = {hour,minute,second}
    			} else {
    				clearInterval(times);
    				times = null;
    				console.log('倒计时结束',key);
    				currentPages.countdownTimeout();
    				return;
    			}
    		}
    		currentPages.getNormalTime(resultsObj); //返回当前秒杀时间
    	}, 1000);
    }
    
    //处理时间格式
    function formatTime(time) {
    	let seconds = time;
    	let day = Math.floor(seconds / (60 * 60 * 24));
    	let hour = Math.floor(seconds / (60 * 60)) - (day * 24);
    	let minute = Math.floor(seconds / 60) - (day * 24 * 60) - (hour * 60);
    	let second = Math.floor(seconds) - (day * 24 * 60 * 60) - (hour * 60 * 60) - (minute * 60);
    	return {
    		day,
    		hour,
    		minute,
    		second
    	};
    }
    
    //补零
    function leadingZeros(num, length = 2) {
    	num = String(num)
    	if (num.length > length) return num
    	return (Array(length + 1).join(`0`) + num).substr(-length)
    }
    
    export function clearCountdown() {
    	clearInterval(times);
    	times = null;
    }
    

    使用

    //引入coundown.js
    import {
      initSeckill,
      clearCountdown
    } from './countdown';
    
    //在获取到列表数据时直接调用
    /**
    *seckillInfoObj [ key: {
    *       endTime startTime currentTime
    *   }]
    */
    initSeckill(seckillInfoObj);
    
    //在该清空定时器的地方
    onHide() {
        clearCountdown();
    }
    
    
  • 相关阅读:
    jquery的$.与$.fn的区别
    jquery加载页面的方法
    创业股权究竟如何分配--新浪创业训练营
    创业者要处理好的10大关系
    洪泰基金投资经理殷鹏:肯定不投的八类项目
    创业初期股权如何分配-------陈楠心血总结
    排序总结
    如何快速进入一门领域,学习新的知识
    虚拟机的设置
    华为大数据项目fusionInsight
  • 原文地址:https://www.cnblogs.com/xiechuanghong/p/14115508.html
Copyright © 2020-2023  润新知