♻️ emits 替代 interval

This commit is contained in:
目棃
2024-01-26 18:17:26 +08:00
parent 3ee9bf74f1
commit 3b55ddfc5c
4 changed files with 49 additions and 74 deletions

View File

@@ -83,9 +83,6 @@ import { generateShareImg } from "../../utils/TGShare";
import TibCalendarItem from "../itembox/tib-calendar-item.vue"; import TibCalendarItem from "../itembox/tib-calendar-item.vue";
import ToCalendar from "../overlay/to-calendar.vue"; import ToCalendar from "../overlay/to-calendar.vue";
// loading
const loading = ref<boolean>(true);
// data // data
const calendarData = computed<TGApp.App.Calendar.Item[]>(() => AppCalendarData); const calendarData = computed<TGApp.App.Calendar.Item[]>(() => AppCalendarData);
const weekNow = ref<number>(0); const weekNow = ref<number>(0);
@@ -141,11 +138,11 @@ const btnText = [
}, },
]; ];
// expose interface TCalendarEmits {
defineExpose({ (e: "success"): void;
name: "素材日历", }
loading,
}); const emits = defineEmits<TCalendarEmits>();
onMounted(async () => { onMounted(async () => {
const appStore = useAppStore(); const appStore = useAppStore();
@@ -173,7 +170,7 @@ onMounted(async () => {
calendarNow.value = getCalendar(dayNow); calendarNow.value = getCalendar(dayNow);
characterCards.value = calendarNow.value.filter((item) => item.itemType === "character"); characterCards.value = calendarNow.value.filter((item) => item.itemType === "character");
weaponCards.value = calendarNow.value.filter((item) => item.itemType === "weapon"); weaponCards.value = calendarNow.value.filter((item) => item.itemType === "weapon");
loading.value = false; emits("success");
}); });
// 获取当前日历 // 获取当前日历

View File

@@ -16,7 +16,7 @@
/> />
</div> </div>
</div> </div>
<div v-if="!loading" class="pool-grid"> <div class="pool-grid">
<div v-for="pool in poolSelect" :key="pool.postId" class="pool-card"> <div v-for="pool in poolSelect" :key="pool.postId" class="pool-card">
<div class="pool-cover" @click="createPost(pool.postId, pool.title)"> <div class="pool-cover" @click="createPost(pool.postId, pool.title)">
<img :src="pool.cover" alt="cover" /> <img :src="pool.cover" alt="cover" />
@@ -68,9 +68,6 @@ import showSnackbar from "../func/snackbar";
// store // store
const homeStore = useHomeStore(); const homeStore = useHomeStore();
// loading
const loading = ref<boolean>(true);
const hasNew = ref<boolean>(false); const hasNew = ref<boolean>(false);
const showNew = ref<boolean>(false); const showNew = ref<boolean>(false);
@@ -81,8 +78,11 @@ const poolTimeGet = ref<Record<number, string>>({});
const poolTimePass = ref<Record<number, number>>({}); const poolTimePass = ref<Record<number, number>>({});
const timer = ref<Record<number, any>>({}); const timer = ref<Record<number, any>>({});
// expose interface TPoolEmits {
defineExpose({ name: "限时祈愿", loading }); (e: "success"): void;
}
const emits = defineEmits<TPoolEmits>();
function poolLastInterval(postId: number): TGApp.Plugins.Mys.Gacha.RenderCard | undefined { function poolLastInterval(postId: number): TGApp.Plugins.Mys.Gacha.RenderCard | undefined {
const pool = poolCards.value.find((pool) => pool.postId === postId); const pool = poolCards.value.find((pool) => pool.postId === postId);
@@ -152,7 +152,7 @@ onMounted(async () => {
poolSelect.value = poolCards.value; poolSelect.value = poolCards.value;
hasNew.value = false; hasNew.value = false;
} }
loading.value = false; emits("success");
}); });
// 检测新卡池 // 检测新卡池

View File

