欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用Vue3實(shí)現(xiàn)倒計(jì)時(shí)器及倒計(jì)時(shí)任務(wù)的完整代碼

 更新時(shí)間:2024年11月23日 10:21:22   作者:記得開(kāi)心一點(diǎn)嘛  
文章介紹了如何使用Vue3和Element-plus開(kāi)發(fā)一個(gè)倒計(jì)時(shí)器和倒計(jì)時(shí)任務(wù)管理界面,倒計(jì)時(shí)器具備手動(dòng)設(shè)置、開(kāi)始、暫停和重啟功能,文章還提供了倒計(jì)時(shí)器的完整代碼,包括HTML、JavaScript和CSS部分,感興趣的朋友一起看看吧

本內(nèi)容使用Vue3,以及element-plus輔助開(kāi)發(fā)。

首先展示倒計(jì)時(shí)器的功能:

  • 手動(dòng)設(shè)置倒計(jì)時(shí)器的倒計(jì)時(shí)時(shí)間
  • 開(kāi)始倒計(jì)時(shí)按鈕
  • 暫停倒計(jì)時(shí)按鈕
  • 重新開(kāi)始倒計(jì)時(shí)按鈕

 其次展示倒計(jì)時(shí)任務(wù)管理界面功能:

創(chuàng)建倒計(jì)時(shí)任務(wù)選擇任務(wù)并進(jìn)行倒計(jì)時(shí)刪除任務(wù)

一.倒計(jì)時(shí)器:

最后面會(huì)附有完整代碼,可直接CV。 

1.html:

使用element-plus下拉框組件選擇設(shè)置的時(shí)分秒的時(shí)間,點(diǎn)擊確定按鈕就可以將設(shè)置的時(shí)間在formattedTime顯示,隨后使用操作按鈕進(jìn)行對(duì)計(jì)時(shí)器的操作。 

<el-card>
    <h2>倒計(jì)時(shí)器</h2>
    <!-- 倒計(jì)時(shí)時(shí)間選擇框 -->
    <div>
        <el-form inline>
            <!-- 小時(shí)選擇器 -->
            <el-form-item label="小時(shí):">
                <el-select v-model="selectedHours" :disabled="isRunning" placeholder="選擇小時(shí)" style="width: 100px;">
                    <el-option v-for="h in 24" :key="'h' + h" :label="h - 1" :value="h - 1"/>
                </el-select>
            </el-form-item>
            <!-- 分鐘選擇器 -->
            <el-form-item label="分鐘:">
                <el-select v-model="selectedMinutes" :disabled="isRunning" placeholder="選擇分鐘" style="width: 100px;">
                <el-option v-for="m in 60" :key="'m' + m" :label="m - 1" :value="m - 1"/>
                </el-select>
            </el-form-item>
            <!-- 秒選擇器 -->
            <el-form-item label="秒:">
                <el-select v-model="selectedSeconds" :disabled="isRunning" placeholder="選擇秒" style="width: 100px;">
                <el-option v-for="s in 60" :key="'s' + s" :label="s - 1" :value="s - 1"/>
                </el-select>
            </el-form-item>
        </el-form>
        <el-button type="info" @click="getTrue()">確定</el-button>
    </div>                   
    <!-- 倒計(jì)時(shí)顯示 -->
    <div class="timer-display">
        <h1>{{ formattedTime }}</h1>
    </div>
    <!-- 操作按鈕 -->
    <div class="controls">
        <!-- 倒計(jì)時(shí)器 -->
        <el-button type="success" @click="startCountdown()" :disabled="isRunning">開(kāi)始</el-button>
        <el-button type="warning" @click="pauseCountdown()" :disabled="!isRunning">暫停</el-button>
        <el-button type="primary" @click="restartCountdown()">重新開(kāi)始</el-button>
        <el-button type="info" @click="nextProcess()">下一階段</el-button>
    </div>
</el-card>

 2.script:

(1)狀態(tài)變量:

// 選擇的倒計(jì)時(shí)初始值
const selectedHours = ref(0);
const selectedMinutes = ref(0);
const selectedSeconds = ref(0);
// 當(dāng)前剩余的倒計(jì)時(shí)時(shí)間,以秒為單位動(dòng)態(tài)更新
const totalSeconds = ref(0);
// 表示倒計(jì)時(shí)是否正在運(yùn)行,用來(lái)防止重復(fù)啟動(dòng)計(jì)時(shí)器
const isRunning = ref(false);
// 存儲(chǔ)定時(shí)器的句柄,用于管理 setInterval
let timer = null;

