| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- Component({
- properties: {
- isShow: {
- type: Boolean,
- value: false
- },
- type: {
- type: String,
- value: 'code' // 'code' 验证码 / '结算' 结算密码
- },
- // 新增:外部可配置倒计时总时长(默认60秒)
- countdownTotal: {
- type: Number,
- value: 60
- }
- },
- data: {
- codes: [], // 输入框显示的数组
- currentIndex: 0, // 当前激活索引
- isFocus: false, // 输入框聚焦状态
- codeValue: '', // 4位验证码真实值
- oncodeValue: '', // 6位结算密码真实值
- isShakeError: false, // 晃动动画开关
- // 新增:倒计时相关数据
- countdown: 0, // 当前剩余倒计时秒数
- timer: null // 倒计时定时器(用于清除定时器,防止内存泄漏)
- },
- // 新增:组件卸载时清除定时器,防止内存泄漏
- detached() {
- clearInterval(this.data.timer);
- },
- methods: {
- // 关闭弹窗
- onClose() {
- this.triggerEvent('close');
- this.resetInput(); // 关闭时重置输入
- this.resetCountdown(); // 关闭时重置倒计时
- },
-
- // 聚焦输入框
- focusInput() {
- this.setData({ isFocus: true });
- },
-
- // 输入内容处理
- onCodeInput(e) {
- console.log(e);
- const value = e.detail.value;
- const len = this.data.type === '结算' ? 6 : 4;
- const codes = value.split('').slice(0, len);
-
- this.setData({
- codes: codes,
- currentIndex: codes.length,
- codeValue: this.data.type !== '结算' ? value : this.data.codeValue,
- oncodeValue: this.data.type === '结算' ? value : this.data.oncodeValue
- });
-
- // 输入完成:仅传递值给父组件,不做检验
- if (codes.length === len) {
- const finalValue = this.data.type === '结算' ? this.data.oncodeValue : this.data.codeValue;
- // 向父组件发送输入完成的事件,携带输入值
- this.triggerEvent('inputComplete', { value: finalValue });
- this.setData({ isFocus: false });
- }
- },
-
- // 输入框失焦
- onInputBlur() {
- this.setData({ isFocus: false });
- },
-
- // 重新发送验证码(仅传递事件给父组件,并启动倒计时)
- onResend() {
- // 启动倒计时(防止重复点击重复启动定时器)
- this.startCountdown();
- // 向父组件发送重新发送事件
- this.triggerEvent('resend');
- },
-
- // 重置输入内容(供父组件/自身调用)
- resetInput() {
- this.setData({
- codes: [],
- currentIndex: 0,
- codeValue: '',
- oncodeValue: ''
- });
- },
-
- // 触发失败动效(供父组件调用)
- triggerErrorShake() {
- this.setData({ isShakeError: true });
- // 动画结束后重置状态
- setTimeout(() => {
- this.setData({ isShakeError: false });
- }, 500);
- // 同时清空输入
- this.resetInput();
- },
-
- // 新增:启动倒计时
- startCountdown() {
- // 1. 先清除已有定时器,防止重复创建
- clearInterval(this.data.timer);
- // 2. 初始化倒计时为总时长
- const total = this.data.countdownTotal;
- this.setData({
- countdown: total
- });
- // 3. 创建定时器,每秒更新倒计时
- const timer = setInterval(() => {
- this.setData({
- countdown: this.data.countdown - 1
- }, () => {
- // 4. 倒计时结束后清除定时器,重置倒计时状态
- if (this.data.countdown <= 0) {
- clearInterval(this.data.timer);
- this.resetCountdown();
- }
- });
- }, 1000);
- // 5. 保存定时器实例,用于后续清除
- this.setData({ timer });
- },
-
- // 新增:重置倒计时(恢复初始状态)
- resetCountdown() {
- clearInterval(this.data.timer);
- this.setData({
- countdown: 0,
- timer: null
- });
- }
- }
- });
|