React倒计时功能实现代码——解耦通用
需求分析
需求
在某个页面中需要有一个倒计时的功能,倒计时5s,5s钟后跳转到新的界面
分析
- 首先是实现倒计时功能
- 其次是实现在每倒计时1s后页面上要执行倒计时秒数变化的功能
- 最后是实现倒计时完成后跳转到指定页面的功能
初版做法
代码
letwaitTime=5 classDemoPageextendsReact.Component{ constructor(props){ super(props); this.state={ time:'', }; } componentDidMount=()=>{ this.countDown(); }; countDown=()=>{ if(waitTime>0){ waitTime--; this.setState({ time:waitTime }) }else{ history.push('/Login') return; } setTimeout(()=>{ this.countDown(); },1000); } render(){ todoInfo=this.state.time+'秒后跳转至登录界面'; return(todoInfo); } } exportdefaultDemoPage;
问题分析
时间设置为全局变量,糟糕的做法,
- 修改不方便
- 难于阅读和理解
- 全局变量的值极不安全,可能被任何程序修改
改进版
代码
classDemoPageextendsReact.Component{ constructor(props){ super(props); this.state={ time:'', }; } componentDidMount=()=>{ this.countDown(5);//倒计时时间可随意调整,且可读性强 }; countDown=(waitTime)=>{ if(waitTime>0){ waitTime--; this.setState({ time:waitTime }) }else{ history.push('/Login') return; } setTimeout(()=>{ this.countDown(waitTime); },1000); } render(){ todoInfo=this.state.time+'秒后跳转至登录界面'; return(todoInfo); } } exportdefaultDemoPage;
改进后将时间作为参数放到countDown里面,方便随意设置倒计时时间
进一步分析问题:
上面的做法,
- setState的操作只能写在本组件,与本组件紧耦合在一起,无法实现多组件复用
- history.push('/Login')只能用在umi框架中,与框架紧耦合在一起,无法实现普适应用
进一步改进
针对本问题的需求,可以将业务场景扩大为:
- 倒计时功能
- 倒计时过程中需要做某事doSomethingDuringCountDown()
- 倒计时结束后需要做某事doSomethingAfterCountDown()
这样的话,倒计时的功能就可以使用的更加的灵活了。
方案
将函数作为参数传递到countDown()方法中
将doSomethingDuringCountDown()和doSomethingAfterCountDown()作为参数传递到countDown方法中,
具体的方法实现,根据自己页面的需求来实现。
代码
//utils.js exportcountDown=(waitTime,doSomethingDuringCountDown,doSomethingAfterCountDown){ if(waitTime>0){ waitTime--; if(doSomethingDuringCountDown){ doSomethingDuringCountDown() } }else{ if(doSomethingAfterCountDown){ doSomethingAfterCountDown() } return; } setTimeout(()=>{ countDown(waitTime,doSomethingDuringCountDown,doSomethingAfterCountDown); },1000); }
实例
//DemoPage.jsx import{countDown}from'utils.js' classDemoPageextendsReact.Component{ constructor(props){ super(props); this.state={ time:'', }; } componentDidMount=()=>{ countDown(5,this.waitTimeStateChange,this.linkTo); } waitTimeStateChange=(time)=>{ this.setState({ time:time, }) } linkTo=()=>{ history.push(ToBeReviewedShowData.linkUrl) } render(){ todoInfo=this.state.time+'秒后跳转至登录界面' return(todoInfo) } } exportdefaultDemoPage
总结
到此这篇关于React倒计时功能实现——解耦通用的文章就介绍到这了,更多相关React倒计时内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。