使用Vue3實(shí)現(xiàn)倒計(jì)時(shí)器及倒計(jì)時(shí)任務(wù)的完整代碼
本內(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)文章希望大家以后多多支持腳本之家!
- Vue3實(shí)現(xiàn)獲取驗(yàn)證碼按鈕倒計(jì)時(shí)效果
- Vue3動(dòng)態(tài)倒計(jì)時(shí)的代碼實(shí)現(xiàn)
- Vue3+Hooks實(shí)現(xiàn)4位隨機(jī)數(shù)和60秒倒計(jì)時(shí)的示例代碼
- vue3實(shí)現(xiàn)封裝時(shí)間計(jì)算-日期倒計(jì)時(shí)組件-還有XX天&第XX天
- 基于Vue3創(chuàng)建一個(gè)簡(jiǎn)單的倒計(jì)時(shí)組件
- vue3發(fā)送驗(yàn)證碼倒計(jì)時(shí)功能的實(shí)現(xiàn)(防止連點(diǎn)、封裝復(fù)用)
- Vue3?實(shí)現(xiàn)驗(yàn)證碼倒計(jì)時(shí)功能
- Vue3?實(shí)現(xiàn)驗(yàn)證碼倒計(jì)時(shí)功能(刷新保持狀態(tài))
相關(guān)文章
vue+flask實(shí)現(xiàn)視頻合成功能(拖拽上傳)
這篇文章主要介紹了vue+flask實(shí)現(xiàn)視頻合成功能(拖拽上傳),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03Vite打包優(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)用的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09Vue引入ElementUI并使用的詳細(xì)過(guò)程
Element UI是一個(gè)基于Vue 2.0的桌面端組件庫(kù),旨在構(gòu)建簡(jiǎn)潔、快速的用戶界面,這篇文章主要介紹了Vue如何引入ElementUI并使用,需要的朋友可以參考下2024-06-06關(guān)于怎么在vue項(xiàng)目里寫react詳情
本篇文章是在vue項(xiàng)目里寫tsx的一篇介紹。其實(shí)vue里面寫jsx也挺有意思的,接下來(lái)小編九給大家詳細(xì)介紹吧,感興趣的小伙伴請(qǐng)參考下面的文章內(nèi)容2021-09-09vue安裝vue-router出錯(cuò)問(wèn)題及解決
這篇文章主要介紹了vue安裝vue-router出錯(cuò)問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03