微信小程序-全局倒计时+全局弹窗提示

这篇具有很好参考价值的文章主要介绍了微信小程序-全局倒计时+全局弹窗提示。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

需求描述

1、在计时页面中点击【开始】按钮开始倒计时,当退出该页面时计时仍然继续
2、计时结束后,弹出提示(无论当前处于哪个页面)

最终效果

微信小程序-全局倒计时+全局弹窗提示
微信小程序-全局倒计时+全局弹窗提示

代码

一、全局定义
1、app.json:加上下面这个

 "usingComponents": {"dialog":"/components/dialog/dialog"}

2、app.wxss:需要导入dialog.wxss,否则自定义的弹窗样式失效

@import "components/dialog/dislog.wxss";

3、app.js:实现倒计时+设置变量监听器

App({
  globalData:{
    //倒计时相关的全局变量
    hour: 1,
    firstMinute: 0,
    lastMinute: 0,
    firstSecond: 0,
    lastSecond: 0,
    timer:null,
    isstart_flag: false, 
  },
   isShow:false,
    /**
     * 设置globalData中变量的监听器
     */
    setWatcher(watch) {
      let obj = this.globalData;
      Object.keys(obj).forEach(v => {
          this.observe(obj,v,watch); 
      })
  },
  /**
     * 设置isShow变量的监听器
     */
    setWatcher1(watch) {
      var val = this.isShow; // 给该属性设默认值
      Object.defineProperty(this, "isShow", {
          configurable: true,
          enumerable: true,
          set: function(value) {
              val = value;
              watch(val); // 赋值(set)时,调用对应函数
          },
          get: function() {
              return val;
          }
      })
  },
  /**
   * 监听属性 并执行监听函数
   */
   observe(obj, key,watchFun) {
     var val = obj[key]; // 给该属性设默认值
     Object.defineProperty(obj, key, {
         configurable: true,
         enumerable: true,
         set: function(value) {
             val = value;
             watchFun(key,val); // 赋值(set)时,调用对应函数
         },
         get: function() {
             return val;
         }
     })
    },
    //倒计时-具体实现由其他同事编写
    countDown() {
      var obj = this.globalData;
      var self = this;
      clearInterval(obj.timer)
      var h = 0;
      var m = 59,
      var s = 60;
      var timer = setInterval(function () {
        --s;
        if (s < 0) {
          --m;
          s = 59;
        }
        if (m < 0) {
          --h;
          m = 59
        }
        if (h < 0) {
          s = 0;
          m = 0;
        }
        if (h == 0 && m == 0 && s == 0) {
          self.isShow = true;
          clearInterval(obj.timer);
        }
        function checkTime(i) {
          if (i < 10) {
            i = '0' + i
          }
          return i;
        }
        s = checkTime(s);
        let n = checkTime(m)
        if (n.length >= 2) {
          m = n.slice(-2);
        }
        let strMinute = m.toString();
        let splMinute = strMinute.split("");
        let firstMinute = splMinute[0];
        let lastMinute = splMinute[1];
  
        let strSecond = s.toString();
        let splSecond = strSecond.split("");
        let firstSecond = splSecond[0];
        let lastSecond = splSecond[1];

        obj.hour = h;
        obj.firstMinute = firstMinute;
        obj.lastMinute = lastMinute;
        obj.firstSecond = firstSecond;
        obj.lastSecond = lastSecond;
      }, 1000);
      obj.timer = timer;
    },
})

二、组装弹窗组件

注意:class名称尽量不要与其他页面重复

1、dialog.wxml

<view class='wx_dialog_container' hidden="{{!isShow}}">
    <view class='wx-mask'></view>
    <view class="alert1">
        <view class="white1">
            <view class="title1">提示</view>
            <view class="text2">计时结束</view>
            <view class="btn1" bindtap="_confirmEvent">我知道了</view>
        </view>
    </view>
</view>

2、dialog.wxss