(2)格式化顯示時(shí)間:

// computed:這是一個(gè)計(jì)算屬性,動(dòng)態(tài)計(jì)算剩余時(shí)間的格式化顯示。
const formattedTime = computed(() => {
    const hours = Math.floor(totalSeconds.value / 3600);
    const minutes = Math.floor((totalSeconds.value % 3600) / 60);
    const seconds = totalSeconds.value % 60;
    // 返回格式用于倒計(jì)時(shí)器的顯示 hh:mm:ss
    return `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;
});

格式化邏輯

  • 小時(shí)Math.floor(totalSeconds.value / 3600),將總秒數(shù)除以3600得到小時(shí)數(shù)(向下取整)。
  • 分鐘:取余后計(jì)算分鐘數(shù):Math.floor((totalSeconds.value % 3600) / 60)。
  • 秒數(shù):取余后直接取 totalSeconds.value % 60。
  • 格式化:使用 padStart(2, '0') 保證個(gè)位數(shù)前補(bǔ) 0,顯示為兩位數(shù)。

 (3)初始化倒計(jì)時(shí):

// 將計(jì)算結(jié)果賦值給 totalSeconds,作為倒計(jì)時(shí)的起始值。
const initializeCountdown = () => {
    totalSeconds.value = selectedHours.value * 3600 + selectedMinutes.value * 60 + selectedSeconds.value;
};

(4)開(kāi)始按鈕startCountdown -> 啟動(dòng)倒計(jì)時(shí)器:

const startCountdown = () => {
    if (totalSeconds.value === 0) {
        initializeCountdown(); // 如果總秒數(shù)為0,重新初始化
    }
    // 通過(guò) isRunning 確保倒計(jì)時(shí)只能啟動(dòng)一次
    if (!isRunning.value) {
        isRunning.value = true;
        // 使用 setInterval 每秒執(zhí)行一次回調(diào)
        timer = setInterval(() => {
            if (totalSeconds.value > 0) {
                totalSeconds.value -= 1; // 每秒減1
            } else {
                // 調(diào)用 pauseCountdown 停止計(jì)時(shí)器
                pauseCountdown();
            }
        }, 1000);
    }
};

(5)暫停按鈕pauseCountdown -> 暫停倒計(jì)時(shí)器:

const pauseCountdown = () => {
    // 將 isRunning 設(shè)置為 false,標(biāo)記倒計(jì)時(shí)暫停
    isRunning.value = false;
    // 如果計(jì)時(shí)器已存在(timer 不為 null),調(diào)用 clearInterval 停止計(jì)時(shí)器,并將 timer 置空
    if (timer) {
        clearInterval(timer);
        timer = null;
    }
};

(6)重啟倒計(jì)時(shí)器restartCountdown -> 重新開(kāi)始倒計(jì)時(shí):

const restartCountdown = () => {
    // 停止當(dāng)前計(jì)時(shí)器
    pauseCountdown();
    // 重置 totalSeconds 為初始值
    initializeCountdown();
    // 重新啟動(dòng)倒計(jì)時(shí)
    startCountdown();
};

(7)確定按鈕 -> 修改倒計(jì)時(shí)時(shí)間:

// 停止當(dāng)前計(jì)時(shí)器,重新計(jì)算并設(shè)置倒計(jì)時(shí)總秒數(shù)
const getTrue = () => {
    pauseCountdown();
    initializeCountdown();
};

(8)頁(yè)面卸載時(shí)清理計(jì)時(shí)器(onUnMounted):

// 當(dāng)組件卸載時(shí)觸發(fā)
onUnmounted(() => {
    // 清理計(jì)時(shí)器,防止內(nèi)存泄漏
    if (timer) {
        clearInterval(timer);
    }
});

 3.css:

<style lang="css" scoped>
.countdown-timer {
    text-align: center;
    font-family: Arial, sans-serif;
}
.timer-display h1 {
    font-size: 48px;
    margin: 20px 0;
}
.controls button {
    margin: 5px;
    padding: 10px 20px;
    font-size: 16px;
}
select {
    margin: 5px;
    padding: 5px;
}
</style>

二.倒計(jì)時(shí)任務(wù)管理界面:

通過(guò)彈窗填寫任務(wù)名稱和時(shí)間(時(shí)、分、秒),并將任務(wù)提交到任務(wù)列表中。 

1.html:

<el-card>
    <!-- 倒計(jì)時(shí)時(shí)間選擇框 -->
    <el-button type="primary" @click="addTaskDialog()">創(chuàng)建任務(wù)</el-button>
    <!-- 任務(wù)隊(duì)列 -->
    <h3>任務(wù)隊(duì)列</h3>
    <el-table :data="timeTaskData" style="width: 100%" height="250">
        <el-table-column prop="name" label="任務(wù)名稱" width="120" />
        <el-table-column prop="time" label="倒計(jì)時(shí)間" width="120" />
        <el-table-column label="操作" width="100">
            <template #default="{ row }">
                <el-button type="success" @click="setCountdownTime(row)" :icon="Check" circle />
                <el-button type="danger" @click="deleteTimeTask(row)" :icon="Delete" circle />
            </template>
        </el-table-column>
    </el-table>
</el-card>
<!-- 任務(wù)創(chuàng)建彈窗 -->
<el-dialog v-model="taskDialogVisible" title="創(chuàng)建新任務(wù)" width="500" draggable>
    <el-form>
        <el-form-item label="任務(wù)名稱">
            <el-input v-model="newTask.name" placeholder="請(qǐng)輸入任務(wù)名稱" />
        </el-form-item>
        <el-form-item label="小時(shí)">
            <el-select v-model="newTask.hours" placeholder="選擇小時(shí)">
                <el-option :key="'h0'" :label="0" :value="0" /> <!-- 手動(dòng)添加 0 -->
                <el-option v-for="h in 24" :key="'h' + h" :label="h" :value="h" />
            </el-select>
        </el-form-item>
        <el-form-item label="分鐘">
            <el-select v-model="newTask.minutes" placeholder="選擇分鐘">
                <el-option :key="'m0'" :label="0" :value="0" /> <!-- 手動(dòng)添加 0 -->
                <el-option v-for="m in 60" :key="'m' + m" :label="m" :value="m" />
            </el-select>
        </el-form-item>
        <el-form-item label="秒">
            <el-select v-model="newTask.seconds" placeholder="選擇秒">
                <el-option :key="'s0'" :label="0" :value="0" /> <!-- 手動(dòng)添加 0 -->
                <el-option v-for="s in 60" :key="'s' + s" :label="s" :value="s" />
            </el-select>
        </el-form-item>
    </el-form>
    <template #footer>
        <div class="dialog-footer">
            <el-button @click="taskDialogVisible = false">取消</el-button>
            <el-button type="primary" @click="addTimeTask()">創(chuàng)建任務(wù)</el-button>
        </div>
    </template>
</el-dialog>

2.script:

// 用于控制彈窗的顯示和隱藏狀態(tài)
const taskDialogVisible = ref(false);
// 打開(kāi)彈窗
const addTaskDialog = () =>{
    taskDialogVisible.value = true;
    console.log('彈窗狀態(tài):', taskDialogVisible.value); // 調(diào)試日志
}
// 用于綁定用戶輸入的任務(wù)數(shù)據(jù)
const newTask = reactive({
    name: '', // 任務(wù)名稱
    // 用戶輸入的時(shí)、分、秒,表示任務(wù)的時(shí)間
    hours: '',
    minutes: '',
    seconds: ''
})
// 任務(wù)列表
const timeTaskData = ref([]);
const timeTask = reactive({
    name: "",
    time: null, // 任務(wù)時(shí)間,格式為 HH:mm:ss
    roomGroup : ""
});
// 清空 timeTask 中的任務(wù)數(shù)據(jù)
const cleantimeRask = () =>{
    timeTask.value = {
        name: "",
        time: null,
        roomGroup : ""
    };
}
const addTimeTask = async () =>{
    taskDialogVisible.value = false;
    // 使用用戶輸入的時(shí)、分、秒來(lái)設(shè)置時(shí)間
    const hours = parseInt(newTask.hours) || 0;
    const minutes = parseInt(newTask.minutes) || 0;
    const seconds = parseInt(newTask.seconds) || 0;
    // 將時(shí)間合并為 HH:mm:ss 格式
    const timeString = `${String(hours).padStart(2, "0")}:${String(minutes).padStart(2, "0")}:${String(seconds).padStart(2, "0")}`;
    // 設(shè)置任務(wù)數(shù)據(jù)
    timeTask.time = timeString; // 使用標(biāo)準(zhǔn)的 HH:mm:ss 格式
    // 從 userStore 獲取當(dāng)前用戶的分組
    timeTask.roomGroup = userStore.user.roomGroup;
    timeTask.name = newTask.name;
    if (timeTask.name !== '' && timeTask.time !== '') {
        await insertTimeTask(timeTask); // 插入任務(wù)(異步操作)
        ElMessage.success("任務(wù)添加成功");
        getTimeTaskByRGToShow(); // 更新任務(wù)列表
        console.log(timeTaskData.value);
        cleantimeRask(); // 清空當(dāng)前任務(wù)數(shù)據(jù)
    } else {
        ElMessage.error("任務(wù)名稱或時(shí)間不能為空");
    }
}
// 設(shè)置倒計(jì)時(shí)的時(shí)、分、秒
const setCountdownTime = (row) => {
    let date;
    if (row.time instanceof Date) {
        date = row.time; // 如果是 Date 對(duì)象,直接賦值
    } else if (typeof row.time === "string") {
        const [hours, minutes, seconds] = row.time.split(":").map(Number); // 按 HH:mm:ss 分割
        date = new Date(); // 使用當(dāng)前日期
        date.setHours(hours, minutes, seconds); // 設(shè)置時(shí)間
    } else {
        console.error("無(wú)效的時(shí)間格式");
        return;
    }
    selectedHours.value = date.getHours();      // 獲取小時(shí)
    selectedMinutes.value = date.getMinutes();  // 獲取分鐘
    selectedSeconds.value = date.getSeconds();  // 獲取秒數(shù)
    initializeCountdown(); // 更新總時(shí)間
};
// 刪除倒計(jì)時(shí)的任務(wù)
const deleteTimeTask = async (row) =>{
    await deleteTimeTaskById(row.id);
    ElMessage.success("任務(wù)刪除成功");
    getTimeTaskByRGToShow();
    console.log(timeTaskData.value);
};
// 根據(jù)組別獲取所有任務(wù)信息
const getTimeTaskByRGToShow = async () =>{
    let roomGroup = userStore.user.roomGroup;
    let result = await getTimeTaskByRG(roomGroup);
    timeTaskData.value = result.data;
}
getTimeTaskByRGToShow();

三.倒計(jì)時(shí)器完整代碼展示:

1.html:

<el-main style="background-color:darkgray">
    <div>
        <el-card>
            <!-- 倒計(jì)時(shí)時(shí)間選擇框 -->
            <el-button type="primary" @click="addTaskDialog()">創(chuàng)建任務(wù)</el-button>
            <!-- 任務(wù)隊(duì)列 -->
            <h3>任務(wù)隊(duì)列</h3>
            <el-table :data="timeTaskData" style="width: 100%" height="250">
                <el-table-column prop="name" label="任務(wù)名稱" width="120" />
                <el-table-column prop="time" label="倒計(jì)時(shí)間" width="120" />
                <el-table-column label="操作" width="100">
                    <template #default="{ row }">
                        <el-button type="success" @click="setCountdownTime(row)" :icon="Check" circle />
                        <el-button type="danger" @click="deleteTimeTask(row)" :icon="Delete" circle />
                    <!-- <el-button type="success" >開(kāi)始倒計(jì)時(shí)</el-button> -->
                    </template>
                </el-table-column>
            </el-table>
        </el-card>
    </div>
    <div class="countdown-timer">
        <el-card>
            <h2>倒計(jì)時(shí)器</h2>
            <!-- 倒計(jì)時(shí)時(shí)間選擇框 -->
            <div>
                <el-form inline>
                    <!-- 小時(shí)選擇器 -->
                    <el-form-item label="小時(shí):">
                        <el-select v-model="selectedHours" :disabled="isRunning" placeholder="選擇小時(shí)" style="width: 100px;">
                            <el-option v-for="h in 24" :key="'h' + h" :label="h - 1" :value="h - 1"/>
                        </el-select>
                    </el-form-item>
                    <!-- 分鐘選擇器 -->
                    <el-form-item label="分鐘:">
                        <el-select v-model="selectedMinutes" :disabled="isRunning" placeholder="選擇分鐘" style="width: 100px;">
                        <el-option v-for="m in 60" :key="'m' + m" :label="m - 1" :value="m - 1"/>
                        </el-select>
                    </el-form-item>
                    <!-- 秒選擇器 -->
                    <el-form-item label="秒:">
                        <el-select v-model="selectedSeconds" :disabled="isRunning" placeholder="選擇秒" style="width: 100px;">
                        <el-option v-for="s in 60" :key="'s' + s" :label="s - 1" :value="s - 1"/>
                        </el-select>
                    </el-form-item>
                </el-form>
                <el-button type="info" @click="getTrue()">確定</el-button>
            </div>                   
            <!-- 倒計(jì)時(shí)顯示 -->
            <div class="timer-display">
                <h1>{{ formattedTime }}</h1>
            </div>
            <!-- 操作按鈕 -->
            <div class="controls">
                <!-- 倒計(jì)時(shí)器 -->
                <el-button type="success" @click="startCountdown()" :disabled="isRunning">開(kāi)始</el-button>
                <el-button type="warning" @click="pauseCountdown()" :disabled="!isRunning">暫停</el-button>
                <el-button type="primary" @click="restartCountdown()">重新開(kāi)始</el-button>
                <el-button type="info" @click="nextProcess()">下一階段</el-button>
            </div>
        </el-card>
    </div>
</el-main>
<!-- 任務(wù)創(chuàng)建彈窗 -->
<el-dialog v-model="taskDialogVisible" title="創(chuàng)建新任務(wù)" width="500" draggable>
    <el-form>
        <el-form-item label="任務(wù)名稱">
            <el-input v-model="newTask.name" placeholder="請(qǐng)輸入任務(wù)名稱" />
        </el-form-item>
        <el-form-item label="小時(shí)">
            <el-select v-model="newTask.hours" placeholder="選擇小時(shí)">
                <el-option :key="'h0'" :label="0" :value="0" /> <!-- 手動(dòng)添加 0 -->
                <el-option v-for="h in 24" :key="'h' + h" :label="h" :value="h" />
            </el-select>
        </el-form-item>
        <el-form-item label="分鐘">
            <el-select v-model="newTask.minutes" placeholder="選擇分鐘">
                <el-option :key="'m0'" :label="0" :value="0" /> <!-- 手動(dòng)添加 0 -->
                <el-option v-for="m in 60" :key="'m' + m" :label="m" :value="m" />
            </el-select>
        </el-form-item>
        <el-form-item label="秒">
            <el-select v-model="newTask.seconds" placeholder="選擇秒">
                <el-option :key="'s0'" :label="0" :value="0" /> <!-- 手動(dòng)添加 0 -->
                <el-option v-for="s in 60" :key="'s' + s" :label="s" :value="s" />
            </el-select>
        </el-form-item>
    </el-form>
    <template #footer>
        <div class="dialog-footer">
            <el-button @click="taskDialogVisible = false">取消</el-button>
            <el-button type="primary" @click="addTimeTask()">創(chuàng)建任務(wù)</el-button>
        </div>
    </template>
</el-dialog>

2.script:

<script setup>
import { reactive, ref, computed, onUnmounted } from 'vue';
import {  Check,Delete,Star } from '@element-plus/icons-vue';
import { getCpByRG, insertByRG } from '@/api/competition';
import { getTimeTaskByRG,insertTimeTask,deleteTimeTaskById } from '@/api/timetask';
import { useUserStore } from '@/stores/user';
import { ElMessage } from 'element-plus';
const userStore = useUserStore();
// 彈窗組件
const taskDialogVisible = ref(false);
const addTaskDialog = () =>{
    taskDialogVisible.value = true;
    console.log('彈窗狀態(tài):', taskDialogVisible.value); // 調(diào)試日志
}
const newTask = reactive({
    name: '',
    hours: '',
    minutes: '',
    seconds: ''
})
const timeTaskData = ref([]);
const timeTask = reactive({
    name: "",
    time: null,
    roomGroup : ""
});
const cleantimeRask = () =>{
    timeTask.value = {
        name: "",
        time: null,
        roomGroup : ""
    };
}
const addTimeTask = async () =>{
    taskDialogVisible.value = false;
    // 用用戶輸入的時(shí)、分、秒來(lái)設(shè)置時(shí)間
    const hours = parseInt(newTask.hours) || 0;
    const minutes = parseInt(newTask.minutes) || 0;
    const seconds = parseInt(newTask.seconds) || 0;
    // 將時(shí)間合并為 HH:mm:ss 格式
    const timeString = `${String(hours).padStart(2, "0")}:${String(minutes).padStart(2, "0")}:${String(seconds).padStart(2, "0")}`;
    // 設(shè)置任務(wù)數(shù)據(jù)
    timeTask.time = timeString; // 使用標(biāo)準(zhǔn)的 HH:mm:ss 格式
    timeTask.roomGroup = userStore.user.roomGroup;
    timeTask.name = newTask.name;
    if (timeTask.name !== '' && timeTask.time !== '') {
        await insertTimeTask(timeTask);
        ElMessage.success("任務(wù)添加成功");
        getTimeTaskByRGToShow();
        console.log(timeTaskData.value);
        cleantimeRask();
    } else {
        ElMessage.error("任務(wù)名稱或時(shí)間不能為空");
    }
}
// 設(shè)置倒計(jì)時(shí)的時(shí)、分、秒
const setCountdownTime = (row) => {
    let date;
    if (row.time instanceof Date) {
        date = row.time; // 如果是 Date 對(duì)象,直接賦值
    } else if (typeof row.time === "string") {
        const [hours, minutes, seconds] = row.time.split(":").map(Number); // 按 HH:mm:ss 分割
        date = new Date(); // 使用當(dāng)前日期
        date.setHours(hours, minutes, seconds); // 設(shè)置時(shí)間
    } else {
        console.error("無(wú)效的時(shí)間格式");
        return;
    }
    selectedHours.value = date.getHours();      // 獲取小時(shí)
    selectedMinutes.value = date.getMinutes();  // 獲取分鐘
    selectedSeconds.value = date.getSeconds();  // 獲取秒數(shù)
    initializeCountdown(); // 更新總時(shí)間
};
// 刪除倒計(jì)時(shí)的任務(wù)
const deleteTimeTask = async (row) =>{
    await deleteTimeTaskById(row.id);
    ElMessage.success("任務(wù)刪除成功");
    getTimeTaskByRGToShow();
    console.log(timeTaskData.value);
};
// 根據(jù)組別獲取所有任務(wù)信息
const getTimeTaskByRGToShow = async () =>{
    let roomGroup = userStore.user.roomGroup;
    let result = await getTimeTaskByRG(roomGroup);
    timeTaskData.value = result.data;
}
getTimeTaskByRGToShow();
/
// 倒計(jì)時(shí)器
// 選擇的倒計(jì)時(shí)初始值
const selectedHours = ref(0);
const selectedMinutes = ref(0);
const selectedSeconds = ref(0);
// 當(dāng)前倒計(jì)時(shí)時(shí)間(以秒為單位)
const totalSeconds = ref(0);
const isRunning = ref(false);
let timer = null;
// 格式化顯示的時(shí)間
const formattedTime = computed(() => {
    const hours = Math.floor(totalSeconds.value / 3600);
    const minutes = Math.floor((totalSeconds.value % 3600) / 60);
    const seconds = totalSeconds.value % 60;
    return `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;
});
// 初始化倒計(jì)時(shí)
const initializeCountdown = () => {
    totalSeconds.value = selectedHours.value * 3600 + selectedMinutes.value * 60 + selectedSeconds.value;
};
// 開(kāi)始倒計(jì)時(shí)
const startCountdown = () => {
    // 如果當(dāng)前總秒數(shù)為 0,自動(dòng)初始化倒計(jì)時(shí)
    if (totalSeconds.value === 0) {
        initializeCountdown();
    }
    if (!isRunning.value) {
        isRunning.value = true;
        playSound('start'); // 播放開(kāi)始音效
        timer = setInterval(() => {
            if (totalSeconds.value > 0) {
                totalSeconds.value -= 1;
            } else {
                pauseCountdown();
                playSound('end'); // 倒計(jì)時(shí)結(jié)束時(shí)播放音效
            }
        }, 1000);
    }
};
// 暫停倒計(jì)時(shí)
const pauseCountdown = () => {
    isRunning.value = false;
    playSound('pause'); // 播放暫停音效
    if (timer) {
        clearInterval(timer);
        timer = null;
    }
};
// 重新開(kāi)始倒計(jì)時(shí)
const restartCountdown = () => {
    pauseCountdown();
    initializeCountdown();
    playSound('reset'); // 播放重置音效
    startCountdown();
};
// 確定修改倒計(jì)時(shí)時(shí)間
const getTrue = () => {
    pauseCountdown();
    initializeCountdown();
};
// 頁(yè)面卸載時(shí)清理計(jì)時(shí)器
onUnmounted(() => {
    if (timer) {
    clearInterval(timer);
    }
});
</script>

