支付宝小程序 UI·获取手机验证码

2020-09-07 17:37 更新

扫码体验

获取手机验证码二维码.png

前提条件

使用获取手机验证码的前提条件如下:

获取模板代码

下载 获取手机验证码 Demo.zip 文件,并解压至本地。

页面使用

page.axml

  1. <mobile-code
  2. onSendCode="onSendCode"
  3. onCodeInput="onCodeInput"/>

组件传参说明

字段名 简介 类型 默认值
mobile 手机号 String -
verifyCodeLength 验证码长度 Number 6
numberCode 验证码是否只能输入数字 Boolen true
codeTime 验证码倒计时 Number 60
onSendCode 点击发送|重新发送验证码时触发onSendCode(Object)Object: { mobile } EventHandle -
disabled 手机号是否可以编辑 Boolen false
onCodeInput 验证码输入时事件onCodeInput(e) EventHandle -
className 自定义组件最外级class String -

示例代码

index.axml

  1. <view class="atd-verify-wrapper {{className}}">
  2. <view class="atd-title-wrapper">
  3. <text>{{txt}}发送验证码到以下手机
  4. </text>
  5. </view>
  6. <view class="atd-tel-wrapper">
  7. <label for="mobile" class="atd-input-con">
  8. <view class="atd-title-field">手机号
  9. </view>
  10. <el-input name="mobile" placeholder="请输入正确的手机号" type="number" maxlength="{{11}}" disabled="{{mobileDisabled}}" onInput="onMobileInput" clear="{{true}}" value="{{hasSend ? mobileSafe : mobileValue}}" onClear="onMobileClear" />
  11. </label>
  12. <view class="send-code-wrapper">
  13. <label for="verifyCode" class="atd-input-con">
  14. <view class="atd-title-field">验证码
  15. </view>
  16. <el-input name="verifyCode" maxlength="{{verifyCodeLength}}" placeholder="请输入验证码" type="{{numberCode ? 'number': 'text'}}" onInput="onCodeInput" value="{{verifyCode}}" />
  17. </label>
  18. <popover position="{{position}}" show="{{popoverShow}}" showMask="{{false}}">
  19. <view onTap="onSendCode" class="msg {{canSend ? 'active':''}}">{{btnName}}
  20. </view>
  21. <view slot="items">
  22. <popover-item className="popover">
  23. <text>请输入正确的手机号
  24. </text>
  25. </popover-item>
  26. </view>
  27. </popover>
  28. </view>
  29. </view>
  30. </view>

index.acss

  1. .atd-verify-wrapper {
  2. width: 100%;
  3. padding: 32rpx 0;
  4. }
  5. .atd-verify-wrapper .atd-title-wrapper {
  6. padding-top: 32rpx;
  7. padding-bottom: 16rpx;
  8. padding-left: 32rpx;
  9. font-size: 24rpx;
  10. color: #999;
  11. }
  12. .atd-verify-wrapper .atd-tel-wrapper {
  13. background-color: #fff;
  14. padding-left: 32rpx;
  15. }
  16. .atd-verify-wrapper .atd-tel-wrapper .atd-input-con .atd-input-box {
  17. padding-left: 8rpx;
  18. display: flex;
  19. justify-content: center;
  20. align-items: center;
  21. }
  22. .atd-tel-wrapper .atd-input-con {
  23. border-bottom: 1rpx solid #f5f5f5;
  24. }
  25. .atd-verify-wrapper .atd-tel-wrapper .atd-input-con .atd-title-field {
  26. color: rgb(51, 51, 51);
  27. }
  28. .atd-verify-wrapper .am-input-item {
  29. flex: 1;
  30. box-sizing: border-box;
  31. }
  32. .atd-verify-wrapper .send-code-wrapper {
  33. display: flex;
  34. align-items: center;
  35. border-bottom: 1rpx solid #f5f5f5;
  36. }
  37. .atd-verify-wrapper .send-code-wrapper .atd-input-con {
  38. display: flex;
  39. flex-direction: row;
  40. align-items: center;
  41. border-bottom: none;
  42. }
  43. .atd-verify-wrapper .send-code-wrapper .atd-input-box {
  44. padding-left: 8rpx;
  45. }
  46. .atd-verify-wrapper .send-code-wrapper .msg {
  47. height: 48rpx;
  48. line-height: 48rpx;
  49. padding-left: 32rpx;
  50. padding-right: 32rpx;
  51. text-align: center;
  52. font-size: 34rpx;
  53. color: #999;
  54. border-left: 1rpx solid #ddd;
  55. }
  56. .atd-verify-wrapper .send-code-wrapper .msg.active {
  57. color: #108EE9;
  58. }
  59. .atd-verify-wrapper .atd-input-con .atd-title-field {
  60. align-self: center;
  61. color: rgb(51, 51, 51);
  62. }
  63. .atd-input-con {
  64. flex: 1;
  65. height: 100%;
  66. display: flex;
  67. font-size: 34rpx;
  68. }
  69. .atd-verify-wrapper .popover {
  70. width: 300rpx;
  71. }
  72. .atd-input-box {
  73. flex: 1;
  74. box-sizing: border-box;
  75. }
  76. .atd-verify-wrapper .am-input-item {
  77. background: none !important
  78. }
  79. .atd-verify-wrapper .am-input-line {
  80. position: static !important
  81. }
  82. .atd-verify-wrapper input {
  83. padding: 0px !important
  84. }