.wx-mask{
position: fixed;
z-index: 9998;
top: 0;
right: 0;
left: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.3);
}
.wx-dialog{
position: fixed;
z-index: 9999;
width: 80%;
max-width: 600rpx;
top: 50%;
left: 50%;
-webkit-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
background-color: #FFFFFF;
text-align: center;
border-radius: 3px;
overflow: hidden;
}
.wx-dialog-title{
font-size: 18px;
padding: 15px 15px 5px;
}
.wx-dialog-content{
padding: 15px 15px 5px;
min-height: 40px;
font-size: 16px;
line-height: 1.3;
word-wrap: break-word;
word-break: break-all;
color: #999999;
}
.wx-dialog-footer{
display: flex;
align-items: center;
position: relative;
line-height: 45px;
font-size: 17px;
}
.wx-dialog-footer::before{
content: '';
position: absolute;
left: 0;
top: 0;
right: 0;
height: 1px;
border-top: 1px solid #D5D5D6;
color: #D5D5D6;
-webkit-transform-origin: 0 0;
transform-origin: 0 0;
-webkit-transform: scaleY(0.5);
transform: scaleY(0.5);
}
.wx-dialog-btn{
display: block;
-webkit-flex: 1;
flex: 1;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
position: relative;
}
.wx-dialog-footer .wx-dialog-btn:nth-of-type(1){
color: #353535;
}
.wx-dialog-footer .wx-dialog-btn:nth-of-type(2){
color: #3CC51F;
}
.wx-dialog-footer .wx-dialog-btn:nth-of-type(2):after{
content: " ";
position: absolute;
left: 0;
top: 0;
width: 1px;
bottom: 0;
border-left: 1px solid #D5D5D6;
color: #D5D5D6;
-webkit-transform-origin: 0 0;
transform-origin: 0 0;
-webkit-transform: scaleX(0.5);
transform: scaleX(0.5);
}
.alert1{
  width:100%;
  height:100%;
  background:rgba(41,36,33,0.5);
  position:fixed;
  top:0;
  left:0;
  z-index:99999;
  display:flex;
  justify-content:center;
  align-items:center;
}
.white1{
  width:608rpx;
  height:362rpx;
  background-color:#fff;
  display:flex;
  flex-direction:column;
  align-items:center;
  justify-content:space-between;
  font-size:28rpx;
  border-radius:20rpx;
  padding:5% 3%;
}
.white1 .title1{
  font-size: 40rpx;
}
.white1 .text2{
  font-size: 30rpx;
  color: #a1a3a6;
  margin-bottom: 60rpx;
}
.btn1{
  width: 100%;
  height: 60rpx;
  border-top: 2rpx solid #eee;
  text-align: center;
  line-height: 60rpx;
  color: #45b97c;
  font-size: 30rpx;
}

3、dialog.json

{
  "component": true,       
  "usingComponents": {}     
}

4、dialog.js

const app = getApp();
Component({
  options: {
    multipleSlots: true, // 在组件定义时的选项中启用多slot支持
    addGlobalClass: true
  },
  /**
   * 组件的属性列表
   * 用于组件自定义设置
   */
  properties: {
  },

  /**
   * 私有数据,组件的初始数据
   * 可用于模版渲染
   */
  data: {
    // 弹窗显示控制
    isShow:false
  },

  lifetimes:{
    attached: function () {
      const self = this;
      self.setData({
        isShow: app.isShow,
      })
      
    },
  },

  pageLifetimes:{
    show(){
      const self = this;
      app.setWatcher1(self.watchBack2.bind(self))
    }
  },

  /**
   * 组件的方法列表
   * 更新属性和数据的方法与更新页面数据的方法类似
   */
  methods: {
    watchBack2(value){
      this.setData({
        isShow:value,
      })
    },
     /*
     * 内部私有方法建议以下划线开头
     * triggerEvent 用于触发事件
     */
    _confirmEvent(){
      app.isShow = false;
      this.setData({
        isShow: false
      })
    }
  }
})

三、倒计时页面实现

1、startCountDown.wxml

