返回列表

📱 验证码倒计时实战示例

使用 useEffect + 定时器实现常见的短信验证码倒计时功能,并展示清理函数的重要性


🎯 交互式演示
💻 核心代码实现
// ✅ 使用常量:确保倒计时固定从 60 秒开始
const COUNTDOWN_DURATION = 60; // 秒

const [countdown, setCountdown] = useState(0);

// ✅ 倒计时核心逻辑
useEffect(() => {
  if (countdown > 0) {
    const timer = setTimeout(() => {
      setCountdown(countdown - 1);
    }, 1000);

    // 🧹 清理函数:防止内存泄漏
    return () => clearTimeout(timer);
  }
}, [countdown]);

// 发送验证码
const handleSendCode = async () => {
  await api.post('/send-sms', { phone });

  // ✅ 使用常量而不是硬编码
  setCountdown(COUNTDOWN_DURATION);
};

// 按钮文本
const buttonText = countdown > 0
  ? `${countdown}秒后重试`
  : '发送验证码';
🔑 关键要点
  • 使用 setTimeout/setInterval 实现倒计时
  • 在清理函数中 clearTimeout/clearInterval 防止内存泄漏
  • 倒计时结束后重置按钮状态
  • 实际项目中需要调用真实的短信发送 API
  • 添加手机号格式验证和防刷机制
🌍 实际应用场景
  • 用户注册/登录时的短信验证
  • 找回密码的手机验证
  • 绑定/解绑手机号
  • 敏感操作的二次验证(如转账)
  • 邮箱验证码倒计时(同理)