3.css:

<style lang="css" scoped>
.countdown-timer {
    text-align: center;
    font-family: Arial, sans-serif;
}
.timer-display h1 {
    font-size: 48px;
    margin: 20px 0;
}
.controls button {
    margin: 5px;
    padding: 10px 20px;
    font-size: 16px;
}
select {
    margin: 5px;
    padding: 5px;
}
</style>

到此這篇關(guān)于使用Vue3來(lái)實(shí)現(xiàn)一個(gè)倒計(jì)時(shí)器以及倒計(jì)時(shí)任務(wù)的文章就介紹到這了,更多相關(guān)vue3倒計(jì)時(shí)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue+flask實(shí)現(xiàn)視頻合成功能(拖拽上傳)

    vue+flask實(shí)現(xiàn)視頻合成功能(拖拽上傳)

    這篇文章主要介紹了vue+flask實(shí)現(xiàn)視頻合成功能(拖拽上傳),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • Vite打包優(yōu)化之縮小打包體積實(shí)現(xiàn)詳解

    Vite打包優(yōu)化之縮小打包體積實(shí)現(xiàn)詳解

    這篇文章主要為大家介紹了使用Vite縮小打包體積如何實(shí)現(xiàn)的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • 用vue構(gòu)建多頁(yè)面應(yīng)用的示例代碼

    用vue構(gòu)建多頁(yè)面應(yīng)用的示例代碼

    這篇文章主要介紹了用vue構(gòu)建多頁(yè)面應(yīng)用的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • Vue引入ElementUI并使用的詳細(xì)過(guò)程

    Vue引入ElementUI并使用的詳細(xì)過(guò)程

    Element UI是一個(gè)基于Vue 2.0的桌面端組件庫(kù),旨在構(gòu)建簡(jiǎn)潔、快速的用戶界面,這篇文章主要介紹了Vue如何引入ElementUI并使用,需要的朋友可以參考下
    2024-06-06
  • Vue.js實(shí)現(xiàn)日歷功能

    Vue.js實(shí)現(xiàn)日歷功能

    這篇文章主要為大家詳細(xì)介紹了Vue.js實(shí)現(xiàn)日歷功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • vue+canvas繪制時(shí)間軸的方法

    vue+canvas繪制時(shí)間軸的方法

    這篇文章主要為大家詳細(xì)介紹了vue+canvas繪制時(shí)間軸的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 關(guān)于怎么在vue項(xiàng)目里寫react詳情

    關(guān)于怎么在vue項(xiàng)目里寫react詳情

    本篇文章是在vue項(xiàng)目里寫tsx的一篇介紹。其實(shí)vue里面寫jsx也挺有意思的,接下來(lái)小編九給大家詳細(xì)介紹吧,感興趣的小伙伴請(qǐng)參考下面的文章內(nèi)容
    2021-09-09
  • vue安裝vue-router出錯(cuò)問(wèn)題及解決

    vue安裝vue-router出錯(cuò)問(wèn)題及解決

    這篇文章主要介紹了vue安裝vue-router出錯(cuò)問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • Vue中key的原理以及diff算法詳解

    Vue中key的原理以及diff算法詳解

    這篇文章主要介紹了Vue中key的原理以及diff算法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • 詳解vue組件之間相互傳值的方式

    詳解vue組件之間相互傳值的方式

    這篇文章主要介紹了vue組件之間相互傳值的方式,對(duì)vue感興趣的同學(xué),可以參考下
    2021-05-05

最新評(píng)論