微信小程序实现发送验证码按钮效果


Posted in Javascript onDecember 20, 2018

本文实例为大家分享了微信小程序发送验证码按钮效果展示的具体代码,供大家参考,具体内容如下

首先上图,最终效果如下:

微信小程序实现发送验证码按钮效果

实现关键点

  • 获取验证码按钮无边框: 可以用 button::after{ border: none; } 来去除边框,或者直接用view绑定点击事件。本例子中没有使用button
  • 点击发送后,60秒内按钮处于disable状态
  • 点击发送后,text分为剩余秒数后缀两部分
  • .form_group 使用 flex 布局

代码

.wxml

<view class="form_group">
  <input type="text" placeholder="手机号码" placeholder-class="placeholder_style" data-name="data_phone" value="{{data_phone}}" bindinput='getInputKey' />
 </view>
 <view class="form_group">
  <input type="text" class="sendmsg_input" placeholder="短信验证码" data-name="data_code" value="{{data_code}}" placeholder-class="placeholder_style" bindinput='getInputKey' />
  <view class='vertificate' bindtap="getVerificationCode">{{time}}
  <text>{{suffix}}</text>
  </view>
 </view>

.wxss

.form_group {
 display: flex;
 flex-direction: row;
 justify-content: space-between;
}

.form_group input, .form_group picker {
 width: 676rpx;
 border-bottom: 1px solid #ddd;
 height: 121rpx;
 padding-left: 20rpx;
 font-family: PingFangSC-Regular;
 font-size: 32rpx;
 letter-spacing: 0;
 line-height: 121rpx;
}

.form_group .sendmsg_input {
 width: 370rpx;
}

.form_group .vertificate {
 width: 326rpx;
 border-bottom: 1px solid #ddd;
 height: 121rpx;
 padding-left: 20rpx;
 font-family: PingFangSC-Regular;
 font-size: 32rpx;
 letter-spacing: 0;
 line-height: 121rpx;
 text-align: center;
 color: #34c9c3;
}

.vertificate text {
 color: gray;
}

.placeholder_style {
 font-family: PingFangSC-Regular;
 font-size: 32rpx;
 color: #dbdbdb;
 letter-spacing: 0;
}

.js

import SignupService from '../service/sign-up.service.js';
import HTTP from '../../../utils/http.js';
import Util from '../../../utils/util.js';

let _signupService = new SignupService();
let _http = new HTTP();
let _util = new Util();

