请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

当input type='password'时,定时器无法停止

老师,下面的代码,为什么当input type='password’时。页面启动的定时器,在页面跳转时,无法在控制台中停止。必须要input type=‘text’ 才可以。怎么做,才能让定时器停止。

import { useRouter } from ‘next/router’;
import React, { useState,useEffect } from ‘react’

function timer(){

const router = useRouter();

const [captchaButtonDisabled,setCaptchaButtonDisabled] = useState(false)

const [captchaText,setCaptchaText] = useState('获取验证码')  

const [timeCount,setTimeCount] = useState(20)  



let defaultCaptcha = captchaText

let left = '还剩';
let seconds = '秒';

let timer = null;


useEffect(() => {

    console.log('mount')
    
    return () => {
      // location.reload()
      
       setTimeCount(0)
   
       clearInterval(timer)
       console.log('unmount')
    }
}, [])


let iCount = timeCount;

let startTimer = () => setInterval(() => {
   
    if ( timeCount>0 && iCount > 0 ) {
      
      let text = left + ' ' + iCount + ' ' + seconds;
 
      setCaptchaText(text)
      iCount --;
      console.log(iCount)
     
      
    } else {
      
      clearInterval(timer); // 清除定时器
      setCaptchaText(defaultCaptcha)
      setCaptchaButtonDisabled(false)
      
    }
  }, 1000);


//获取验证码
function getCaptcha(event) {

   if (captchaButtonDisabled){
     return;
   } 
    

    setCaptchaButtonDisabled(true)
 
     //验证码倒计时

    if (!timer) {
     
       timer = startTimer()
    }
   else {
     setCaptchaButtonDisabled(false)
   }


}

async function pagePush(){

router.push('/')

}

return (

       <input name="email"   type="text"/>
       <input name="password"   type="password" />
        
       <button type="button" disabled={captchaButtonDisabled} onClick={()=>getCaptcha()}>{captchaText}</button>
       <button type="button" onClick={pagePush}>点击页面跳转,测试查看控制台 验证码定时器 是否在unmount中被清除</button>

   </div>

)

}

export default timer;

正在回答 回答被采纳积分+3

1回答

Jokcy 2021-10-07 21:29:37

无法在控制台中停止?是什么概念,你具体的操作是什么?

0 回复 有任何疑惑可以回复我~
  • 提问者 蓝色西西 #1
    老师,在unmount事件中,已经写了 clearInterval 啊。为什么只有input type="text"才能销毁timer. 而input type="password" 就无法销毁呢。同样的代码和逻辑。只要input type="password" 就不行了,这个问题怎么解决呢。
    useEffect(() => {
    
        console.log('mount')
        
        return () => {
          // location.reload()
          
           setTimeCount(0)
       
           clearInterval(timer)
           console.log('unmount')
        }
    }, [])
    回复 有任何疑惑可以回复我~ 2021-10-09 09:36:23
  • Jokcy 回复 提问者 蓝色西西 #2
    你可以在unmount的地方打个断点,看看有没有正常执行
    回复 有任何疑惑可以回复我~ 2021-10-13 22:00:17
  • Jokcy #3
    另外你这个写法有问题,你应该把timer放到`useEffect`的依赖中,不然你的timer更新useEffect不知道的
    回复 有任何疑惑可以回复我~ 2021-10-13 22:01:05
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信