簡易ストップウォッチを作ってみる[LWC]
概要
LWCで簡易ストップウォッチを作成します。
setTimeoutで1000ミリ秒毎に秒数をカウントアップします。
ソースコード
SimpleStopwatchLwc.html
<template> <lightning-card> <div class="slds-grid slds-einstein-header slds-card__header"> <header class="slds-media slds-media_center slds-has-flexi-truncate"> <div class="slds-grid slds-grid_vertical-align-center slds-size_3-of-4 slds-medium-size_2-of-3"> <h1 class="slds-truncate" title="簡易ストップウォッチLWC"> <span class="slds-text-heading_large">簡易ストップウォッチLWC</span> </h1> </div> <div class="slds-einstein-header__figure slds-size_1-of-4 slds-medium-size_1-of-3"></div> </header> </div> <div class="slds-align_absolute-center"> <div class="slds-m-top_large"> <header class="slds-col slds-size_1-of-1 slds-align_absolute-center" > <div class="curentTime slds-text-heading_large">00:00</div> </header> <main class="slds-align_absolute-center"> <div class="slds-button-group slds-m-vertical_medium" role="group"> <lightning-button variant="neutral" label="スタート" onclick={startApp} class="slds-text-heading_medium slds-p-around_small" disabled={disableStartButton}></lightning-button> <lightning-button variant="neutral" label="ストップ" onclick={startApp} class="slds-text-heading_medium slds-p-around_small" disabled={disableStopButton}></lightning-button> <lightning-button variant="neutral" label="リセット" onclick={startApp} class="slds-button_text-destructive slds-text-heading_medium slds-p-around_small"></lightning-button> </div> </main> </div> </div> </lightning-card> </template>
SimpleStopwatchLwc.js
import { LightningElement } from 'lwc'; export default class SimpleStopwatchLwc extends LightningElement { startButton = this.template.querySelector('#start'); stopButton = this.template.querySelector('#stop'); sec = 0; // 秒 min = 0; // 分 timerId; // clearTimeout用のID disableStartButton = false; disableStopButton = true; // 押されたボタンを判定する startApp(event) { let clickedButtonlabel = event.currentTarget.label; if(clickedButtonlabel === 'スタート') { // 計測開始 this.startTimmer(); } else if(clickedButtonlabel === 'ストップ') { // 計測終了 this.stopTimmer(); } else { // 計測リセット this.resetTimmer(); } } // 計測開始 startTimmer() { this.disableStartButton = true; this.disableStopButton = false; // 1秒毎に計測する this.countUp(); } // 計測終了 stopTimmer() { this.disableStartButton = false; this.disableStopButton = true; clearTimeout(this.timerId); } // 計測リセット resetTimmer() { this.disableStartButton = false; this.disableStopButton = true; clearTimeout(this.timerId); const curentTimeText = this.template.querySelector('.curentTime'); curentTimeText.innerHTML = "00:00"; this.min = 0; this.sec = 0; } // 計測時間を分に変換する convertTime(){ this.sec++; if (this.sec >= 60) { this.sec = 0; this.min++; } } // 1秒毎に計測する countUp(){ this.timerId = setTimeout(function(){ // 計測時間を分に変換する this.convertTime(); // 桁数を固定 this.min = ('0' + this.min).slice(-2); this.sec = ('0' + this.sec).slice(-2); // 計測時間を表示 const curentTimeText = this.template.querySelector('.curentTime'); curentTimeText.textContent = this.min + ":" + this.sec; // 1秒毎に計測する this.countUp(); }.bind(this),1000); } }
SimpleStopwatchLwc.Js-meta.xml
<?xml version="1.0" encoding="UTF-8"?> <LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata"> <apiVersion>54.0</apiVersion> <isExposed>true</isExposed> <description>簡易ストップウォッチLWC</description> <targets> <target>lightning__RecordPage</target> <target>lightning__AppPage</target> <target>lightning__HomePage</target> </targets> </LightningComponentBundle>