| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- Component({
- properties: {
- // 是否显示弹窗
- isShow: {
- type: Boolean,
- value: false
- },
- // 手机号(用于显示)
- phoneNumber: {
- type: String,
- value: ''
- },
- // 倒计时秒数
- countdownSeconds: {
- type: Number,
- value: 60
- }
- },
-
- data: {
- // 验证码数组(6位)
- codes: ['', '', '', '', '', ''],
- // 实际输入的验证码值
- codeValue: '',
- // 当前激活的输入框索引
- currentIndex: 0,
- // 是否聚焦
- isFocus: false,
- // 倒计时
- countdown: 60,
- // 是否可以重新发送
- canResend: false,
- // 验证码是否输入完成
- isComplete: false,
- // 倒计时计时器
- timer: null
- },
-
- observers: {
- // 监听isShow变化,控制弹窗显示隐藏
- isShow: function (isShow) {
- if (isShow) {
- this.startCountdown();
- this.focusInput();
- } else {
- this.clearCountdown();
- this.resetCodeInput();
- }
- },
-
- // 监听countdownSeconds变化
- countdownSeconds: function (seconds) {
- this.setData({
- countdown: seconds
- });
- },
-
- // 监听验证码变化,更新输入状态
- codeValue: function (value) {
- const codes = [];
- for (let i = 0; i < 6; i++) {
- codes[i] = value[i] || '';
- }
-
- // 更新当前激活的输入框索引
- let currentIndex = value.length < 6 ? value.length : 5;
-
- // 判断是否输入完成
- const isComplete = value.length === 6;
-
- this.setData({
- codes,
- currentIndex,
- isComplete
- });
-
- // 如果输入完成,自动触发确认事件
- if (isComplete) {
- this.triggerEvent('complete', { code: value });
- }
- }
- },
-
- methods: {
- // 聚焦输入框
- focusInput() {
- this.setData({
- isFocus: true
- });
- },
-
- // 输入框失焦
- onInputBlur() {
- this.setData({
- isFocus: false
- });
- },
-
- // 验证码输入
- onCodeInput(e) {
- const value = e.detail.value.replace(/\D/g, ''); // 只保留数字
- this.setData({
- codeValue: value
- });
- },
-
- // 关闭弹窗
- onClose() {
- this.triggerEvent('close');
- },
-
- // 确认
- onConfirm() {
- if (this.data.isComplete) {
- this.triggerEvent('confirm', { code: this.data.codeValue });
- }
- },
-
- // 重新发送验证码
- onResend() {
- this.triggerEvent('resend');
- this.startCountdown();
- },
-
- // 开始倒计时
- startCountdown() {
- // 清除之前的计时器
- this.clearCountdown();
-
- const countdownSeconds = this.data.countdownSeconds;
- this.setData({
- countdown: countdownSeconds,
- canResend: false
- });
-
- // 设置新的计时器
- const timer = setInterval(() => {
- let countdown = this.data.countdown - 1;
- if (countdown <= 0) {
- this.setData({
- countdown: 0,
- canResend: true
- });
- this.clearCountdown();
- } else {
- this.setData({
- countdown
- });
- }
- }, 1000);
-
- this.setData({ timer });
- },
-
- // 清除倒计时
- clearCountdown() {
- if (this.data.timer) {
- clearInterval(this.data.timer);
- this.setData({ timer: null });
- }
- },
-
- // 重置验证码输入
- resetCodeInput() {
- this.setData({
- codes: ['', '', '', '', '', ''],
- codeValue: '',
- currentIndex: 0,
- isComplete: false
- });
- }
- },
-
- // 组件销毁时清除计时器
- detached() {
- this.clearCountdown();
- }
- });
|