<view class="Container">
    <view class="nz_container">
        <view class="time">
            <view class="time_item">{{hour}}</view>
            <view class="time_items">:</view>
            <view class="time_item">{{firstMinute}}</view>
            <view class="time_item">{{lastMinute}}</view>
            <view class="time_items">:</view>
            <view class="time_item">{{firstSecond}}</view>
            <view class="time_item">{{lastSecond}}</view>
        </view>
    </view>
    <view class="start_btn" wx:if="{{isstart_flag}}" bindtap="reSet">重置</view>
    <view class="start_btn" wx:else bindtap="startCountDown">开始</view>
    <!-- 弹窗 -->
    <view class="dialog"> 
      <dialog id='dialog'>
      </dialog>
    </view>
</view>

2、startCountDown.wxss

page{
    width:100%;
    height:100%;
    background-color:#eee;
    overflow:hidden;
}
.nz_container{
    width:100%;
    height:394rpx;
    background: #FFFFFF;
    border-radius: 6rpx;
    margin-top:1.2%;
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
}
.time{
    width:422rpx;
    height:88rpx;
}
.time_item{
    width: 70rpx;
    height: 88rpx;
    background: #F0FAF8;
    border: 2rpx solid #149C89;
    border-radius: 6rpx;
    font-family: PingFangSC-Medium;
    font-size: 56rpx;
    color: #333333;
    letter-spacing: 3.5rpx;
    text-align: center;
    font-weight: 500;
    margin-left:2%;
    margin-right:2%;
}
.time_items{
    font-size:60rpx;
}
.changetime_btn{
    width:422rpx;
    height:68rpx;
    border: 1px solid #149C89;
    border-radius: 34rpx;
    margin-top: 5%;
    display: flex;
    justify-content: center;
    align-items: center;
}
.changetime_btn image{
    width:32rpx;
    height:28rpx;
}
.start_btn{
    width: 690rpx;
    height: 104rpx;
    background: #149C89;
    border-radius: 55rpx;
    text-align: center;
    line-height: 104rpx;
    font-family: PingFangSC-Semibold;
    font-size: 40rpx;
    color: #FFFFFF;
    letter-spacing: 0;
    font-weight: 600;
    margin: 6% auto;
}
.dialog{
  position: fixed;
  top:40%;
  left: 40%;
  z-index: 9999;
}

3、startCountDown.js

var app = getApp();
Page({
  data: {
    hour: 1,
    firstMinute: 0,
    lastMinute: 0,
    firstSecond: 0,
    lastSecond: 0,
    timer:null,
    isstart_flag: false,
  },

  /**
     * 生命周期函数--监听页面加载
     */
    onLoad: function (options) {
      const that = this;
        //设置全局变量监听器
        app.setWatcher(this.watchBack);
        that.setData({
          hour: app.globalData.hour,
          firstMinute: app.globalData.firstMinute,
          lastMinute: app.globalData.lastMinute,
          firstSecond: app.globalData.firstSecond,
          lastSecond: app.globalData.lastSecond,
          timer: app.globalData.timer,
          isstart_flag:app.globalData.isstart_flag,
        })
    },
    watchBack(variable,value){
      const that = this;
      that.setData({
        [variable]:value,
      })
    },

  //开始倒计时
  startCountDown() {
    app.globalData.isstart_flag = true;
    app.countDown();
  },
  //重置倒计时
  reSet() {
    const that = this;
    clearInterval(app.globalData.timer);
    app.globalData.hour = 1;
    app.globalData.firstMinute = 0;
    app.globalData.lastMinute = 0;
    app.globalData.firstSecond = 0;
    app.globalData.lastSecond = 0;
    app.globalData.isstart_flag = false;
  },
  onUnload() {
    const that = this;
    // clearInterval(app.globalData.timer);
  }
})

四、在每一个页面都可以弹出弹窗提示

暂时未找到更简单的方法。。。

1、在每个页面的wxml中加上

<view class="dialog"> 
      <dialog id='dialog'>
      </dialog>
    </view>

2、在每个页面的wxss中加上:文章来源地址https://www.toymoban.com/news/detail-497753.html

