React倒计时功能实现代码——解耦通用


Posted in Javascript onSeptember 18, 2020

需求分析

需求

在某个页面中需要有一个倒计时的功能,倒计时 5 s,5s钟后跳转到新的界面

分析

  • 首先是实现倒计时功能
  • 其次是实现在每倒计时 1 s后页面上要执行 倒计时秒数变化的功能
  • 最后是实现倒计时完成后 跳转到指定页面的功能

初版做法

代码

let waitTime = 5
class DemoPage extends React.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 (
			<div>
				todoInfo
			</div>
		);
	}
}
export default DemoPage;

问题分析

时间设置为全局变量,糟糕的做法,

  • 修改不方便
  • 难于阅读和理解
  • 全局变量的值极不安全,可能被任何程序修改

改进版

代码

class DemoPage extends React.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 (
			<div>
				todoInfo
			</div>
		);
	}
}
export default DemoPage;

改进后将时间作为参数放到countDown里面,方便随意设置倒计时时间

进一步分析问题:

上面的做法,

  • setState的操作只能写在本组件,与本组件紧耦合在一起,无法实现多组件复用
  • history.push('/Login') 只能用在umi 框架中,与框架紧耦合在一起,无法实现普适应用

进一步改进

针对本问题的需求,可以将业务场景扩大为:

  • 倒计时功能
  • 倒计时过程中 需要做某事 doSomethingDuringCountDown()
  • 倒计时结束后 需要做某事 doSomethingAfterCountDown()

这样的话,倒计时的功能就可以使用的更加的灵活了。

方案

将函数作为参数传递到countDown()方法中

doSomethingDuringCountDown()doSomethingAfterCountDown()作为参数传递到countDown方法中,

具体的方法实现,根据自己页面的需求来实现。

代码

//utils.js

export countDown = (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'

class DemoPage extends React.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 (
			<div>
				todoInfo
			</div>
		)
	}
}
export default DemoPage

总结

到此这篇关于React倒计时功能实现——解耦通用的文章就介绍到这了,更多相关React倒计时内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
SWFObject 2.1以上版本语法介绍
Jul 10 Javascript
jQuery/CSS3图片特效插件整理推荐
Dec 07 Javascript
jQuery事件处理的特征(事件命名机制)
Aug 23 Javascript
TableSort.js表格排序插件使用方法详解
Feb 10 Javascript
Bootstrap组合上、下拉框简单实现代码
Mar 06 Javascript
轻松理解JavaScript之AJAX
Mar 15 Javascript
vue-router源码之history类的浅析
May 21 Javascript
微信小程序解析富文本过程详解
Jul 13 Javascript
小程序如何支持使用 async/await详解
Sep 12 Javascript
用Angular实现一个扫雷的游戏示例
May 15 Javascript
JavaScript onclick事件使用方法详解
May 15 Javascript
vue键盘事件点击事件加native操作
Jul 27 Javascript
浅谈鸿蒙 JavaScript GUI 技术栈
Sep 17 #Javascript
vue项目中播放rtmp视频文件流的方法
Sep 17 #Javascript
逐行分析鸿蒙系统的 JavaScript 框架(推荐)
Sep 17 #Javascript
vue项目实现多语言切换的思路
Sep 17 #Javascript
vue实现放大镜效果
Sep 17 #Javascript
JavaScript封装单向链表的示例代码
Sep 17 #Javascript
vue修改Element的el-table样式的4种方法
Sep 17 #Javascript
You might like
PHP文件上传实例详解!!!
2007/01/02 PHP
PHP函数学习之PHP函数点评
2012/07/05 PHP
php使用curl实现ftp文件下载功能
2017/05/16 PHP
php批量修改表结构实例
2017/05/24 PHP
基于PHP实现短信验证码发送次数限制
2020/07/11 PHP
服务器安全设置的几个注册表设置
2007/07/28 Javascript
jquery验证表单中的单选与多选实例
2013/08/18 Javascript
Jquery插件编写简明教程
2014/03/25 Javascript
webapp框架AngularUI的demo改造之路
2014/12/21 Javascript
jQuery实现折叠、展开的菜单组效果代码
2015/09/16 Javascript
关于javascript原型的修改与重写(覆盖)差别详解
2016/08/31 Javascript
js实现HashTable(哈希表)的实例分析
2016/11/21 Javascript
原生js编写基于面向对象的分页组件
2016/12/05 Javascript
Vue.js中用webpack合并打包多个组件并实现按需加载
2017/02/17 Javascript
浅谈Express异步进化史
2017/09/09 Javascript
Servlet3.0与纯javascript通过Ajax交互的实例详解
2018/03/18 Javascript
解决VUE-Router 同一页面第二次进入不刷新的问题
2020/07/22 Javascript
[06:24]DOTA2亚洲邀请赛小组赛第三日 TOP10精彩集锦
2015/02/01 DOTA
Python生成验证码实例
2014/08/21 Python
浅谈python中的变量默认是什么类型
2016/09/11 Python
Django接受前端数据的几种方法总结
2016/11/04 Python
Python中datetime模块参考手册
2017/01/13 Python
利用keras加载训练好的.H5文件,并实现预测图片
2020/01/24 Python
eBay比利时购物网站:eBay.be
2019/08/09 全球购物
神话般的珠宝:Ross-Simons
2020/07/13 全球购物
酒店前厅员工辞职信
2014/01/08 职场文书
物业工作计划书
2014/01/10 职场文书
课改先进个人汇报材料
2014/01/26 职场文书
国家励志奖学金个人先进事迹材料
2014/05/04 职场文书
经营理念标语
2014/06/21 职场文书
2014年学习全国道德模范事迹思想汇报
2014/09/15 职场文书
考试没考好检讨书(精选篇)
2014/11/16 职场文书
2014年度安全工作总结
2014/12/04 职场文书
2015自愿离婚协议书范本
2015/01/28 职场文书
邹越演讲观后感
2015/06/15 职场文书
zabbix 代理服务器的部署与 zabbix-snmp 监控问题
2022/07/15 Servers