react发送验证码案例

1,在登录页面中通常会有手机号验证码登录的情况,今天在写这个效果时遇到了定时器无法更新状态的问题。

以下为完整代码

import React, { useState } from 'react';

const Index = () => {
    const [VCodeTime, setVCodeTime] = useState(3);
    const [sendSwitch, setSendSwitch] = useState(true);


    const sendCode =  () => {
        if(sendSwitch){
            setSendSwitch(false);
            const timer = setInterval(() => {
                setVCodeTime(VCodeTime - 1);
                if (VCodeTime === 0) {
                    clearInterval(timer);
                    setVCodeTime(3);
                    setSendSwitch(true);
                }
            }, 1000);
        }
        return

    };
    return (
        <div style={{ display: 'flex' }}>
            <input />
            <div
                style={sendSwitch ? { color: 'blue' } : { color: '#9999', cursor: 'not-allowed', left: '250px' }}
                onClick={sendCode}
            >
                发送验证码 {sendSwitch ? '' : `${VCodeTime}`}
            </div>
        </div>
    );
};

export default Index;

在这个点击后的sendCode函数中,控制发送验证码按钮被点击之后为禁止再次点击,会进入倒计时状态等待计时结束再将按钮状态改为可以点击,

但是在这个这个定时器中    setVCodeTime(VCodeTime - 1); 这段代码只会被执行一次,在定时器中log也是最初始的数据,没有按想法逐次递减,其中的原因不是特别理解我只能写出解决方案。

2,解决方案

以下为完整代码

import React, { useState } from 'react';

const Index = () => {
    const [VCodeTime, setVCodeTime] = useState(3);
    const [sendSwitch, setSendSwitch] = useState(true);


    const sendCode =  () => {
      if (sendSwitch) {
    setSendSwitch(!sendSwitch);
    let time = 3
    let timer =setInterval(() => {
        time--;
        setVCodeTime(time);
        if (time === 0) {
            clearInterval(timer);
            setVCodeTime(3);
            setSendSwitch(true);
        }
    }, 1000);
}
        return

    };
    return (
        <div style={{ display: 'flex' }}>
            <input />
            <div
                style={sendSwitch ? { color: 'blue' } : { color: '#9999', cursor: 'not-allowed', left: '250px' }}
                onClick={sendCode}
            >
                发送验证码 {sendSwitch ? '' : `${VCodeTime}`}
            </div>
        </div>
    );
};

export default Index;

就是在这个sendCode函数中生命一个变量,然后在定时器中通过 -- 进行累减在set就可以达到效果了

3,效果图

 

 

如果你使用的是 React,可以通过以下步骤来实现点击发送验证码获取表单验证: 1. 创建一个表单,其中包含一个输入框和一个按钮,用于发送验证码。 2. 在组件的 state 中添加一个变量,用于存储发送验证码的状态,例如 isSending。 3. 在发送验证码的按钮上添加一个 onClick 事件处理程序,该处理程序在按钮被点击时触发。 4. 在事件处理程序中,首先检查输入框中的值是否合法。如果值有效,则将 isSending 设置为 true,表示正在发送验证码。 5. 发送 AJAX 请求到服务器,请求发送验证码。如果请求成功,则将 isSending 设置为 false,并将表单的状态更新为“验证码发送”。 6. 如果请求失败,则将 isSending 设置为 false,并将表单的状态更新为“发送验证码失败”。 以下是一个示例代码,你可以参考一下: ``` import React, { useState } from 'react'; function MyForm() { const [isSending, setIsSending] = useState(false); const [status, setStatus] = useState(''); const [phone, setPhone] = useState(''); const handleSendCode = () => { // 验证手机号格式是否正确 if (!/^1[3456789]\d{9}$/.test(phone)) { setStatus('请输入正确的手机号'); return; } // 发送验证码 setIsSending(true); setStatus('正在发送验证码...'); fetch('/api/send_code', { method: 'POST', body: JSON.stringify({ phone }), headers: { 'Content-Type': 'application/json' } }).then(res => res.json()).then(data => { setIsSending(false); setStatus(data.message); }).catch(err => { setIsSending(false); setStatus('发送验证码失败'); }); }; return ( <form> <label> 手机号: <input type="text" value={phone} onChange={e => setPhone(e.target.value)} /> </label> <button type="button" onClick={handleSendCode} disabled={isSending}> {isSending ? '正在发送...' : '发送验证码'} </button> <div>{status}</div> </form> ); } ``` 在这个示例中,我们使用了 useState 来定义了三个状态变量:isSending 表示是否正在发送验证码,status 表示表单的状态信息,phone 表示输入框中的手机号码。在点击发送验证码按钮时,我们执行了 handleSendCode 函数,该函数首先验证了手机号码格式是否正确,如果正确则发送 AJAX 请求到服务器,并在请求成功或失败时更新表单的状态信息。最后,我们使用 disabled 属性来禁用按钮,以避免用户在发送验证码过程中重复点击。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值