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实现的一个include函数
Jul 21 Javascript
基于Jquery的标签智能验证实现代码
Dec 27 Javascript
js控制容器隐藏出现防止样式变化的两种方法
Apr 25 Javascript
jQuery层级选择器用法分析
Feb 10 Javascript
js闭包实现按秒计数
Apr 23 Javascript
javascript移动开发中touch触摸事件详解
Mar 18 Javascript
在Mac下彻底卸载node和npm的方法
May 16 Javascript
vue.js配合$.post从后台获取数据简单demo分享
Aug 11 Javascript
在React项目中使用Eslint代码检查工具及常见问题
Oct 10 Javascript
vue地址栏直接输入路由无效问题的解决
Nov 15 Javascript
微信小程序把百度地图坐标转换成腾讯地图坐标过程详解
Jul 10 Javascript
Vue实现购物车基本功能
Nov 08 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
source.php查看源文件
2006/12/09 PHP
hadoop常见错误以及处理方法详解
2013/06/19 PHP
php 启动报错如何解决
2014/01/17 PHP
WordPress中登陆后关闭登陆页面及设置用户不可见栏目
2015/12/31 PHP
Smarty实现页面静态化(生成HTML)的方法
2016/05/23 PHP
Javascript this指针
2009/07/30 Javascript
ASP.NET jQuery 实例4(复制TextBox的文本到本地剪贴板上)
2012/01/13 Javascript
jquery获取特定name所有选中的checkbox,支持IE9标准模式
2013/03/18 Javascript
关于onchange事件在IE和FF下的表现及解决方法
2014/03/08 Javascript
通过$(this)使用jQuery包装后的方法或属性
2014/05/18 Javascript
WordPress中利用AJAX异步获取评论用户头像的方法
2016/01/08 Javascript
arcgis for js 修改infowindow样式的方法
2016/11/02 Javascript
Bootstrap导航条学习使用(一)
2017/02/08 Javascript
微信小程序Redux绑定实例详解
2017/06/07 Javascript
vue 系列——vue2-webpack2框架搭建踩坑之路
2017/12/22 Javascript
vue全局组件与局部组件使用方法详解
2018/03/29 Javascript
用ES6的class模仿Vue写一个双向绑定的示例代码
2018/04/20 Javascript
JS实现统计字符串中字符出现个数及最大个数功能示例
2018/06/04 Javascript
React 无状态组件(Stateless Component) 与高阶组件
2018/08/14 Javascript
Vue快速实现通用表单验证的示例代码
2020/01/09 Javascript
如何在JavaScript中等分数组的实现
2020/12/13 Javascript
Python程序员鲜为人知但你应该知道的17个问题
2014/06/04 Python
对pandas通过索引提取dataframe的行方法详解
2019/02/01 Python
python 解决selenium 中的 .clear()方法失效问题
2020/09/01 Python
PyCharm+Miniconda3安装配置教程详解
2021/02/16 Python
CHARLES & KEITH英国官网:新加坡时尚品牌
2018/07/04 全球购物
客服实习的个人自我鉴定
2013/10/20 职场文书
四年大学生活的个人自我评价
2013/12/11 职场文书
医院实习接收函
2014/01/12 职场文书
幼儿园毕业寄语
2014/04/03 职场文书
《金子》教学反思
2014/04/13 职场文书
小学生春游活动方案
2014/08/20 职场文书
2014年房产销售工作总结
2014/12/08 职场文书
幼儿园老师新年寄语
2015/08/17 职场文书
python实现简单倒计时功能
2021/04/21 Python
为什么代码规范要求SQL语句不要过多的join
2021/06/23 MySQL