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 相关文章推荐
Javascript 判断客户端浏览器类型代码
Mar 01 Javascript
jquery获取下拉列表的值为null的解决方法
Mar 18 Javascript
Flash图片上传组件 swfupload使用指南
Mar 14 Javascript
jquery动态切换背景图片的简单实现方法
May 14 Javascript
深入理解JavaScript中的浮点数
May 18 Javascript
EasyUI折叠表格层次显示detailview详解及实例
Dec 28 Javascript
AngularJS路由切换实现方法分析
Mar 17 Javascript
将angular-ui的分页组件封装成指令的方法详解
May 10 Javascript
Vue代码分割懒加载的实现方法
Nov 23 Javascript
vue中选项卡点击切换且能滑动切换功能的实现代码
Nov 25 Javascript
Flutter实现仿微信底部菜单栏功能
Sep 18 Javascript
JS高级程序设计之class继承重点详解
Jul 07 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颜色转换函数hex-rgb(将十六进制格式转成十进制格式)
2013/09/23 PHP
PHP获取数组中重复最多的元素的实现方法
2014/11/11 PHP
mongodb和php的用法详解
2019/03/25 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
2019/12/25 PHP
学习YUI.Ext 第二天
2007/03/10 Javascript
js定义对象或数组直接量时各浏览器对多余逗号的处理(json)
2011/03/05 Javascript
jquery延迟加载外部js实现代码
2013/01/11 Javascript
JAVASCRIPT函数作用域和提前声明 分享
2013/08/22 Javascript
javascript 弹出的窗口返回值给父窗口具体实现
2013/11/23 Javascript
jquery滚动到顶部底部代码
2015/04/20 Javascript
实例详解jQuery表单验证插件validate
2016/01/18 Javascript
javascript表单处理具体实现代码(表单、链接、按钮)
2016/05/07 Javascript
Javascript随机标签云代码实例
2016/06/21 Javascript
jquery ajax异步提交表单数据的方法
2017/10/27 jQuery
Vue实现点击后文字变色切换方法
2018/02/11 Javascript
关于JavaScript 数组你应该知道的事情(推荐)
2019/04/10 Javascript
微信小程序实现Swiper轮播图效果
2019/11/22 Javascript
[05:26]2014DOTA2西雅图国际邀请赛 iG战队巡礼
2014/07/07 DOTA
Python+Selenium+PIL+Tesseract自动识别验证码进行一键登录
2017/09/20 Python
python中列表的切片与修改知识点总结
2019/07/23 Python
Django restframework 框架认证、权限、限流用法示例
2019/12/21 Python
jupyter 中文乱码设置编码格式 避免控制台输出的解决
2020/04/20 Python
使用matplotlib的pyplot模块绘图的实现示例
2020/07/12 Python
Python特殊属性property原理及使用方法解析
2020/10/09 Python
python 实用工具状态机transitions
2020/11/21 Python
html5配合css3实现带提示文字的输入框(摆脱js)
2013/03/08 HTML / CSS
让ie浏览器成为支持html5的浏览器的解决方法(使用html5shiv)
2014/04/08 HTML / CSS
Artist Guitars新西兰:乐器在线商店
2017/09/17 全球购物
Keds加拿大官网:购买帆布运动鞋和皮鞋
2019/09/26 全球购物
科学发展观活动总结
2014/08/28 职场文书
学生会感恩节活动方案
2014/10/11 职场文书
2014年文艺部工作总结
2014/11/17 职场文书
2014年企业党支部工作总结
2014/12/04 职场文书
2015年党风廉政建设个人总结
2015/08/18 职场文书
从np.random.normal()到正态分布的拟合操作
2021/06/02 Python
CSS3实现指纹特效代码
2022/03/17 HTML / CSS