Vue中使用定时器

Vue中使用定时器

注意事项:

# 关键点1:
使用的时候要用window.setInterval(this.timer, 1000);不要用vue原生的,否则出现问题
# 关键点2:
如果非要用vue的setInterval,赋值的时候要全局变量赋值。
window.xxx = setInterval(this.timer, 1000)
清除的定时器的时候
clearInterval(window.xxx);
# 关键点3:
setInterval第一次执行会等待时间间隔后执行,所以要想在timmer里面做所有的数据的话,需要手动执行以下timmer().

代码

// 保证了当为00s显示0s状态时长为1s。
// 但是0s的期间优惠价格消失,替换成原价。
// 也就是说看到0s优惠价格已经无效了。
<template>
<div v-if="!(end_time_info.surplus_total_secondse<-1)">
                        <div class="sale-time">
                            <p class="sale-type">{{course_info.discount_type}}</p>
                            <p class="expire">距离结束:仅剩 {{end_time_info.day}}天 {{end_time_info.hour}}小时 {{end_time_info.minute}}分 <span
                                    class="second">{{end_time_info.second}}</span> 秒</p>
                        </div>
                        <div ></div>
                        <div v-if="!(end_time_info.surplus_total_secondse<0)">
                            <p class="course-price">
                                <span>活动价</span>
                                <span class="discount">¥{{course_info.real_price}}</span>
                                <span class="original">¥{{course_info.price}}</span>
                            </p>
                        </div>
                    </div>
                    <div v-else class="sale-time">
                        <p class="sale-type">价格 <span class="original_price">¥{{course_info.price}}</span></p>
                        <p class="expire"></p>
                    </div>

</template>




<script>
                            
                            
                            
 data() {
            return {
                end_time_info:{
                  day:'  ',
                  hour:'  ',
                  minute:'  ',
                  second:'  ',
                  surplus_total_secondse:-2,
                  surplus_total_secondse_start:'',
                  timmer_setinterval:1 // 相当于一个第一次执行的开关,或者他可以变为间隔值,有兴趣可以再度封装。
                },
                tabIndex: 2,   // 当前选项卡显示的下标
                course_id: 0, // 当前课程信息的ID
                course_info: {
                    teacher: {},
                }, // 课程信息
                course_chapters: [], // 课程的章节课时列表
                playerOptions: this.$settings.playerOptions
            }                           
// 某个ajax请求后台
    this.$axios.get(`${this.$settings.base_url}/course/${this.course_id}/`).then(response => {
                    // window.console.log(response.data);
                    this.course_info = response.data;

                    // 剩余总共秒数
                    if (this.course_info.active_time){
                        this.end_time_info.surplus_total_secondse = this.get_seconds(this.course_info.active_time);
                        // this.end_time_info.surplus_total_secondse = this.get_seconds("2019-12-18 12:58:30");
                        this.timer();
                        // 统计剩余时间
                        this.end_time_info.timmer_setinterval = window.setInterval(this.timer, 1000);

                    }


                })


// 方法们
    methods(){
        get_seconds(active_time){
                    let timeDate = active_time;
                    let end_time = new Date(timeDate);
                    let end_time_seconds = Math.floor(end_time.getTime()/1000);

                    let now = new Date();
                    let now_seconds = Math.floor(now.getTime()/1000);
                    let surplus_seconds = end_time_seconds - now_seconds;
                    return surplus_seconds
                },
         timer() {
                // 为了让用户看到0的时候显示1s,其实在surplus_total_secondse=-1期间用户已经看不到优惠价格了

                if (this.end_time_info.surplus_total_secondse < -1){
                    console.log('我被执行了');
                    clearInterval(this.end_time_info.timmer_setinterval);
                    // this.end_time_info.timmer_setinterval = ""
                    return
                }
                //开局第一次就显示剩余秒数.因为setinterval 会等一个间隔s才执行
                if (this.end_time_info.surplus_total_secondse_start){
                    this.end_time_info.surplus_total_secondse = this.end_time_info.timmer_setinterval+ this.end_time_info.surplus_total_secondse
                }
                // 第二次就进不来了,当执行到最后的时候会自己-1也就回到了正常s数。
                this.end_time_info.surplus_total_secondse_start = '';
                // 为什么可以等于0就是为了显示效果为了让用户看到0,实则优惠价格就在此刻已经消失。
                if(this.end_time_info.surplus_total_secondse>=0){
                    let surplus_secondse = this.end_time_info.surplus_total_secondse;
                    //包含的天数
                    let day = Math.floor(surplus_secondse / (3600 * 24));
                    // console.log(d,'天数')
                    let s = surplus_secondse - day * 3600 * 24;
                    //计算包含的小时数
                    let hour = Math.floor(s / 3600);
                    s -= hour * 3600; //剩下的秒数
                    //计算包含的分钟数
                    let minute = Math.floor(s / 60);
                    //计算剩下的秒
                    let second = s - minute * 60;


                    this.end_time_info.day = day < 10 ? '0' + day : day;
                    this.end_time_info.hour = hour < 10 ? '0' + hour : hour;
                    this.end_time_info.minute = minute < 10 ? '0' + minute : minute;
                    this.end_time_info.second = second < 10 ? '0' + second : second; // 0s的时候代表所有的秒数走完了 显示的非常快0是看不到的
                    console.log(this.end_time_info.second);
                    // this.end_time_info.surplus_total_secondse -= 1;
                }
                this.end_time_info.surplus_total_secondse -= 1;
                console.log(this.end_time_info.surplus_total_secondse);

            },

         }
</script>