簡易ストップウォッチを作ってみる[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>

