日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Vue-cli框架實現計時器應用

瀏覽:111日期:2023-02-16 16:15:52
技術背景

本應用使用 vue-cli 框架,并使用了自定義組件(將按鈕拆分成單獨的組件)和vue 模板。

使用說明

開始正計時:點擊工具欄的“開始正計時”按鈕即可,快捷鍵為'Enter'鍵。

開始倒計時:在輸入框內寫入時間后,點擊“開始倒計時”按鈕,即可開始倒計時。

暫停計時器:點擊“暫停計時器”按鈕即可暫停。

清空正/倒計時:點擊此按鈕,計時器便會回到初始狀態,等待新的計時。

重新再計時:點擊此按鈕,計時器便會重新開始此次計時。

恢復計時器:點擊此按鈕即可從暫停狀態中恢復。

Vue-cli框架實現計時器應用

代碼

首先初始化項目

vue init webpack <project name>

components文件夾中放入文件:CounterButton.vue

<template> <div> <button v-bind: v-on:click='$emit(’click-button’)'>{{ text }}</button> </div></template><script>export default { name: 'CounterButton', props: { text: String }, data: function() { return { styleObject: {countup: false,countdown: false,clear: false,pause: false,restart: false,resume: false } }; }, created: function() { if (this.text == '開始正計時') { this.styleObject.countup = true; } else if (this.text == '開始倒計時') { this.styleObject.countdown = true; } else if (this.text == '清空倒計時' || this.text == '清空正計時') { this.styleObject.clear = true; } else if (this.text == '暫停計時器') { this.styleObject.pause = true; } else if (this.text == '重新再計時') { this.styleObject.restart = true; } else if (this.text == '恢復計時器') { this.styleObject.resume = true; } }};</script><style>.countup { background-color: #2188e9; border-radius: 5px; border-color: #2188e9; position: absolute; left: 310px; top: 15px; width: 98px; height: 40px; font-family: PingFangSC-Regular, 'PingFang SC', sans-serif; font-size: 16px; color: #ffffff;}.countdown { background-color: #2188e9; border-radius: 5px; border-color: #2188e9; position: absolute; left: 428px; top: 15px; width: 98px; height: 40px; font-family: PingFangSC-Regular, 'PingFang SC', sans-serif; font-size: 16px; color: #ffffff;}.clear { background-color: #dd2e1d; border-radius: 5px; border-color: #dd2e1d; position: absolute; left: 964px; top: 15px; width: 98px; height: 40px; font-family: PingFangSC-Regular, 'PingFang SC', sans-serif; font-size: 16px; color: #ffffff;}.pause { background-color: #2188e9; border-radius: 5px; border-color: #2188e9; position: absolute; left: 227px; top: 15px; width: 98px; height: 40px; font-family: PingFangSC-Regular, 'PingFang SC', sans-serif; font-size: 16px; color: #ffffff;}.restart { background-color: #ffb020; border-radius: 5px; border-color: #ffb020; position: absolute; left: 1082px; top: 15px; width: 98px; height: 40px; font-family: PingFangSC-Regular, 'PingFang SC', sans-serif; font-size: 16px; color: #ffffff;}.resume { background-color: #2188e9; border-radius: 5px; border-color: #2188e9; position: absolute; left: 227px; top: 15px; width: 98px; height: 40px; font-family: PingFangSC-Regular, 'PingFang SC', sans-serif; font-size: 16px; color: #ffffff;}</style>

將App.vue改為

<template> <div id='app'> <div class='toolbar'> <div v-show='initialSeen'><input v-model='hour' /><input v-model='minute' /><input v-model='second' /><span id='hourlabel'>時</span><span id='minutelabel'>分</span><span id='secondlabel'>秒</span><counter-button text='開始正計時' v-on:click-button='startCountUp' id='countup'></counter-button><counter-button text='開始倒計時' v-on:click-button='startCountDown' id='countdown'></counter-button> </div> <span v-show='hintSeen'>{{ hint }}</span> <counter-button v-bind:text='clearText' v-on:click-button='clearCounter' v-show='clearSeen' id='clear'></counter-button> <counter-button text='暫停計時器' v-on:click-button='pauseCounter' v-show='pauseSeen' id='pause'></counter-button> <counter-button text='重新再計時' v-on:click-button='restartCounter' v-show='restartSeen' id='restart'></counter-button> <counter-button text='恢復計時器' v-on:click-button='resumeCounter' v-show='resumeSeen' id='resume'></counter-button> </div> <span id='time'>{{ time }}</span> </div></template><script>import CounterButton from './components/CounterButton';export default { name: 'App', data: function() { return { status: 1, // status---1: before start; 2: up timing; 3: down timing; 4: up pausing; // 5: down pausing; 6: down finished; hour: null, minute: null, second: null, time: '00:00:00', timer: null, Hour: 0, Minute: 0, Second: 0, Millisecond: 0, hourString: '', minuteString: '', secondString: '', recordHour: 0, recordMinute: 0, recordSecond: 0, recordMillisecond: 0, hint: '正在倒計時 12:20:00', clearText: '清空倒計時', initialSeen: true, clearSeen: false, pauseSeen: false, restartSeen: false, resumeSeen: false, hintSeen: false }; }, methods: { format: function(Hour, Minute, Second) { if (Second < 10) {this.secondString = '0' + Second; } else {this.secondString = Second; } if (Minute < 10) {this.minuteString = '0' + Minute; } else {this.minuteString = Minute; } if (Hour < 10) {this.hourString = '0' + Hour; } else {this.hourString = Hour; } return (this.hourString + ':' + this.minuteString + ':' + this.secondString ); }, changeStatus: function(aimStatus) { if (aimStatus == 1) {// before startthis.initialSeen = true;this.clearSeen = false;this.pauseSeen = false;this.restartSeen = false;this.resumeSeen = false;this.hintSeen = false; } else if (aimStatus == 2 || aimStatus == 3) {// up timing || down timingthis.initialSeen = false;this.clearSeen = true;this.pauseSeen = true;this.restartSeen = true;this.resumeSeen = false;this.hintSeen = true;if (aimStatus == 2) { this.hint = '正在正計時'; this.clearText = '清空正計時';} else if (aimStatus == 3) { this.recordHour = parseInt(this.recordMillisecond / 3600000); this.recordMinute = parseInt( (this.recordMillisecond % 3600000) / 60000 ); this.recordSecond = parseInt((this.recordMillisecond % 60000) / 1000); this.hint = '正在倒計時 ' + this.format(this.recordHour, this.recordMinute, this.recordSecond); this.clearText = '清空倒計時';} } else if (aimStatus == 4 || aimStatus == 5) {// up pausing || down pausingthis.initialSeen = false;this.clearSeen = true;this.pauseSeen = false;this.restartSeen = true;this.resumeSeen = true;this.hintSeen = true;if (aimStatus == 4) { // up pausing this.hint = '暫停正計時'; this.clearText = '清空正計時';} else if (aimStatus == 5) { // down pausing this.recordHour = parseInt(this.recordMillisecond / 3600000); this.recordMinute = parseInt( (this.recordMillisecond % 3600000) / 60000 ); this.recordSecond = parseInt((this.recordMillisecond % 60000) / 1000); this.hint = '暫停倒計時 ' + this.format(this.recordHour, this.recordMinute, this.recordSecond); this.clearText = '清空倒計時';} } else if (aimStatus == 6) {// down finishedthis.initialSeen = false;this.clearSeen = true;this.pauseSeen = false;this.restartSeen = true;this.resumeSeen = false;this.hintSeen = true;this.recordHour = parseInt(this.recordMillisecond / 3600000);this.recordMinute = parseInt( (this.recordMillisecond % 3600000) / 60000);this.recordSecond = parseInt((this.recordMillisecond % 60000) / 1000);this.hint = '倒計時 ' + this.format(this.recordHour, this.recordMinute, this.recordSecond) + ' 已結束'; } }, CountUp: function() { this.Millisecond += 50; this.Hour = parseInt(this.Millisecond / 3600000); this.Minute = parseInt((this.Millisecond % 3600000) / 60000); this.Second = parseInt((this.Millisecond % 60000) / 1000); this.time = this.format(this.Hour, this.Minute, this.Second); }, CountDown: function() { this.Millisecond -= 50; this.Hour = parseInt(this.Millisecond / 3600000); this.Minute = parseInt((this.Millisecond % 3600000) / 60000); this.Second = parseInt((this.Millisecond % 60000) / 1000); if (this.Millisecond <= 0) {clearInterval(this.timer);this.changeStatus(6); } this.time = this.format(this.Hour, this.Minute, this.Second); }, startCountUp: function() { this.status = 2; this.Millisecond = 0; this.changeStatus(this.status); this.timer = setInterval(this.CountUp, 50); }, startCountDown: function() { this.status = 3; this.Hour = this.hour; if (this.minute > 59) {this.Minute = 59; } else {this.Minute = this.minute; } if (this.second > 59) {this.Second = 59; } else {this.Second = this.second; } this.hour = null; this.minute = null; this.second = null; this.Millisecond =this.Hour * 3600000 + this.Minute * 60000 + this.Second * 1000; this.recordMillisecond = this.Millisecond; this.changeStatus(this.status); this.timer = setInterval(this.CountDown, 50); }, clearCounter: function() { this.status = 1; this.changeStatus(this.status); clearInterval(this.timer); this.time = this.format(0, 0, 0); }, pauseCounter: function() { if (this.status == 2) {// Now count upthis.status = 4;this.changeStatus(this.status);clearInterval(this.timer); } else if (this.status == 3) {// now count downthis.status = 5;this.changeStatus(this.status);clearInterval(this.timer); } }, restartCounter: function() { if (this.status == 2 || this.status == 4) {this.status = 2;this.Millisecond = 0;this.changeStatus(this.status);clearInterval(this.timer);this.timer = setInterval(this.CountUp, 50); } else if ((this.status = 3 || this.status == 5 || this.status == 6)) {this.status = 3;this.Millisecond = this.recordMillisecond;this.changeStatus(this.status);clearInterval(this.timer);this.timer = setInterval(this.CountDown, 50); } }, resumeCounter: function() { if (this.status == 4) {this.status = 2;this.changeStatus(this.status);this.timer = setInterval(this.CountUp, 50); } else if ((status = 5)) {this.status = 3;this.changeStatus(this.status);this.timer = setInterval(this.CountDown, 50); } }, // 鍵盤事件 handleKeyup(event) { const e = event || window.event || arguments.callee.caller.arguments[0]; if (!e) return; const { key, keyCode } = e; if (key == 'Enter') {if (this.status == 1) { // before start this.status = 2; this.Millisecond = 0; this.changeStatus(this.status); this.timer = setInterval(this.CountUp, 50);} } else if (keyCode == 32) {if (this.status == 2) { // Now count up this.status = 4; this.changeStatus(this.status); clearInterval(this.timer);} else if (this.status == 3) { // now count down this.status = 5; this.changeStatus(this.status); clearInterval(this.timer);} else if (this.status == 4) { this.status = 2; this.changeStatus(this.status); this.timer = setInterval(this.CountUp, 50);} else if (this.status == 5) { this.status = 3; this.changeStatus(this.status); this.timer = setInterval(this.CountDown, 50);} } } }, mounted: function() { window.addEventListener('keyup', this.handleKeyup); }, destroyed() { window.removeEventListener('keyup', this.handleKeyup); }, components: { CounterButton }};</script><style>body { margin: 0; padding: 0;}.toolbar { background-color: #97a5bc; width: 1220px; height: 70px;}#hour { background-color: white; border-radius: 5px; position: absolute; left: 40px; top: 15px; width: 69px; height: 34px; font-size: 15px;}#hourlabel { position: absolute; left: 86px; top: 24px; font-family: PingFangSC-Regular, 'PingFang SC', sans-serif; font-size: 16px; color: #222222;}#minute { background-color: white; border-radius: 5px; position: absolute; left: 130px; top: 15px; width: 69px; height: 34px; font-size: 15px;}#minutelabel { position: absolute; left: 177px; top: 24px; font-family: PingFangSC-Regular, 'PingFang SC', sans-serif; font-size: 16px; color: #222222;}#second { background-color: white; border-radius: 5px; position: absolute; left: 220px; top: 15px; width: 69px; height: 34px; font-size: 15px;}#secondlabel { position: absolute; left: 268px; top: 24px; font-family: PingFangSC-Regular, 'PingFang SC', sans-serif; font-size: 16px; color: #222222;}#time { position: absolute; left: 131px; top: 197px; font-size: 200px; font-family: PTMono-Bold, 'PT Mono', monospace; font-weight: 700; color: #333333;}#hint { position: absolute; left: 40px; top: 24px; font-family: PTMono-Bold, 'PT Mono', monospace; font-size: 16px; color: white;}</style>

最后在目錄中使用

npm run dev

即可運行該項目。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Vue
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产偷自视频区视频一区二区| 日本在线视频一区二区| 免费精品视频最新在线| 新版的欧美在线视频| 免费在线观看一区| 欧美一区二区三区久久精品| 日韩视频在线一区二区三区| 精品日韩视频| 久久电影tv| 国产精品成人一区二区网站软件| 精品一区三区| 国产资源在线观看入口av| 蜜臀久久99精品久久久久宅男| 国产亚洲亚洲| 国产情侣久久| 欧美aa在线观看| 日韩成人精品一区| 国产欧美日韩一级| 日本在线成人| 日韩精品免费观看视频| 日韩精品视频一区二区三区| 日韩激情一区二区| 青青草国产成人99久久| 日本aⅴ亚洲精品中文乱码| 免费在线看一区| 在线视频精品| 尹人成人综合网| 国产精品视区| | 午夜一区在线| 亚洲一区二区毛片| 日韩国产成人精品| 麻豆精品视频在线观看| 成人国产精品久久| 色在线中文字幕| 欧美日韩一二三四| 国产毛片一区| 欧美日韩18| 中文字幕人成乱码在线观看| 成人福利视频| 欧美午夜精彩| 香蕉久久夜色精品国产| 日本不卡一区二区三区| 精品中文在线| 久久精品卡一| 亚洲专区视频| 精品一区二区三区亚洲| 欧美日韩在线网站| 性欧美长视频| 精品一区二区三区视频在线播放| 精品国产中文字幕第一页| 日本午夜大片a在线观看| 九九综合九九| 国产精品色婷婷在线观看| 麻豆国产欧美日韩综合精品二区| 狠狠久久伊人中文字幕| 91成人网在线观看| 欧美日韩亚洲一区在线观看| 丰满少妇一区| 亚洲精品99| 国产欧美日韩| 88xx成人免费观看视频库| 午夜在线播放视频欧美| 国产欧美日韩视频在线| 欧美三区四区| 日韩欧美2区| 岛国精品一区| 日韩视频一区| 欧美激情日韩| 在线日韩欧美| 91精品福利观看| 天堂av在线| 黄色免费成人| 国产调教精品| 亚洲成人精品| 国产精品永久| 91国语精品自产拍| 久久精品欧洲| 在线观看一区| 亚洲va中文在线播放免费| 免费观看在线色综合| 日韩国产一区二区| 日韩av网站在线观看| 久久一区二区三区电影| 日本麻豆一区二区三区视频| 日本国产精品| 国产精品网站在线看| 快she精品国产999| 成人片免费看| 国产精品亚洲综合在线观看| 午夜在线视频一区二区区别 | 国产精品美女午夜爽爽| 国产综合欧美| 美女免费视频一区| 日韩精品免费观看视频| 好吊视频一区二区三区四区| 久久影院资源站| 国产精品试看| 免费看av不卡| 久久亚洲资源中文字| 四虎精品一区二区免费| 国产综合精品一区| 亚洲欧洲美洲av| 欧美国产极品| 国产精品多人| 欧美日韩一视频区二区| 亚洲欧美网站| 亚洲小说欧美另类婷婷| 吉吉日韩欧美| 精品一区二区三区视频在线播放| 亚洲va久久久噜噜噜久久| 国产精品婷婷| 久久精品亚洲人成影院| 色8久久久久| 亚洲精品影视| 国产精品久久久久久久免费软件| 国产一区丝袜| 亚洲综合在线电影| 欧美日韩国产精品一区二区亚洲| 成人羞羞在线观看网站| 久久久久久自在自线| 韩日一区二区| 久久久久久久欧美精品| 国产亚洲精品精品国产亚洲综合| 伊人精品久久| 亚洲欧美日韩国产一区| 久久亚洲国产| 久久久五月天| 久久免费国产| 国产超碰精品| 久久蜜桃精品| 成人羞羞视频播放网站| 国产+成+人+亚洲欧洲在线| 日韩88av| 欧美激情一区| 久久影视三级福利片| 九九久久国产| 自由日本语亚洲人高潮| 色狠狠一区二区三区| 精品久久亚洲| 亚洲欧美日韩视频二区| 国产精品亚洲欧美| 精品亚洲美女网站| 日本大胆欧美人术艺术动态| 国产精品麻豆成人av电影艾秋| 国产精品成久久久久| 日韩精品一页| 久久精品国产网站| 久久久久一区| 综合干狼人综合首页| 91九色综合| 国产乱论精品| a日韩av网址| 亚洲一区网站| 国产欧美日韩亚洲一区二区三区| 精品国产乱码久久久| 99国产精品免费视频观看| 欧美日韩国产精品一区二区亚洲| 亚州国产精品| 精品国产aⅴ| 国产一区清纯| 亚久久调教视频| 老司机精品视频在线播放| 久久人人88| 免费日韩精品中文字幕视频在线| 精品久久视频| 日韩av字幕| 欧美羞羞视频| 久久久天天操| 午夜日韩福利| 国产精品一区二区三区www| 日韩精品首页| 日本欧美一区| 日韩欧美看国产| 亚洲精品系列| 日韩中文欧美| 日韩精品免费视频一区二区三区| 美女av在线免费看| 一区二区不卡| 国产suv精品一区| 日韩影院在线观看| sm捆绑调教国产免费网站在线观看 | 综合一区av| 久久精品国内一区二区三区| 在线成人直播| 国产精品巨作av| 婷婷国产精品| 国产精品啊v在线| 欧美久久精品一级c片| 伊人久久亚洲美女图片| 91看片一区| 精品美女久久| 国产激情精品一区二区三区| 久久国产精品久久w女人spa| 久久久人人人| 日韩国产欧美一区二区| 国产美女高潮在线| 国产aⅴ精品一区二区三区久久| 欧美激情在线精品一区二区三区| 久久国产日韩欧美精品|