首页 >> js开发 >> jsReact倒计时功能实现代码——解耦通用js大全
jsReact倒计时功能实现代码——解耦通用js大全
发布时间: 2021年1月13日 | 浏览:
| 分类:js开发
需求分析需求分析需求分析需求在某个页面中需要有一个倒计时的功能,倒计时 5 s,5s钟后跳转到新的界面分析
首先是实现倒计时功能
其次是实现在每倒计时 1 s后页面上要执行 倒计时秒数变化的功能
最后是实现倒计时完成后 跳转到指定页面的功能
首先是实现倒计时功能其次是实现在每倒计时 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 (
todoInfo
);
}
}
export default DemoPage;
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 (
todoInfo
);
}
}
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 (
todoInfo
);
}
}
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 (
todoInfo
);
}
}
export default DemoPage;改进后将时间作为参数放到countDown里面,方便随意设置倒计时时间进一步分析问题:上面的做法,
setState的操作只能写在本组件,与本组件紧耦合在一起,无法实现多组件复用
history.push('/Login') 只能用在umi 框架中,与框架紧耦合在一起,无法实现普适应用
setState的操作只能写在本组件,与本组件紧耦合在一起,无法实现多组件复用history.push('/Login') 只能用在umi 框架中,与框架紧耦合在一起,无法实现普适应用进一步改进进一步改进进一步改进针对本问题的需求,可以将业务场景扩大为:
倒计时功能
倒计时过程中 需要做某事 doSomethingDuringCountDown()
倒计时结束后 需要做某事 doSomethingAfterCountDown()
倒计时功能倒计时过程中 需要做某事 doSomethingDuringCountDown()doSomethingDuringCountDown()倒计时结束后 需要做某事 doSomethingAfterCountDown()doSomethingAfterCountDown()这样的话,倒计时的功能就可以使用的更加的灵活了。方案将函数作为参数传递到countDown()方法中将 doSomethingDuringCountDown() 和 doSomethingAfterCountDown()作为参数传递到countDown方法中,doSomethingDuringCountDown()doSomethingAfterCountDown()具体的方法实现,根据自己页面的需求来实现。代码
//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);
}
//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 (
todoInfo
)
}
}
export default DemoPage
//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 (
todoInfo
)
}
}
export default DemoPage总结 总结 总结
首先是实现倒计时功能
其次是实现在每倒计时 1 s后页面上要执行 倒计时秒数变化的功能
最后是实现倒计时完成后 跳转到指定页面的功能
首先是实现倒计时功能其次是实现在每倒计时 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 (
todoInfo
);
}
}
export default DemoPage;
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 (
todoInfo
);
}
}
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 (
todoInfo
);
}
}
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 (
todoInfo
);
}
}
export default DemoPage;改进后将时间作为参数放到countDown里面,方便随意设置倒计时时间进一步分析问题:上面的做法,
setState的操作只能写在本组件,与本组件紧耦合在一起,无法实现多组件复用
history.push('/Login') 只能用在umi 框架中,与框架紧耦合在一起,无法实现普适应用
setState的操作只能写在本组件,与本组件紧耦合在一起,无法实现多组件复用history.push('/Login') 只能用在umi 框架中,与框架紧耦合在一起,无法实现普适应用进一步改进进一步改进进一步改进针对本问题的需求,可以将业务场景扩大为:
倒计时功能
倒计时过程中 需要做某事 doSomethingDuringCountDown()
倒计时结束后 需要做某事 doSomethingAfterCountDown()
倒计时功能倒计时过程中 需要做某事 doSomethingDuringCountDown()doSomethingDuringCountDown()倒计时结束后 需要做某事 doSomethingAfterCountDown()doSomethingAfterCountDown()这样的话,倒计时的功能就可以使用的更加的灵活了。方案将函数作为参数传递到countDown()方法中将 doSomethingDuringCountDown() 和 doSomethingAfterCountDown()作为参数传递到countDown方法中,doSomethingDuringCountDown()doSomethingAfterCountDown()具体的方法实现,根据自己页面的需求来实现。代码
//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);
}
//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 (
todoInfo
)
}
}
export default DemoPage
//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 (
todoInfo
)
}
}
export default DemoPage总结 总结 总结
相关文章:
- js代码JavaScript检测是否开启了控制台(F12调试工具)
- jsvue中重定向redirect:‘/index‘,不显示问题、跳转出错的完美解决js大全
- JavaScript原生js实现表格翻页和跳转
- JavaScriptjs通过canvas生成图片缩略图
- js如何利用JS将手机号中间四位变成*号js大全
- js如何手写简易的 Vue Routerjs大全
- JavaScriptjs禁止查看源文件屏蔽Ctrl+u/s、F12、右键等兼容IE火狐chrome
- jsvue2和vue3的v-if与v-for优先级对比学习js大全
- jsvue 虚拟DOM的原理js大全
- jsvue 验证两次输入的密码是否一致的方法示例js大全