用hooks 实现一个倒计时功能

目录

一个自定义hook的案例

【需求介绍】

【基础实现】:

app.jsx中

MessageBtn.jsx中

【改进】:

 app.jsx中

useCountDown.jsx中

MessageBtn.jsx中

useLatest.jsx中 源码


一个自定义hook的案例

实现一个倒计时 hooks

【需求介绍】

我们先简单的实现一个3秒倒计时的功能,就模仿我们常见的发短息验证码的功能。页面效果

【基础实现】:

        功能比较简单,按钮点击的时候创建了一个定时器,然后时间到了就清除这个定时器。

app.jsx

image-20230827172546343.png

MessageBtn.jsx

image-20230827172851670.png

【改进】:

现在把 MessageBtn 中倒计时的逻辑写到一个自定义的hooks里面。

自定义的useCountdown函数

把上面的一些逻辑抽取一下,useCountdown主要接受一个倒计时的时长,返回当前时间的状态,以及一个开始倒计时的函数

 app.jsx

image-20230827172546343.png

useCountDown.jsx

        1.  期望useCountdown支持两个函数,一个是在倒计时的时候调用,一个是在倒计时结束的时候调用。 【如图1】

        2.  start函数用了useCallback,因为我们不能保证用户的使用场景会不会出问题,所以我们包一下。 自定义hooks提供给别人的方法,最好用useCallback包裹一下,防止别人将该函数作为依赖项时出问题。【如图1】

        3.  这里count定义 0 有点歧义,0 不能准确的知道是一开始的 0 还是倒计时结束的 0,所以还需要加一个标志位来表示当前是结束的 0。使用 useEffect监听count的变化,变化的时候触发对应的方法:let countDowning = useRef(false) 。【如图1】

image-20230827192510462.png

【图1  】           

        

        4. 【提出问题】 那么,现在就有一个很严重的问题,onEndcountdownCallBack这两个函数是外部传入的,我们要不要把他放到我们自定义hookuseEffect依赖项里面呢

我们不能保证外部传入的变量一定是一个被useCallback包裹的函数,那么肯定就不能放到useEffect依赖项里面。

如何解决这个问题呢?

答案就是使用useRef。使用别人提供的hooks返回的方法,如果需要将其作为依赖项,在不了解其方法是否用useCallback缓存的情况下,可以用useRef来接收后使用。

【意图】:对于hooks所提供的方法“做最好的准备,做最坏的打算”。

【如图2(最终的写法)

image-20230827194144821.png

【图2】

   自定义hooks,参数是一个函数,我们不能保证外部传入的变量一定是一个被useCallback包裹的函数,那么肯定就不能放到useEffect依赖项里面,所以需要useref包装一下。     

MessageBtn.jsx

预期的使用是这样的,通过一个配置对象传入 countdownCallBack函数和onEnd

useLatest.jsx中 源码

【提问】:用useLastest和直接使用函数但是不把函数放进useEffect依赖中有什么区别?

【解答】:useEffect不写依赖 会产生闭包,拿到的函数是老的函数,useLastest可以拿到新的

image-20230827193638585.png

比如ahooks里面的useLatestuseMemoizedFn的实现

在这里肯定也是看了很多介绍 useCallback的文章了,推荐一下下面的文章

how-to-use-memo-use-callback,这个是全英文的,掘金有翻译这篇文章的,「好文翻译」

作者:既见君子
链接:https://juejin.cn/post/7271643757640007680
来源:稀土掘金

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值