微信小程序本地存储实现每日签到、连续签到功能


Posted in Javascript onOctober 09, 2019

昨天在看自己写的小程序项目,无意中打开了CSDN APP,突然间觉得,我去,如果在小程序中加个“签到”功能,岂不美哉!(好吧,其实是买的书昨天没到货,然后闲着无事,就想起了大明湖畔的“签到”)

但是吧,又不想写和服务器交互的,本着“简单点”的原则,我想起了曾经的挚爱—— 本地存储 。

先说说相关注意吧:

其一就是 storage中只能存放字符串!

我去,昨晚大部分时间都是在搞这个。以前一直认为存放的是对象,兴致勃勃写完发现点击以后出现了“NAN”…

觉得 事情并没有这么简单。

仔细回去看了一下曾经Vue写过的localStorage,发现一直弄错了,应该存放字符串!

搞清楚这个以后,又有一个问题:你要“ 点击加1 ”,这里总是把数字和字符串弄反,甚至想了用数组形式存放。。。最终想到了解决办法:把存放的字符串转为数字,加1后再转为字符串存放到storage中 。

想到这我不禁喜形于色,终于可以了!

但是当我无意中狂点16下的时候,我又哭了…

new Date()函数控制日期——一分钟/一天/…只能点一次:

var D=(new Date()).getDate().toString();
 if(D != wx.getStorageSync('D')){ //判断是否过了当天
  //如果是新的一天,则...
 }else{
 //否则,例如:
  wx.showToast({
  title: '今日打卡已完成!',
  icon:'loading',
  duration:1200,
  mask:true
  })
 }

这里又出现一个问题,我在当前页面开始时onLoad里面加了一段代码:把当前时间存放到storage中,但是我发现,这样以后就点不了了(当天),为什么?

因为冲突了啊,加载页面时存放此时时间,那么你如果在这个事件内(本例:一天)去点击,如上面代码第一、二行,它不成立——都是“今天”,所以会执行else语句。

解决办法: 去掉onLoad函数,这样开始执行if时候会发现storage中没有存储,也就“!=”了。

下面放上示例代码:

hello.wxml

<view class="container">
 <view class="mxc1">
 <text>您已签到 {{firstTime}} 次</text>
 </view>
 <view class="{{flag?'mxc2-1':'mxc2-2'}}" bindtap="onBindTap">
 <text>我要签到</text>
 </view>
</view>

hello.wxss

.container{
 background-color: ghostwhite;
 width: 100%;
 height: 100%;
 flex-direction: column;
 display: flex;
 align-items: center;
 min-height: 100vh;
}
.mxc1{
 position: relative;
 width: 100%;
 height: 400rpx;
 border-top: 1px solid #000;
 border-bottom: 1px solid #000;
 margin-top: -70rpx;
 flex-direction: column;
 display: flex;
 align-items: center;
 background-color: #efeff4;
}
.mxc1 text{
 font-size: 30rpx;
 font-weight: bold;
 line-height: 400rpx;
}
.mxc2-1{
 position: absolute;
 width: 60%;
 height: 74rpx;
 border: 1px solid rgba(247, 2, 2, 0.959);
 background-color: rgba(247, 2, 2, 0.959);
 border-radius: 3px;
 flex-direction: column;
 display: flex;
 align-items: center;
 margin-top: 396rpx;
}
.mxc2-1 text{
 color: white;
 font-size: 32rpx;
 line-height: 74rpx;
}
.mxc2-2{
 position: absolute;
 width: 60%;
 height: 74rpx;
 border: 1px solid rgba(182, 177, 177, 0.959);
 background-color: rgba(182, 177, 177, 0.959);
 border-radius: 3px;
 flex-direction: column;
 display: flex;
 align-items: center;
 margin-top: 396rpx;
}
.mxc2-2 text{
 color: #000;
 font-size: 32rpx;
 line-height: 74rpx;
}

hello.js

Page({
 data:{
 firstTime:'0',
 flag:true
 },
 onBindTap:function(){
 var D=(new Date()).getDate().toString();
 if(D != wx.getStorageSync('D')){
  wx.setStorageSync('D', D);
  wx.setStorage({
  key: 'FirstTime',
  data: (parseInt(this.data.firstTime) + 1).toString(),
  })
  var that = this;
  var firstTime = wx.getStorage({
  key: 'FirstTime',
  success: function (res) {
   that.setData({
   firstTime: res.data,
   flag:false
   })
   wx.showToast({
   title: '签到成功!',
   icon: 'success',
   duration: 1200,
   mask: true
   })
  },
  })
 }else{
  wx.showToast({
  title: '今日打卡已完成!',
  icon:'loading',
  duration:1200,
  mask:true
  })
 }
 },
 onShow:function(options){
 var that = this;
 var firstTime = wx.getStorage({
  key: 'FirstTime',
  success: function (res) {
  that.setData({
   firstTime: res.data
  })
  },
 })
 var D = (new Date()).getDate().toString();
 if (D != wx.getStorageSync('D')){
  this.setData({
  flag:true
  })
 }else{
  this.setData({
  flag:false
  })
 }
 },
})

hello.json

