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
探寻Javascript执行效率问题
Nov 12 Javascript
javascript表格隔行变色加鼠标移入移出及点击效果的方法
Apr 10 Javascript
JavaScript学习笔记之DOM基础 2.4
Aug 14 Javascript
详解JavaScript实现设计模式中的适配器模式的方法
May 18 Javascript
浅谈JS中的三种字符串连接方式及其性能比较
Sep 02 Javascript
Javascript中的 “&amp;” 和 “|” 详解
Feb 02 Javascript
JointJS流程图的绘制方法
Dec 03 Javascript
jQuery实现表格的增、删、改操作示例
Jan 27 jQuery
图文讲解vue的v-if使用方法
Feb 11 Javascript
vue中可编辑树状表格的实现代码
Oct 31 Javascript
Three.js实现雪糕地球的使用示例详解
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
Zend Framework教程之请求对象的封装Zend_Controller_Request实例详解
2016/03/07 PHP
CI框架简单邮件发送类实例
2016/05/18 PHP
Laravel 使用查询构造器配合原生sql语句查询的例子
2019/10/12 PHP
使用PHP开发留言板功能
2019/11/19 PHP
iframe 父窗口和子窗口相互的调用方法集锦
2010/12/15 Javascript
Jquery动态更改一张位图的src与Attr的使用
2013/07/31 Javascript
非常漂亮的JS+CSS图片幻灯切换特效
2013/11/20 Javascript
JavaScript分秒倒计时器实现方法
2015/02/02 Javascript
vuejs在解析时出现闪烁的原因及防止闪烁的方法
2016/09/19 Javascript
关于Javascript中defer和async的区别总结
2016/09/20 Javascript
jquery延迟对象解析
2016/10/26 Javascript
微信小程序 连续旋转动画(this.animation.rotate)详解
2017/04/07 Javascript
vue-cli 3.x 修改dist路径的方法
2018/09/19 Javascript
javascript json字符串到json对象转义问题
2019/01/22 Javascript
JavaScript 实现同时选取多个时间段的方法
2019/10/17 Javascript
使用Python脚本生成随机IP的简单方法
2015/07/30 Python
Python3的urllib.parse常用函数小结(urlencode,quote,quote_plus,unquote,unquote_plus等)
2016/09/18 Python
windows 10下安装搭建django1.10.3和Apache2.4的方法
2017/04/05 Python
Python3.x对JSON的一些操作示例
2017/09/01 Python
Python中的默认参数实例分析
2018/01/29 Python
Python3和pyqt5实现控件数据动态显示方式
2019/12/13 Python
详解python内置常用高阶函数(列出了5个常用的)
2020/02/21 Python
新手入门学习python Numpy基础操作
2020/03/02 Python
利用python实现平稳时间序列的建模方式
2020/06/03 Python
爱尔兰最大的体育零售商:Life Style Sports
2019/06/12 全球购物
科颜氏印度官网:Kiehl’s印度
2021/02/20 全球购物
食品营养与检测应届生求职信
2013/11/08 职场文书
行政部主管岗位职责
2013/12/28 职场文书
销售顾问岗位职责
2014/02/25 职场文书
幼儿园六一儿童节主持节目串词
2014/03/21 职场文书
社会实践先进工作者事迹材料
2014/05/06 职场文书
社区清明节活动总结
2014/07/04 职场文书
学校党员对照检查材料
2014/08/28 职场文书
《酸的和甜的》教学反思
2016/02/18 职场文书
演讲稿之开卷有益
2019/08/07 职场文书
springboot拦截器无法注入redisTemplate的解决方法
2021/06/27 Java/Android