@@ -4,7 +4,7 @@
<img src="../../assets/icons/board.svg" alt="act" /> <img src="../../assets/icons/board.svg" alt="act" />
<span>近期活动</span> <span>近期活动</span>
</div> </div>
<div v-if="!loading" class="position-grid"> <div class="position-grid">
<v-card <v-card
v-for="card in positionCards" v-for="card in positionCards"
:key="card.postId" :key="card.postId"
@@ -50,20 +50,17 @@ import Mys from "../../plugins/Mys";
import { createPost } from "../../utils/TGWindow"; import { createPost } from "../../utils/TGWindow";
import { stamp2LastTime } from "../../utils/toolFunc"; import { stamp2LastTime } from "../../utils/toolFunc";
// loading
const loading = ref<boolean>(true);
// data // data
const positionCards = ref<TGApp.Plugins.Mys.Position.RenderCard[]>([]); const positionCards = ref<TGApp.Plugins.Mys.Position.RenderCard[]>([]);
const positionTimeGet = ref<Record<number, string>>({}); // 剩余时间/已结束/未知 const positionTimeGet = ref<Record<number, string>>({}); // 剩余时间/已结束/未知
const positionTimeEnd = ref<Record<number, number>>({}); // 结束时间戳 const positionTimeEnd = ref<Record<number, number>>({}); // 结束时间戳
const positionTimer = ref<Record<number, any>>({}); // 定时器 const positionTimer = ref<Record<number, any>>({}); // 定时器
// expose interface TPositionEmits {
defineExpose({ (e: "success"): void;
name: "近期活动", }
loading,
}); const emits = defineEmits<TPositionEmits>();
function positionLastInterval(postId: number): void { function positionLastInterval(postId: number): void {
const timeGet = positionTimeGet.value[postId]; const timeGet = positionTimeGet.value[postId];
@@ -98,7 +95,7 @@ onMounted(async () => {
positionLastInterval(card.postId); positionLastInterval(card.postId);
}, 1000); }, 1000);
}); });
loading.value = false; emits("success");
}); });
onUnmounted(() => { onUnmounted(() => {

View File

@@ -12,12 +12,12 @@
/> />
<v-btn class="select-btn" @click="submitHome">确定</v-btn> <v-btn class="select-btn" @click="submitHome">确定</v-btn>
</div> </div>
<component :is="item" v-for="item in components" :key="item" :ref="setItemRef" /> <component :is="item" v-for="item in components" :key="item" @success="loadEnd(item)" />
</div> </div>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { markRaw, onMounted, onUnmounted, onUpdated, ref } from "vue"; import { onMounted, onUnmounted, ref, shallowRef } from "vue";
import showSnackbar from "../../components/func/snackbar"; import showSnackbar from "../../components/func/snackbar";
import TCalendar from "../../components/home/t-calendar.vue"; import TCalendar from "../../components/home/t-calendar.vue";
@@ -38,29 +38,10 @@ const loadingTitle = ref<string>("正在加载首页");
const loadingSubtitle = ref<string>(""); const loadingSubtitle = ref<string>("");
// data // data
const components = ref<any[]>([]); const endNum = ref<number>(0);
const itemRefs = ref<any[]>([]); const components = shallowRef<any[]>([]);
const showHome = ref<string[]>(homeStore.getShowValue()); const showHome = ref<string[]>(homeStore.getShowValue());
// 定时器
const timer = ref<any>(null);
function setItemRef(item: any): void {
if (itemRefs.value.includes(item)) return;
itemRefs.value.push(item);
}
function readLoading(): void {
if (!loading.value) return;
let loadingMap = itemRefs.value.map((item) => {
return item.loading ? item.name : null;
});
loadingSubtitle.value = "正在加载 " + loadingMap.filter((item) => item)?.join("、");
if (loadingMap.every((item) => !item)) {
loading.value = false;
}
}
onMounted(async () => { onMounted(async () => {
loadingTitle.value = "正在加载首页"; loadingTitle.value = "正在加载首页";
const isProdEnv = import.meta.env.MODE === "production"; const isProdEnv = import.meta.env.MODE === "production";
@@ -68,27 +49,29 @@ onMounted(async () => {
if (isProdEnv && appStore.devMode) { if (isProdEnv && appStore.devMode) {
appStore.devMode = false; appStore.devMode = false;
} }
await Promise.allSettled( const temp = [];
showHome.value.map((item) => { for (const item of showHome.value) {
switch (item) { switch (item) {
case "限时祈愿": case "限时祈愿":
return components.value.push(markRaw(TPool)); temp.push(TPool);
case "近期活动": break;
return components.value.push(markRaw(TPosition)); case "近期活动":
case "素材日历": temp.push(TPosition);
return components.value.push(markRaw(TCalendar)); break;
default: case "素材日历":
return null; temp.push(TCalendar);
} break;
}), default:
); break;
timer.value = setInterval(readLoading, 100); }
}
const items = showHome.value.join("、"); const items = showHome.value.join("、");
loadingSubtitle.value = `正在加载:${items}`;
components.value = temp;
await TGLogger.Info(`[Home][onMounted] 打开首页,当前显示:${items}`); await TGLogger.Info(`[Home][onMounted] 打开首页,当前显示:${items}`);
}); });
async function submitHome(): Promise<void> { async function submitHome(): Promise<void> {
// 获取已选
const show = showHome.value; const show = showHome.value;
if (show.length < 1) { if (show.length < 1) {
showSnackbar({ showSnackbar({
@@ -108,19 +91,17 @@ async function submitHome(): Promise<void> {
}, 1000); }, 1000);
} }
// 监听定时器 // 组件加载完成
onUpdated(async () => { async function loadEnd(item: any): Promise<void> {
if (!loading.value && timer.value !== null) { await TGLogger.Info(`[Home][loadEnd] ${item.__name} 加载完成`);
clearInterval(timer.value); endNum.value++;
timer.value = null; if (endNum.value === components.value.length) {
loading.value = false;
} }
}); }
onUnmounted(() => { onUnmounted(() => {
itemRefs.value = [];
components.value = []; components.value = [];
clearInterval(timer.value);
timer.value = null;
}); });
</script> </script>
<style lang="css" scoped> <style lang="css" scoped>