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程序之undefined篇(中)
Nov 23 Javascript
js+css实现导航效果实例
Feb 10 Javascript
详谈javascript中DOM的基本属性
Feb 26 Javascript
JavaScript获得url查询参数的方法
Jul 02 Javascript
javascript运动框架用法实例分析(实现放大与缩小效果)
Jan 08 Javascript
BootStrap智能表单实战系列(四)表单布局介绍
Jun 13 Javascript
js案例之鼠标跟随jquery版(实例讲解)
Jul 21 jQuery
vue使用mint-ui实现下拉刷新和无限滚动的示例代码
Nov 06 Javascript
pm2发布node配置文件ecosystem.json详解
May 15 Javascript
vue设置一开始进入的页面教程
Oct 28 Javascript
浅谈Vue组件单元测试究竟测试什么
Feb 05 Javascript
vue动画—通过钩子函数实现半场动画操作
Aug 09 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中存储用户ID和密码到mysql数据库的方法
2013/02/06 PHP
PHP实现无限极分类图文教程
2014/11/25 PHP
PHP中字符安全过滤函数使用小结
2015/02/25 PHP
php实现微信公众号无限群发
2015/10/11 PHP
PHP+Mysql+jQuery实现发布微博程序 php篇
2015/10/15 PHP
php截取视频指定帧为图片
2016/05/16 PHP
javaScript 读取和设置文档元素的样式属性
2009/04/14 Javascript
jQuery live
2009/05/15 Javascript
JavaScript 动态添加表格行 使用模板、标记
2009/10/24 Javascript
javascript判断用户浏览器插件安装情况的代码
2011/01/01 Javascript
IE6浏览器下resize事件被执行了多次解决方法
2012/12/11 Javascript
如何使用json在前后台进行数据传输实例介绍
2013/04/11 Javascript
javascript删除数组元素并且数组长度减小的简单实例
2014/02/14 Javascript
js中直接声明一个对象的方法
2014/08/10 Javascript
javascript浏览器窗口之间传递数据的方法
2015/01/20 Javascript
Bootstrap每天必学之表格
2015/11/23 Javascript
jQuery实现发送验证码并60秒倒计时功能
2016/11/25 Javascript
LayerClose弹窗关闭刷新方法
2018/08/17 Javascript
vue 地图可视化 maptalks 篇实例代码详解
2019/05/21 Javascript
ionic2.0双击返回键退出应用
2019/09/17 Javascript
[03:42]2014DOTA2西雅图国际邀请赛7月9日TOPPLAY
2014/07/09 DOTA
Python3中exp()函数用法分析
2019/02/19 Python
Scrapy框架介绍之Puppeteer渲染的使用
2020/06/19 Python
python Socket网络编程实现C/S模式和P2P
2020/06/22 Python
Python为何不支持switch语句原理详解
2020/10/21 Python
python和C++共享内存传输图像的示例
2020/10/27 Python
html5 初试 indexedDB(推荐)
2016/07/21 HTML / CSS
伦敦一卡通:The London Pass
2018/11/30 全球购物
网络事业创业计划书范文
2014/01/09 职场文书
学生打架检讨书
2014/02/14 职场文书
秋季运动会广播稿(30篇)
2014/09/13 职场文书
2015新学期家长寄语
2015/02/26 职场文书
python实现socket简单通信的示例代码
2021/04/13 Python
只用Python就可以制作的简单词云
2021/06/07 Python
Python识别花卉种类鉴定网络热门植物并自动整理分类
2022/04/08 Python
详解flex:1什么意思
2022/07/23 HTML / CSS