Page({
 data: {
 time: "获取验证码",
 currentTime: 61,
 disabled:false,
 suffix:'',
 data_phone:'',
 data_code:'',
 },
 
 ...
 
 // 获取输入框的值
 getInputKey(e) {
 let key = e.currentTarget.dataset.name;
 let value = e.detail.value;
 this.setData({
  [key]: value
 })
 },

 // 获取验证码
 getVerificationCode() {
 let _this = this;
 if (!_this.data.disabled) {
  _this.getCode();
 }
 },

 getCode() {
 let _this = this;
 let phone = _this.data.data_phone;
 if (_util.isPhoneAvailable(phone)) {
  _signupService.getCode(phone).then(res=>{  // 调用后端API,获取手机验证码
  _util.showToast('success',"已发送");
  _this.setData({
   disabled: true
  })
  },err=>{
  _util.showToast('none',"发送失败")
  });
  
  // 设置发送验证码按钮样式
  let interval = null;
  let currentTime = _this.data.currentTime;

  interval = setInterval(function() {
  currentTime--;
  _this.setData({
   time: currentTime,
   suffix: '秒后可重新获取'
  })
  if (currentTime <= 0) {
   clearInterval(interval)
   _this.setData({
   time: '重新发送',
   suffix: '',
   currentTime: 61,
   disabled: false
   })
  }
  }, 1000)
 } else {
  _util.showToast('none','请输入正确的手机号码。');  
 }
 },

sign-up.service.js

//获取手机验证码
 getCode(phone){
 return _http.request({
  type: 'post',
  url: '/account/validate-codes',
  data: {
  phone:phone
  }
 })
 }

http.js: 封装wx.request 为Promise

class HTTP {
 request(param){
 let _this = this;
 let baseUrl = '.......';
 return new Promise((resolve, reject) => {
  let access_token = wx.getStorageSync('access_token');
  wx.request({
  method: param.type || 'get',
  url: baseUrl+ param.url || '',
  data: param.data || null,
  header: access_token ? {
   'content-type': 'application/x-www-form-urlencoded',
   "Authorization": `Bearer ${access_token}`
  } : {
   'content-type': 'application/x-www-form-urlencoded',
  },
  success: (res => {
   if (res.statusCode === 200 || res.statusCode === 201) {
   //200: 服务端业务处理正常结束
   resolve(res.data)
   } else {
   //其它错误,提示用户错误信息
    
   /*** 
    * 需要根据接口文档改!!!
   */
   reject(res)
   }
  }),
  fail: (err => {
   if(err.responseJSON){
   reject(err.responseJSON.message)
   }else{
   reject(err);
   }
  })
  });
 });
 }
}

export default HTTP;

util.js

// 验证手机号码是否有效
 isPhoneAvailable(phone) {
 var myreg = /^[1][3,4,5,7,8][0-9]{9}$/;
 if (!myreg.test(phone)) {
  return false;
 } else {
  return true;
 }
 }
 
//小程序弹框提示
 showToast(icon,msg,duration=2000){
 wx.showToast({
  title: msg,
  duration: duration,
  icon: icon
 })
 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
在JS数组特定索引处指定位置插入元素
Jul 27 Javascript
jQuery实现下拉框选择图片功能实例
Aug 08 Javascript
浅谈javascript的call()、apply()、bind()的用法
Feb 21 Javascript
浅谈JQuery+ajax+jsonp 跨域访问
Jun 25 Javascript
JavaScript实战之菜单特效
Aug 16 Javascript
Bootstrap CSS组件之导航(nav)
Dec 17 Javascript
详解Vue内部怎样处理props选项的多种写法
Nov 06 Javascript
JavaScript实现简单音乐播放器
Apr 17 Javascript
javascript系统时间设置操作示例
Jun 17 Javascript
更强大的vue ssr实现预取数据的方式
Jul 19 Javascript
这样回答继承可能面试官更满意
Dec 10 Javascript
jquery实现点击弹出对话框
Feb 08 jQuery
使用puppeteer爬取网站并抓出404无效链接
Dec 20 #Javascript
详解如何使用node.js的开发框架express创建一个web应用
Dec 20 #Javascript
js canvas实现橡皮擦效果
Dec 20 #Javascript
浅谈VueJS SSR 后端绘制内存泄漏的相关解决经验
Dec 20 #Javascript
Cocos2d实现刮刮卡效果
Dec 20 #Javascript
浅谈Fetch 数据交互方式
Dec 20 #Javascript
cocos2dx+lua实现橡皮擦功能
Dec 20 #Javascript
You might like
php实现的CSS更新类实例
2014/09/22 PHP
Yii框架中memcache用法实例
2014/12/03 PHP
js 与或运算符 || &amp;&amp; 妙用
2009/12/09 Javascript
js中的值类型和引用类型小结 文字说明与实例
2010/12/12 Javascript
javascript中onmouse事件在div中失效问题的解决方法
2012/01/09 Javascript
js获取键盘按键响应事件(兼容各浏览器)
2013/05/16 Javascript
javascript拖拽上传类库DropzoneJS使用方法
2013/12/05 Javascript
jQuery中html()方法用法实例
2014/12/25 Javascript
DOM节点删除函数removeChild()用法实例
2015/01/12 Javascript
JavaScript 模块的循环加载实现方法
2015/12/13 Javascript
通过正则表达式获取url中参数的简单实现
2016/06/07 Javascript
Backbone View 之间通信的三种方式
2016/08/09 Javascript
Zabbix添加Node.js监控的方法
2016/10/20 Javascript
EasyUI 中combotree 默认不能选择父节点的实现方法
2016/11/07 Javascript
原生js实现可爱糖果数字时间特效
2016/12/30 Javascript
微信小程序图片宽100%显示并且不变形
2017/06/21 Javascript
js继承的这6种方式!(上)
2019/04/23 Javascript
关于微信小程序map组件z-index的层级问题分析
2019/07/09 Javascript
Python的Socket编程过程中实现UDP端口复用的实例分享
2016/03/19 Python
快速排序的算法思想及Python版快速排序的实现示例
2016/07/02 Python
详解python实现线程安全的单例模式
2018/03/05 Python
Ubuntu下升级 python3.7.1流程备忘(推荐)
2018/12/10 Python
Python字典遍历操作实例小结
2019/03/05 Python
Python使用指定端口进行http请求的例子
2019/07/25 Python
python3中sorted函数里cmp参数改变详解
2020/03/12 Python
python 删除excel表格重复行,数据预处理操作
2020/07/06 Python
详解python metaclass(元类)
2020/08/13 Python
python 线程的五个状态
2020/09/22 Python
Django配置跨域并开发测试接口
2020/11/04 Python
Redbubble法国:由独立艺术家设计的独特产品
2019/01/08 全球购物
论文评语大全
2014/04/29 职场文书
环境日宣传活动总结
2014/07/09 职场文书
小学生学习保证书
2015/02/26 职场文书
工厂仓管员岗位职责
2015/04/01 职场文书
六年级作文之关于梦
2019/10/22 职场文书
golang中的并发和并行
2021/05/08 Golang