{
 "navigationBarTitleText": "签到",
 "navigationBarTextStyle": "black",
 "navigationBarBackgroundColor": "ghostwhite"
}

扩展时刻:

刚刚实现了简单的签到功能,那么,怎么实现连续签到呢?

我想了一晚上,因为刚开始时思路跑到了“误区”——判断点击后加1的事件是否匹配。但是你点击后加1是个被动事件,唯一条件就是点击,拿这个判断岂不是很难受?

于是,我们同样可以用parseInt()函数来把当前日期(时间)和缓存日期(时间)作比较 ,判断他们是否满足:

var D=(new Date()).getDate().toString();

在点击事件onBindTap里:

var DT=wx.getStorageSync('D');
if(parseInt(D)!=parseInt(DT)+1){
 //非连续签到 对应的操作
}else{
 //连续签到
}

易错点提示:

上面 hello.js 代码中有这么一行:this.data.firstTime

那有没有人想过 只写firstTime?

小程序中用data中的数据(变量)必须加上“this.data.”前缀!

总结

以上所述是小编给大家介绍的微信小程序本地存储实现每日签到、连续签到功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
基于jQuery的实现简单的分页控件
Oct 10 Javascript
Jquery加载时从后台读取数据绑定到dropdownList实例
Jun 09 Javascript
一分钟理解js闭包
May 04 Javascript
利用VUE框架,实现列表分页功能示例代码
Jan 12 Javascript
微信小程序 navbar实例详解
May 11 Javascript
webpack打包多页面的方法
Nov 30 Javascript
微信小程序 JS动态修改样式的实现方法
Dec 16 Javascript
ES6 如何改变JS内置行为的代理与反射
Feb 11 Javascript
Vue2.x通用条件搜索组件的封装及应用详解
May 28 Javascript
nuxt.js 在middleware(中间件)中实现路由鉴权操作
Nov 06 Javascript
vue.js+element 默认提示中英文操作
Nov 11 Javascript
详解ES6 扩展运算符的使用与注意事项
Nov 12 Javascript
Vue.js实现大转盘抽奖总结及实现思路
Oct 09 #Javascript
js基础之事件捕获与冒泡原理
Oct 09 #Javascript
微信内置浏览器图片查看器的代码实例
Oct 08 #Javascript
vue封装swiper代码实例解析
Oct 08 #Javascript
jQuery实现提交表单时不提交隐藏div中input的方法
Oct 08 #jQuery
简单实现节流函数和防抖函数过程解析
Oct 08 #Javascript
微信小程序返回箭头跳转到指定页面实例解析
Oct 08 #Javascript
You might like
PHP 循环列出目录内容的函数代码
2010/05/26 PHP
php设计模式 Singleton(单例模式)
2011/06/26 PHP
php设计模式 Strategy(策略模式)
2011/06/26 PHP
php使用curl模拟登录后采集页面的例子
2013/11/04 PHP
PHP json_decode函数详细解析
2014/02/17 PHP
php检测apache mod_rewrite模块是否安装的方法
2015/03/14 PHP
php实现的农历算法实例
2015/08/11 PHP
验证token、回复图文\文本、推送消息的实用微信类php代码
2016/06/28 PHP
Yii框架创建cronjob定时任务的方法分析
2017/05/23 PHP
你需要知道的JavsScript可以做什么?
2007/06/29 Javascript
js中将多个语句写成一个语句的两种方法小结
2007/12/08 Javascript
jquery异步循环获取功能实现代码
2010/09/19 Javascript
js中的onchange和onpropertychange (onchange无效的解决方法)
2014/03/08 Javascript
前端框架Vue.js构建大型应用浅析
2016/09/12 Javascript
jquery仿京东商品放大浏览页面
2017/06/06 jQuery
详解React中传入组件的props改变时更新组件的几种实现方法
2018/09/13 Javascript
在vue项目中,将juery设置为全局变量的方法
2018/09/25 Javascript
解决echarts echarts数据动态更新和dataZoom被重置问题
2020/07/20 Javascript
ant design vue datepicker日期选择器中文化操作
2020/10/28 Javascript
Js数组扁平化实现方法代码总汇
2020/11/11 Javascript
python实现封装得到virustotal扫描结果
2014/10/05 Python
python中lambda与def用法对比实例分析
2015/04/30 Python
使用 python pyautogui实现鼠标键盘控制功能
2019/08/04 Python
python打印异常信息的两种实现方式
2019/12/24 Python
python程序文件扩展名知识点详解
2020/02/27 Python
Python3内置函数chr和ord实现进制转换
2020/06/05 Python
tensorflow 动态获取 BatchSzie 的大小实例
2020/06/30 Python
迷你唐卡软皮鞋:Minnetonka Moccasin
2018/05/01 全球购物
New delete 与malloc free 的联系与区别
2013/02/04 面试题
关于梦想的演讲稿
2014/05/05 职场文书
学校学习雷锋活动总结
2014/07/03 职场文书
竞选学习委员演讲稿
2014/09/01 职场文书
庆七一宣传标语
2014/10/08 职场文书
2015年学校教育教学工作总结
2015/04/22 职场文书
2015年机械设备管理工作总结
2015/05/04 职场文书
2019年思想汇报
2019/06/20 职场文书