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 相关文章推荐
innerText和innerHTML 一些问题分析
May 18 Javascript
Jquery在IE7下无法使用 $.ajax解决方法
Nov 11 Javascript
jquery 使用点滴函数代码
May 20 Javascript
jquery操作checkbox实现全选和取消全选
May 02 Javascript
使用Jquery实现每日签到功能
Apr 03 Javascript
ionic实现可滑动的tab选项卡切换效果
Apr 15 Javascript
微信小程序 css使用技巧总结
Jan 09 Javascript
jq给页面添加覆盖层遮罩的实例
Feb 16 Javascript
Vue+ElementUI实现表单动态渲染、可视化配置的方法
Mar 07 Javascript
微信小程序实现底部导航
Nov 05 Javascript
Nuxt.js之自动路由原理的实现方法
Nov 21 Javascript
vue-simple-uploader上传成功之后的response获取代码
Sep 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
非常有用的9个PHP代码片段
2016/04/06 PHP
php 自定义错误日志实例详解
2016/11/12 PHP
转一个日期输入控件,支持FF
2007/04/27 Javascript
jQuery语法高亮插件支持各种程序源代码语法着色加亮
2013/04/27 Javascript
jquery索引在使用中的一些困惑
2013/10/24 Javascript
javascript获取ckeditor编辑器的值(实现代码)
2013/11/18 Javascript
js实现数组转换成json
2015/06/26 Javascript
jQuery Html控件基本操作(日常收集整理)
2016/03/11 Javascript
Dojo获取下拉框的文本和值实例代码
2016/05/27 Javascript
深入理解JS函数的参数(arguments)的使用
2016/05/28 Javascript
JavaScript DOM 对象深入了解
2016/07/20 Javascript
dul无法加载bootstrap实现unload table/user恢复
2016/09/29 Javascript
jQuery实现表格与ckeckbox的全选与单选功能
2016/11/24 Javascript
ionic cordova一次上传多张图片(类似input file提交表单)的实现方法
2016/12/16 Javascript
jQuery基本筛选选择器实例代码
2017/02/06 Javascript
使用Ajax和Jquery配合数据库实现下拉框的二级联动的示例
2018/01/25 jQuery
一秒学会微信小程序制作table表格
2019/02/14 Javascript
Node.js之readline模块的使用详解
2019/03/25 Javascript
layer父页获取弹出层输入框里面的值方法
2019/09/02 Javascript
JS实现碰撞检测效果
2020/03/12 Javascript
[07:54]DOTA2 MV《我的动力鞋》 ImbaTV 出品
2014/11/21 DOTA
使用Python中PDB模块中的命令来调试Python代码的教程
2015/03/30 Python
使用Python &amp; Flask 实现RESTful Web API的实例
2017/09/19 Python
python模拟登陆,用session维持回话的实例
2018/12/27 Python
python3实现往mysql中插入datetime类型的数据
2020/03/02 Python
浅谈Python中的模块
2020/06/10 Python
html5中为audio标签增加停止按钮动作实现方法
2013/01/04 HTML / CSS
俄罗斯皮肤健康中心:Pharmacosmetica.ru
2020/02/22 全球购物
社团招新策划书
2014/02/04 职场文书
我的教育故事演讲稿
2014/05/04 职场文书
企业金融服务方案
2014/06/03 职场文书
学生意外伤害赔偿协议书
2014/09/17 职场文书
2015年招聘工作总结
2014/12/12 职场文书
中国现代文学之经典散文三篇
2019/09/18 职场文书
Nginx域名转发https访问的实现
2021/03/31 Servers
OpenCV-Python实现怀旧滤镜与连环画滤镜
2021/06/09 Python