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 相关文章推荐
仿服务器端脚本方式的JS模板实现方法
Apr 27 Javascript
JS 对象介绍
Jan 20 Javascript
js调用webservice中的方法实现思路及代码
Feb 25 Javascript
javascript 得到文件后缀名的思路及实现
May 09 Javascript
Javascript 拖拽的一些高级的应用(逐行分析代码,让你轻松了拖拽的原理)
Jan 23 Javascript
JavaScript中判断函数、变量是否存在
Jun 10 Javascript
基于JQuery实现的跑马灯效果(文字无缝向上翻动)
Dec 02 Javascript
详解jQuery中基本的动画方法
Dec 14 Javascript
jQuery幻灯片插件owlcarousel参数说明中文文档
Feb 27 jQuery
AngularJS对动态增加的DOM实现ng-keyup事件示例
Mar 12 Javascript
vue中选项卡点击切换且能滑动切换功能的实现代码
Nov 25 Javascript
javascript设计模式 ? 代理模式原理与用法实例分析
Apr 16 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开发注意事项总结
2015/02/04 PHP
ThinkPHP项目分组配置方法分析
2016/03/23 PHP
PHP简单实现二维数组的矩阵转置操作示例
2017/11/24 PHP
如何在PHP中读写文件
2020/09/07 PHP
javascript同步Import,同步调用外部js的方法
2008/07/08 Javascript
JavaScript Distilled 基础知识与函数
2010/04/07 Javascript
Javascript 判断Flash是否加载完成的代码
2010/04/12 Javascript
javascript实现表格排序 编辑 拖拽 缩放
2015/01/02 Javascript
js Calender控件使用详解
2015/01/05 Javascript
JavaScript判断表单提交时哪个radio按钮被选中的方法
2015/03/21 Javascript
jQuery插件fullPage.js实现全屏滚动效果
2016/12/02 Javascript
基于JavaScript实现带数据验证和复选框的表单提交
2017/08/23 Javascript
Nodejs模块的调用操作实例分析
2018/12/25 NodeJs
vue.js实现数据库的JSON数据输出渲染到html页面功能示例
2019/08/03 Javascript
vue-cli history模式实现tomcat部署报404的解决方式
2019/09/06 Javascript
解决微信授权成功后点击按返回键出现空白页和报错的问题
2020/06/08 Javascript
Python使用getpass库读取密码的示例
2017/10/10 Python
Python中的Numpy矩阵操作
2018/08/12 Python
使用django的objects.filter()方法匹配多个关键字的方法
2019/07/18 Python
python检测服务器端口代码实例
2019/08/31 Python
一行Python代码制作动态二维码的实现
2019/09/09 Python
python 创建一维的0向量实例
2019/12/02 Python
Python模块 _winreg操作注册表
2020/02/05 Python
Python安装并操作redis实现流程详解
2020/10/13 Python
Python操作Excel的学习笔记
2021/02/18 Python
CSS实现圆形放大镜狙击镜效果 只有圆圈里的放大
2012/12/10 HTML / CSS
HTML5+Canvas+CSS3实现齐天大圣孙悟空腾云驾雾效果
2016/04/26 HTML / CSS
LVMH旗下最大的奢侈品网站平台:24S
2020/05/24 全球购物
怎样建立和理解非常复杂的声明?例如定义一个包含N 个指向返回 指向字符的指针的函数的指针的数组?
2013/03/19 面试题
教师简历自我评价
2014/02/03 职场文书
亲子拓展活动方案
2014/02/20 职场文书
项目投资意向书
2014/04/01 职场文书
社团活动总结书
2014/06/27 职场文书
法院干警四风问题个人对照检查材料思想汇报
2014/10/07 职场文书
2015年度培训工作总结范文
2015/04/02 职场文书
python基础之爬虫入门
2021/05/10 Python