zoukankan      html  css  js  c++  java
  • Vue自行封装常用组件-倒计时

    倒计时组件,比较复杂一点,大神勿调侃,精确到毫秒,因为项目中多次出现倒计时,所以拿出来分享下

    使用方法:
    1.在父组件中引入"uni-countdown"
    //import uniCountdown from "./uni-countdown";

    2.在父组件中注册 uniCountdown
    //components:{uniCountdown},

    3.放在父组件中使用
    //<uni-countdown></uni-countdown> 参数代码太多直接看文件里面的吧

    4.调用uniCountdown组件
    //this.StatusLock = true

    注:index.vue为父组件,后者为子组件,效果图先上,可以先看是否是自己想要的组件,再选择使用

    index.vue

    <template>
      <div>
        <div class="TimingBox" v-show="StatusLock">
          <div>
            <p class="texttitle">您的粉丝为您创造{{Amount}}元奖励</p>
            <p class="text">倒计时结束您将永远失去他们</p>
            <div class="ContentOfTheTiming">
              <div style="font-size:.6rem;" class="flex center">
                <uni-countdown
                  bordercolor="#FFAA00"
                  background="url('/wxviews/img/组10.png') center center"
                  fontSize=".7rem"
                  splitorColor="#fa0"
                  :show-day="false"
                  :hour="cdHours"
                  :minute="cdMins"
                  :second="cdSecs"
                  :ms="cdMs"
                ></uni-countdown>
              </div>
            </div>
            <p class="become_a_Member">点击“立即解锁”获得该奖励</p>
            <div class="bigBoxBtn flex center" @click="TheBuyButton()">
              <div class="TheBuyButton">立即获得</div>
            </div>
          </div>
        </div>
      </div>
    </template>
    
    <script>
    
    import uniCountdown from "../components/uni-countdown";
    
    export default {
      data() {
        return {
          //
          cdHours: 0,
          //
          cdMins: 0,
          //
          cdSecs: 0,
          // 毫秒
          cdMs: 60,
    
          Statuslock: false,
          productDetail: {},
          Amount: null
        };
      },
      components:{
          uniCountdown
      },
      created() {
        //在钩子里面先请求接口拿到时间
        this.CountDown();
      },
      methods: {
        CountDown() {
          //请求方式,看你们自己想用啥 就用啥 
          Request.post(
            "api/Post_GetCommissionOrderCountdown",
            {
              MemLoginId: localStorage.getItem("MemLoginId")
            },
            res => {
              
              this.productDetail = res;
              this.Amount = res.Amount;
              //执行showTime()
              const countDownArr = this.showTime(
                null,
                // 拿到结束时间 EndTime
                this.productDetail.EndTime
              ).split("-");
              //Status ? 1 : 0 
              if (res.Status === 0) {
                // 控制显示或隐藏 StatusLock
                this.StatusLock = false;
                return;
              }
              if ((this.cdHours = 0 && this.cdMins == 0 && this.cdSecs == 0)) {
                this.StatusLock = false;
                return;
              }
              if (this.cdHours > 0 || this.cdMins > 0 || this.cdSecs > 0) {
                this.StatusLock = true;
                this.cdHours = countDownArr[0] * 24 + countDownArr[1];
                this.cdMins = countDownArr[2];
                this.cdSecs = countDownArr[3];
                return;
              }
              if (res.Status === 1) {
                this.StatusLock = true;
                this.cdHours = countDownArr[0] * 24 + countDownArr[1];
                this.cdMins = countDownArr[2];
                this.cdSecs = countDownArr[3];
                return;
              }
            },
            err => {}
          );
        },
        TheBuyButton(){
            alert('暂时还没有开放此功能')
        },
        showTime(startTimeStr, endTimeStr) {
          var startTime = startTimeStr
            ? new Date(startTimeStr.replace(/-/g, "/"))
            : new Date();
          var endTime = new Date(endTimeStr.replace(/-/g, "/"));
          var totalSecs = (endTime - startTime) / 1000;
          var days = Math.floor(totalSecs / 3600 / 24);
          var hours = Math.floor((totalSecs - days * 24 * 3600) / 3600);
          var mins = Math.floor((totalSecs - days * 24 * 3600 - hours * 3600) / 60);
          var secs = Math.floor(
            totalSecs - days * 24 * 3600 - hours * 3600 - mins * 60
          );
          if ((days + "").slice(0, 1) != "-") {
            return days + "-" + hours + "-" + mins + "-" + secs;
          } else {
            return 0 + "-" + 0 + "-" + 0 + "-" + 0;
          }
        }
      }
    };
    </script>
    
    <style lang="less" scoped>
    .TheBuyButton {
       4rem;
      height: 1.2rem;
      background: linear-gradient(
        90deg,
        rgba(254, 239, 54, 1) 0%,
        rgba(246, 197, 25, 1) 100%
      );
      box-shadow: 0px 0px 3px 0px rgba(115, 91, 6, 1);
      border-radius: 0.6rem;
      margin: 0 auto;
      position: relative;
      color: #735b06;
      font-size: 0.6rem;
      line-height: 1.2rem;
    }
    .TimingBox {
       100%;
      background: #fff;
      height: 6.7rem;
    }
    .ContentOfTheTiming {
       100%;
      height: 1rem;
      margin: 0 0 0.2rem 0;
    }
    .become_a_Member {
      color: #fff;
      font-size: 0.5rem;
    }
    .djs > div {
       13.8rem;
      height: 6rem;
      margin: 0 auto;
      background-color: #fff;
      background: url("") no-repeat;
      background-size: 100% 100%;
      background-repeat: no-repeat;
      text-align: center;
      border-radius: 0.5rem;
      box-sizing: border-box;
    }
    .bigBoxBtn {
       4.3rem;
      height: 1.5rem;
      background: linear-gradient(
        90deg,
        rgba(254, 239, 54, 1) 0%,
        rgba(246, 197, 25, 1) 100%
      );
      box-shadow: 0px 1px 3px 0px rgba(115, 91, 6, 0.67);
      border-radius: 0.7rem;
      position: relative;
      margin: 0 auto;
      bottom: -0.2rem;
    }
    .center {
      -webkit-box-pack: center;
      -ms-flex-pack: center;
      justify-content: center;
      -webkit-box-align: center;
      -ms-flex-align: center;
      align-items: center;
    }
    .flex {
      display: -webkit-box;
      display: -ms-flexbox;
      display: flex;
    }
    </style>

    uni-countdown.vue

    <template>
      <div class="uni-countdown">
        <div
          v-if="showDay"
          :style="{borderColor:borderColor, color:color, background:background, fontSize:fontSize}"
          class="uni-countdown__number">{{ d }}</div>
        <div
          v-if="showDay"
          :style="{color:splitorColor}"
          class="uni-countdown__splitor">天</div>
        <div
        
          :style="{borderColor:borderColor, color:color, background:background, fontSize:fontSize,backgroundSize:backgroundSize,backgroundRepeat:backgroundRepeat}"
          class="uni-countdown__number"><p style="line-height:1rem; margin:0;">{{ h1 }}</p><hr class="hrxt"></div>
            <div
          :style="{borderColor:borderColor, color:color, background:background, fontSize:fontSize,backgroundSize:backgroundSize,backgroundRepeat:backgroundRepeat}"
          class="uni-countdown__number"><p style="line-height:1rem; margin:0;">{{ h2 }}</p><hr class="hrxt"></div>
        <div
          :style="{color:splitorColor}"
          class="uni-countdown__splitor">{{ showColon ? ':' : '时' }}</div>
        <div
          :style="{borderColor:borderColor, color:color, background:background, fontSize:fontSize,backgroundSize:backgroundSize,backgroundRepeat:backgroundRepeat}"
          class="uni-countdown__number"><p style="line-height:1rem; margin:0;">{{ i1 }}</p><hr class="hrxt"></div>
                 <div
          :style="{borderColor:borderColor, color:color, background:background, fontSize:fontSize,backgroundSize:backgroundSize,backgroundRepeat:backgroundRepeat}"
          class="uni-countdown__number"><p style="line-height:1rem; margin:0;">{{ i2 }}</p><hr class="hrxt"></div>
        <div
          :style="{color:splitorColor}"
          class="uni-countdown__splitor">{{ showColon ? ':' : '分' }}</div>
        <div
          :style="{borderColor:borderColor, color:color, background:background, fontSize:fontSize,backgroundSize:backgroundSize,backgroundRepeat:backgroundRepeat}"
          class="uni-countdown__number"><p style="line-height:1rem; margin:0;">{{ s1 }}</p><hr class="hrxt"></div>
            <div
          :style="{borderColor:borderColor, color:color, background:background, fontSize:fontSize,backgroundSize:backgroundSize,backgroundRepeat:backgroundRepeat}"
          class="uni-countdown__number"><p style="line-height:1rem; margin:0;">{{ s2 }}</p><hr class="hrxt"></div>
        <div
         <div
          :style="{color:splitorColor}"
          class="uni-countdown__splitor">{{ showColon ? ':' : '秒' }}</div>
        <div
          :style="{borderColor:borderColor, color:color, background:background, fontSize:fontSize,backgroundSize:backgroundSize,backgroundRepeat:backgroundRepeat}"
          class="uni-countdown__number"><p style="line-height:1rem; margin:0;">{{ ms1 }}</p><hr class="hrxt"></div>
            <div
          :style="{borderColor:borderColor, color:color, background:background, fontSize:fontSize,backgroundSize:backgroundSize,backgroundRepeat:backgroundRepeat}"
          class="uni-countdown__number"><p style="line-height:1rem; margin:0;">{{ ms2 }}</p><hr class="hrxt"></div>
        <div
          v-if="!showColon"
          :style="{color:splitorColor}"
          class="uni-countdown__splitor">秒</div>
      </div>
    </template>
    <script>
    export default {
      name: 'UniCountdown',
      props: {
        showDay: {
          type: Boolean,
          default: true
        },
        showColon: {
          type: Boolean,
          default: true
        },
            background: {
                type: String,
                default: '#FFFFFF'
            },
        backgroundColor: {
          type: String,
          default: '#FFFFFF'
        },
        borderColor: {
          type: String,
          default: '#000000'
        },
        backgroundImg: {
          type:String,
          default:""
        },
            fontSize: {
                type: String,
          default: '30px'
            },
        color: {
          type: String,
          default: '#fff'
        },
        splitorColor: {
          type: String,
          default: '#000000'
        },
        day: {
          type: Number,
          default: 0
        },
        hour: {
          type: Number,
          default: 0
        },
        minute: {
          type: Number,
          default: 0
        },
        second: {
          type: Number,
          default: 0
        },
        ms: {
          type: Number,
          default: 0
        }
      },
      data () {
        return {
          timer: null,
          d: '00',
          h: '00',
                h1: '00',
                h2: '00',
          i: '00',
                i1: '00',
                i2: '00',
          s: '00',
                s1: '0',
          s2: '0',
          ms: '00',
                ms1: '0',
                ms2: '0',
          leftTime: 0,
          seconds: 0
        }
      },
      created: function (e) {
        this.seconds = this.toSeconds(this.day, this.hour, this.minute, this.second, this.ms)
        this.countDown()
        this.timer = setInterval(() => {
          this.seconds--
          if (this.seconds < 0) {
            this.timeUp()
            return
          }
          this.countDown()
        }, 1000/60)
      },
      beforeDestroy () {
        clearInterval(this.timer)
      },
      methods: {
        toSeconds (day, hours, minutes, seconds, ms) {
          return (day * 60 * 60 * 60 * 24) + (hours * 60 * 60 * 60) + (minutes * 60 * 60)  + (seconds * 60) + ms
        },
        timeUp () {
          clearInterval(this.timer)
          this.$emit('timeup')
        },
        countDown () {
          var seconds = this.seconds
          var [day, hour, minute, second, ms] = [0, 0, 0, 0, 0]
          if (seconds > 0) {
            day = Math.floor(seconds / (60 * 60 * 60 * 24))
            hour = Math.floor(seconds / (60 * 60 * 60)) - (day * 24)
            minute = Math.floor(seconds / 60 / 60) - (day * 24 * 60) - (hour * 60)
            second = Math.floor(seconds / 60) - (day * 24 * 60 * 60) - (hour * 60 * 60) - (minute * 60)
            ms = Math.floor(seconds) - (day * 24 * 60 * 60 * 60) - (hour * 60 * 60 * 60) - (minute * 60 * 60) - (second * 60)
          } else {
            this.timeUp()
          }
          if (day < 10) {
            day = '0' + day
          }
          if (hour < 10) {
            hour = '0' + hour
          }
          if (minute < 10) {
            minute = '0' + minute
          }
          if (second < 10) {
            second = '0' + second
          }
          if (ms < 10) {
            ms = '0' + ms
          }
          this.d = day
          this.h = hour
                this.h1 = hour.toString().slice(0,1)
                this.h2 = hour.toString().slice(1,2)
          this.i = minute
                this.i1 = minute.toString().slice(0,1)
                this.i2 = minute.toString().slice(1,2)
          this.s = second
                this.s1 = second.toString().slice(0,1)
          this.s2 = second.toString().slice(1,2)
          this.ms = ms
                this.ms1 = ms.toString().slice(0,1)
          this.ms2 = ms.toString().slice(1,2)
        }
      }
    }
    </script>
    <style lang="scss">
        $countdown-height:.8rem;
      .uni-countdown__number{
         background-size: 100% 100%;
      background-repeat: no-repeat;
      }
        .uni-countdown {
            padding: .04rem 0;
            display: inline-flex;
            flex-wrap: nowrap;
            justify-content: center;
    
            &__splitor {
                justify-content: center;
                line-height: $countdown-height;
                padding: 0 .1rem;
          font-size: .6rem;
                            
            }
    
            &__number {
                line-height: $countdown-height;
                justify-content: center;
                height: $countdown-height;
                border-radius: .12rem;
                margin: 0 .1rem;
                font-size: .7rem;
                font-weight: 500;
           .7rem;
          height: 1rem;
          box-sizing: border-box;
          background-size: 100% 100%;
        background-repeat: no-repeat;
            }
        }
    
    </style>
    <style lang="less">
      .hrxt{
        position: relative;
        top: -.9rem;
        left: 0;
         .6rem;
        border:1px solid #e5e5e5;
      }
    </style>
  • 相关阅读:
    认识正向代理与反向代理
    python中and和or的用法
    怎样查看端口的占用情况?
    配置FCKeditor
    Ant工具(二)
    myeclipse 提示错误Undefined exploded archive location&deploy project 时不能正常显示 问题的解决
    FCKediter
    Ant工具(一)
    MyEclipse 总是弹出“multiple Errors have Occurred”
    linux下svn的常用代码
  • 原文地址:https://www.cnblogs.com/10ve/p/11730868.html
Copyright © 2011-2022 走看看