index.js

  1. Component({
  2. props: { // 组件传参默认值
  3. className: '', // 父级加入className
  4. verifyCodeLength: 6, // 验证码长度
  5. mobile: '', // 父传的手机号
  6. numberCode: true, // 是否是是数字键盘
  7. codeTime: 60, // 倒计时时间
  8. disabled: false, // 手机号是否可以编辑
  9. onSendCode: () => { }, // 点击发送验证码
  10. onCodeInput: () => { } // 输入验证码事件
  11. },
  12. data: {
  13. version: '1.0.0', // 组件版本信息
  14. btnName: '发送验证码', // 按钮显示名称
  15. canSend: false, // 是否可以发送验证吗
  16. hasSend: false, // 是否已经发送
  17. popoverShow: false, // 弹窗
  18. mobileValue: '', // 组件手机号的值
  19. mobileSafe: '', // 脱敏后的值
  20. txt: '', // 文本赋值
  21. mobileDisabled: false, // 手机号是否禁止输入
  22. position: 'bottomRight' // 弹窗位置
  23. },
  24. didMount() {
  25. const {
  26. mobile,
  27. disabled
  28. } = this.props;
  29. let flag = mobile && this.verifyTel(mobile);
  30. this.setData({
  31. mobileValue: mobile,
  32. mobileDisabled: disabled,
  33. canSend: flag
  34. });
  35. console.log('载入mobileCode组件:' + this.data.version);
  36. },
  37. didUpdate(prevProps) {
  38. const {
  39. mobile,
  40. disabled
  41. } = prevProps;
  42. const {
  43. mobileValue
  44. } = this.data;
  45. if (mobile !== this.props.mobile && this.props.mobile !== mobileValue) {
  46. let flag = this.props.mobile && this.verifyTel(this.props.mobile);
  47. this.setData({
  48. mobileValue: this.props.mobile,
  49. canSend: flag
  50. });
  51. }
  52. if (disabled !== this.props.disabled) {
  53. this.setData({
  54. mobileDisabled: this.props.disabled
  55. });
  56. }
  57. },
  58. methods: {
  59. /**
  60. * 点击清除手机号
  61. * @method onMobileClear
  62. */
  63. onMobileClear() {
  64. this.setData({
  65. mobileValue: '',
  66. mobileSafe: '',
  67. canSend: false,
  68. hasSend: false,
  69. btnName: '发送验证码'
  70. });
  71. },
  72. /**
  73. * 点击获取验证码触发
  74. * @method onSendCode
  75. */
  76. onSendCode() {
  77. if (this.data.canSend) {
  78. const {
  79. mobileValue
  80. } = this.data;
  81. this.settimer();
  82. const pat = /(\d{3})\d*(\d{4})/;
  83. let str = mobileValue.replace(pat, '$1***$2');
  84. this.props.onSendCode({
  85. mobile: mobileValue
  86. });
  87. this.setData({
  88. mobileSafe: str,
  89. hasSend: true,
  90. txt: '已',
  91. mobileDisabled: true,
  92. canSend: false
  93. });
  94. } else {
  95. const {
  96. popoverShow,
  97. hasSend
  98. } = this.data;
  99. if (!hasSend && !popoverShow) {
  100. this.showPopover();
  101. }
  102. }
  103. },
  104. /**
  105. * 输入验证码触发事件并传给父
  106. * @method onCodeInput
  107. * @param {*} e
  108. */
  109. onCodeInput(e) {
  110. this.props.onCodeInput && this.props.onCodeInput(e);
  111. },
  112. /**
  113. * 正则校验 获取值 改变
  114. * @method onMobileInput
  115. * @param {*} e
  116. */
  117. onMobileInput(e) {
  118. const {
  119. value
  120. } = e.detail;
  121. const result = this.verifyTel(value);
  122. if (result) { // 11位数字
  123. this.setData({
  124. mobileValue: value,
  125. canSend: true,
  126. btnName: '发送验证码'
  127. });
  128. } else {
  129. this.setData({
  130. canSend: false,
  131. btnName: '发送验证码'
  132. });
  133. }
  134. },
  135. /**
  136. * 弹窗去抖(3秒后弹窗强制消失)
  137. * @method showPopover
  138. */
  139. showPopover() {
  140. this.setData({
  141. popoverShow: true
  142. }, () => {
  143. setTimeout(() => {
  144. this.setData({
  145. popoverShow: false
  146. });
  147. }, 3000);
  148. });
  149. },
  150. /**
  151. * 倒计时定时器
  152. * @method settimer
  153. */
  154. settimer() {
  155. let timer;
  156. let codeTime = this.props.codeTime;
  157. const {
  158. disabled
  159. } = this.props;
  160. clearInterval(timer);
  161. timer = setInterval(() => {
  162. codeTime--;
  163. this.setData({
  164. btnName: `倒计时${codeTime}秒`
  165. });
  166. if (codeTime === 0) {
  167. clearInterval(timer);
  168. const box = this.data.othervalue;
  169. this.setData({
  170. btnName: '重新发送',
  171. mobileDisabled: disabled ? true : false,
  172. canSend: true,
  173. txt: ''
  174. });
  175. }
  176. }, 1000);
  177. },
  178. /**
  179. * 检验手机号是否正确
  180. * @method verifyTel
  181. * @param {*} number // 手机号
  182. */
  183. verifyTel(number) { // 手机号正则校验
  184. const reg = /^1[3|4|5|7|8|9]\d{9}$/;
  185. return reg.test(number);
  186. }
  187. }
  188. });```
  189. > index.json
  190. ```javascript
  191. {
  192. "component": true,
  193. "usingComponents": {
  194. "popover": "mini-ali-ui/es/popover/index",
  195. "popover-item": "mini-ali-ui/es/popover/popover-item/index",
  196. "el-input": "mini-ali-ui/es/input-item/index"
  197. }
  198. }
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号