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接收get传递的值的代码
Nov 30 Javascript
推荐6款基于jQuery实现图片效果插件
Dec 07 Javascript
AngularJS 实现按需异步加载实例代码
Oct 18 Javascript
全面解析jQuery $(document).ready()和JavaScript onload事件
Jun 08 Javascript
JavaScript学习笔记整理_关于表达式和语句
Sep 19 Javascript
js实现简单的计算器功能
Jan 16 Javascript
微信小程序 中wx.chooseAddress(OBJECT)实例详解
Mar 31 Javascript
vue二级路由设置方法
Feb 09 Javascript
微信小程序自定义多列选择器使用详解
Jun 21 Javascript
Vue数据绑定实例写法
Aug 06 Javascript
nest.js 使用express需要提供多个静态目录的操作方法
Oct 24 Javascript
详细分析vue响应式原理
Jun 22 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
example1.php
2006/10/09 PHP
我的论坛源代码(八)
2006/10/09 PHP
10个可以简化php开发过程的MySQL工具
2010/04/11 PHP
php中的一些数组排序方法分享
2012/07/20 PHP
PHP中对于浮点型的数据需要用不同的方法解决
2014/03/11 PHP
Zend Framework处理Json数据方法详解
2016/12/09 PHP
php桥接模式应用案例分析
2019/10/23 PHP
js文字滚动停顿效果代码
2008/06/28 Javascript
JSON 教程 json入门学习笔记
2020/09/22 Javascript
jquery如何实现锚点链接之间的平滑滚动
2013/12/02 Javascript
关于img的href和src取变量及赋值的方法
2014/04/28 Javascript
详解JavaScript中localStorage使用要点
2016/01/13 Javascript
快速解决Canvas.toDataURL 图片跨域的问题
2016/05/10 Javascript
jQuery 获取页面li数组并删除不在数组中的key
2016/08/02 Javascript
JavaScript实现清空(重置)文件类型INPUT元素值的方法
2016/11/17 Javascript
bootstrap table实例详解
2017/01/06 Javascript
JS实现合并json对象的方法
2017/10/10 Javascript
Python实现远程调用MetaSploit的方法
2014/08/22 Python
详解python中requirements.txt的一切
2017/03/03 Python
Python排序算法实例代码
2017/08/10 Python
Python实现扩展内置类型的方法分析
2017/10/16 Python
selenium+python实现自动登录脚本
2018/04/22 Python
计算机二级python学习教程(2) python语言基本语法元素
2019/05/16 Python
python读出当前时间精度到秒的代码
2019/07/05 Python
Python在Matplotlib图中显示中文字体的操作方法
2019/07/29 Python
Python中SQLite如何使用
2020/05/27 Python
Jack Rogers官网:美国经典的女性鞋靴品牌
2019/09/04 全球购物
简述DNS进行域名解析的过程
2013/12/02 面试题
写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分隔
2015/07/30 面试题
会计与审计专业大专生求职信
2013/10/03 职场文书
一个大学生十年的职业规划
2014/01/17 职场文书
出纳员岗位职责
2014/03/13 职场文书
情侣之间的道歉短信
2015/05/12 职场文书
党风廉政建设心得体会(2016最新版)
2016/01/22 职场文书
《静夜思》教学反思
2016/02/17 职场文书
vue ref如何获取子组件属性值
2022/03/31 Vue.js