|
|
@@ -1,6 +1,6 @@
|
|
|
<template>
|
|
|
- <div v-if="visible" class="play-prompt-overlay">
|
|
|
- <div class="play-prompt-container">
|
|
|
+ <div v-if="visible" class="play-prompt-overlay" @click="handleClose">
|
|
|
+ <div class="play-prompt-container" @click.stop>
|
|
|
<button class="close-button" @click="handleClose">× 取消</button>
|
|
|
<h3 class="prompt-title">即将跳转下一节</h3>
|
|
|
<div class="countdown-container">
|
|
|
@@ -17,68 +17,78 @@ import { ref, onMounted, onUnmounted, watch } from 'vue'
|
|
|
|
|
|
const props = defineProps({
|
|
|
visible: {
|
|
|
- type: Boolean,
|
|
|
- default: false
|
|
|
+ type: Boolean, // 弹窗是否可见
|
|
|
+ default: false // 默认不可见
|
|
|
},
|
|
|
duration: {
|
|
|
- type: Number,
|
|
|
- default: 5
|
|
|
- },
|
|
|
- message: {
|
|
|
- type: String,
|
|
|
- // default: '准备好开始下一节了吗?'
|
|
|
+ type: Number, // 倒计时持续时间
|
|
|
+ default: 5 // 默认5秒
|
|
|
}
|
|
|
})
|
|
|
|
|
|
const emit = defineEmits(['countdownEnd', 'close'])
|
|
|
|
|
|
+// 倒计时秒数,初始值为props.duration
|
|
|
const countdown = ref(props.duration)
|
|
|
+// 存储倒计时实例
|
|
|
let countdownTimer = null
|
|
|
|
|
|
const handleClose = () => {
|
|
|
- stopCountdown()
|
|
|
+ // 停止倒计时
|
|
|
+ stopCountdown()
|
|
|
+ // 触发关闭事件
|
|
|
emit('close')
|
|
|
}
|
|
|
|
|
|
const startCountdown = () => {
|
|
|
+ // 重置倒计时为初始值
|
|
|
countdown.value = props.duration
|
|
|
|
|
|
if (countdownTimer) {
|
|
|
+ // 如果已有计时器在运行, 清除之前的计时器
|
|
|
clearInterval(countdownTimer)
|
|
|
}
|
|
|
-
|
|
|
+ // 创建新的计时器,每秒执行一次
|
|
|
countdownTimer = setInterval(() => {
|
|
|
+ // 倒计时减1
|
|
|
countdown.value--
|
|
|
-
|
|
|
if (countdown.value <= 0) {
|
|
|
+ // 当倒计时结束时,清除计时器
|
|
|
clearInterval(countdownTimer)
|
|
|
+ // 触发倒计时结束事件
|
|
|
emit('countdownEnd')
|
|
|
}
|
|
|
}, 1000)
|
|
|
}
|
|
|
|
|
|
const stopCountdown = () => {
|
|
|
+ // 如果倒计时存在,清除计时器
|
|
|
if (countdownTimer) {
|
|
|
clearInterval(countdownTimer)
|
|
|
+ // 重置计时器变量为null
|
|
|
countdownTimer = null
|
|
|
}
|
|
|
}
|
|
|
|
|
|
watch(() => props.visible, (newVisible) => {
|
|
|
+ // 当弹窗显示时,启动倒计时
|
|
|
if (newVisible) {
|
|
|
- startCountdown()
|
|
|
+ startCountdown()
|
|
|
} else {
|
|
|
+ // 当弹窗隐藏时,停止倒计时
|
|
|
stopCountdown()
|
|
|
}
|
|
|
})
|
|
|
|
|
|
onMounted(() => {
|
|
|
+ // 如果弹窗初始状态就是显示的,启动倒计时
|
|
|
if (props.visible) {
|
|
|
startCountdown()
|
|
|
}
|
|
|
})
|
|
|
|
|
|
onUnmounted(() => {
|
|
|
+ // 组件卸载时清除计时器
|
|
|
stopCountdown()
|
|
|
})
|
|
|
</script>
|
|
|
@@ -103,6 +113,7 @@ onUnmounted(() => {
|
|
|
align-items: flex-start;
|
|
|
padding-top: rpx(10);
|
|
|
z-index: 9999;
|
|
|
+ pointer-events: auto;
|
|
|
}
|
|
|
|
|
|
.play-prompt-container {
|
|
|
@@ -117,6 +128,7 @@ onUnmounted(() => {
|
|
|
max-width: 80%;
|
|
|
animation: fadeInScale 0.5s ease-out;
|
|
|
position: relative;
|
|
|
+ pointer-events: auto;
|
|
|
}
|
|
|
|
|
|
.close-button {
|