pref: 进度条倒计时
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
<script setup>
|
||||
import { ref, watch, onMounted, onBeforeUnmount } from "vue";
|
||||
import { RoundGoldImages } from "@/constants";
|
||||
import {ref, watch, onMounted, onBeforeUnmount} from "vue";
|
||||
import {RoundGoldImages} from "@/constants";
|
||||
|
||||
const props = defineProps({
|
||||
tips: {
|
||||
type: String,
|
||||
@@ -19,13 +20,26 @@ const props = defineProps({
|
||||
const barColor = ref("");
|
||||
const remain = ref(15);
|
||||
const timer = ref(null);
|
||||
const laoding = ref(false);
|
||||
const loading = ref(false);
|
||||
const transitionStyle = ref("all 1s linear");
|
||||
const currentTeam = ref(null);
|
||||
|
||||
const updateRemain = (value) => {
|
||||
if (timer.value) clearInterval(timer.value);
|
||||
const newVal = Math.round(value);
|
||||
|
||||
if (value.stop) {
|
||||
if (timer.value) clearInterval(timer.value);
|
||||
return
|
||||
}
|
||||
loading.value = false;
|
||||
currentTeam.value = value.team
|
||||
if (value.team === 'red')
|
||||
barColor.value = "linear-gradient( 180deg, #FFA0A0 0%, #FF6060 100%)";
|
||||
if (value.team === 'blue')
|
||||
barColor.value = "linear-gradient( 180deg, #9AB3FF 0%, #4288FF 100%)";
|
||||
if (value.reset) {
|
||||
remain.value = value.value;
|
||||
return;
|
||||
}
|
||||
const newVal = Math.round(value.value);
|
||||
// 如果剩余时间增加(如轮次切换重置),瞬间变化无动画;否则保持动画
|
||||
if (newVal >= remain.value) {
|
||||
transitionStyle.value = "none";
|
||||
@@ -36,28 +50,21 @@ const updateRemain = (value) => {
|
||||
} else {
|
||||
remain.value = newVal;
|
||||
}
|
||||
|
||||
|
||||
timer.value = setInterval(() => {
|
||||
laoding.value = remain.value === 0;
|
||||
loading.value = remain.value === 0;
|
||||
if (remain.value > 0) remain.value--;
|
||||
}, 1000);
|
||||
};
|
||||
|
||||
watch(
|
||||
() => props.tips,
|
||||
(newVal) => {
|
||||
if (newVal.includes("红队"))
|
||||
barColor.value = "linear-gradient( 180deg, #FFA0A0 0%, #FF6060 100%)";
|
||||
if (newVal.includes("蓝队"))
|
||||
barColor.value = "linear-gradient( 180deg, #9AB3FF 0%, #4288FF 100%)";
|
||||
if (newVal.includes("重回")) return;
|
||||
if (newVal.includes("红队") || newVal.includes("蓝队")) {
|
||||
updateRemain(props.total);
|
||||
() => props.tips,
|
||||
(newVal) => {
|
||||
|
||||
},
|
||||
{
|
||||
immediate: true,
|
||||
}
|
||||
},
|
||||
{
|
||||
immediate: true,
|
||||
}
|
||||
);
|
||||
|
||||
onMounted(() => {
|
||||
@@ -72,21 +79,21 @@ onBeforeUnmount(() => {
|
||||
|
||||
<template>
|
||||
<view class="container">
|
||||
<image :src="RoundGoldImages[props.currentRound]" mode="widthFix" />
|
||||
<image :src="RoundGoldImages[props.currentRound]" mode="widthFix"/>
|
||||
<view
|
||||
:style="{
|
||||
justifyContent: tips.includes('红队') ? 'flex-end' : 'flex-start',
|
||||
:style="{
|
||||
justifyContent: currentTeam==='red' ? 'flex-end' : 'flex-start',
|
||||
}"
|
||||
>
|
||||
<view
|
||||
:style="{
|
||||
:style="{
|
||||
width: `${(remain / total) * 100}%`,
|
||||
background: barColor,
|
||||
right: tips.includes('红队') ? 0 : 'unset',
|
||||
right: currentTeam==='red' ? 0 : 'unset',
|
||||
transition: transitionStyle,
|
||||
}"
|
||||
/>
|
||||
<text v-if="!laoding">剩余{{ remain }}秒</text>
|
||||
<text v-if="!loading">剩余{{ remain }}秒</text>
|
||||
<text v-else>···</text>
|
||||
</view>
|
||||
</view>
|
||||
@@ -99,11 +106,13 @@ onBeforeUnmount(() => {
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.container > image {
|
||||
width: 380rpx;
|
||||
height: 80rpx;
|
||||
transform: translateY(18rpx);
|
||||
}
|
||||
|
||||
.container > view:last-child {
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
@@ -115,10 +124,12 @@ onBeforeUnmount(() => {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.container > view:last-child > view {
|
||||
height: 24rpx;
|
||||
border-radius: 15px;
|
||||
}
|
||||
|
||||
.container > view:last-child > text {
|
||||
font-size: 18rpx;
|
||||
color: #fff;
|
||||
|
||||
Reference in New Issue
Block a user