.dialog{
  position: fixed;
  top:40%;
  left: 40%;
  z-index: 9999;
}

到了这里,关于微信小程序-全局倒计时+全局弹窗提示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序实现倒计时功能,一看就懂,直接用

    结构完整,直接用就可以

    2024年02月01日
    浏览(45)
  • 基于Element UI或Element Plus实现具有倒计时的Message消息提示

    刚好遇到一个需要自动关闭消息提示的需求,可Element框架暂时没有实现这个功能。开始时没有头绪,于是搜一下道友的博客文章,看到有一篇文章实现了这个功能,在此我完善了一下这个技巧方法。完善后的技巧方法支持多次点击,实例化多个消息提示,每个消息提示都具有

    2024年02月07日
    浏览(32)
  • Linux小程序:倒计时和进度条

    在Linux中我们实现两个小程序来体会r和n的区别,以及缓冲区是什么? 对于 r 和 n 的理解: n 表示换行且回到下一行的最开始的位置 r 表示的是回车,即将光标回到当前行最开始的位置 在C语言中,我们单单使用“n”就可以实现换行回车,但是”r“只能表示回车 Linux缓

    2024年02月17日
    浏览(32)
  • python实现一个简单的桌面倒计时小程序

    本章内容主要是利用python制作一个简单的桌面倒计时程序,包含开始、重置 、设置功能。 目录 一、效果演示 二、程序代码

    2024年02月04日
    浏览(43)
  • 手机短信验证码登录功能的开发实录(机器识别码、短信限流、错误提示、发送验证码倒计时60秒)

    短信验证码是通过发送验证码到手机的一种有效的验证码系统,作为比较准确和安全地保证购物的安全性,验证用户的正确性的一种手段,几乎网站登录都会使用该方式。 其特点是依据某些验证码接入商提供手机短信验证码服务,各网站通过接口发送请求到接入商的服务器,

    2024年02月02日
    浏览(34)
  • uni-app小程序中实现倒计时功能

    在uni-app小程序中实现倒计时功能,可以按照以下步骤进行: 在data中设置一个变量用于存储倒计时的剩余时间: 在methods中创建一个函数,用于控制倒计时的逻辑: 可以在点击按钮或其他事件触发时调用startCountdown方法来开始倒计时: 在页面中显示倒计时时间: 可以在页面中

    2024年02月07日
    浏览(35)
  • 蓝桥杯倒计时 | 倒计时4天

    作者🕵️‍♂️:让机器理解语言か 专栏🎇:蓝桥杯倒计时冲刺 描述🎨:蓝桥杯冲刺阶段,一定要沉住气,一步一个脚印,胜利就在前方! 寄语💓:🐾没有白走的路,每一步都算数!🐾 题目描述 我们要求找出具有下列性质数的个数(包含输入的自然数 n): 先输入一个自

    2023年04月09日
    浏览(43)
  • 51单片机实现倒计时,按键控制倒计时

    基于AT89C52的答辩倒计时。四个按键分别控制倒计时开始,暂停,时间加和减。剩下30S时蜂鸣器响,倒计时结束蜂鸣器响。  

    2024年02月07日
    浏览(43)
  • 51单片机的简易篮球计分器倒计时仿真设计( proteus仿真+程序+原理图+报告+讲解视频)

    51单片机的简易篮球计分器倒计时仿真设计( proteus仿真+程序+原理图+报告+讲解视频) 仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0048 本设计旨在设计一个基于51单片机的篮球比赛计分器仿真设计,下面是设计的功能要求 1.可以在比赛期间随时更

    2024年02月09日
    浏览(37)
  • Flutter实现倒计时功能,秒数转时分秒,然后倒计时

    Flutter实现倒计时功能 发布时间:2023/05/12 本文实例为大家分享了Flutter实现倒计时功能的具体代码,供大家参考,具体内容如下 有一个需求,需要在页面进行显示倒计时,倒计时结束后,做相应的逻辑处理。 实现思路:在Flutter中,Timer.periodic提供了循环功能,查看函数定义:

    2024年02月13日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包