uniapp+Vue實(shí)現(xiàn)App端用戶每日彈出簽到彈窗功能
需求:
- 后端提供接口返回用戶簽到信息。
- 應(yīng)用啟動(dòng)或重新展示時(shí),若用戶未簽到,需要彈出簽到彈窗;已簽到則不彈。
- 簽到成功后自動(dòng)關(guān)閉彈窗。
思路:
- 用
App.vue的onShow生命周期做全局判斷,確保在任意頁(yè)面激活時(shí)都能檢查簽到狀態(tài)。 - 在簽到彈窗頁(yè)
pages/checkIn/checkIn.vue中負(fù)責(zé): 拉取簽到詳情、渲染獎(jiǎng)勵(lì)列表、調(diào)用簽到接口并在成功后自動(dòng)關(guān)閉。
實(shí)現(xiàn)步驟:
- 封裝接口調(diào)用方法
// 獲取簽到信息
getSigninInfoApi(data) {
return http.get("/api/sign_in/info", { params: data || {} });
},
// 執(zhí)行簽到
signInApi(data) {
return http.post("/api/sign_in/sign", { data: data || {} });
},
- 全局入口檢查簽到狀態(tài) (App.vue)
import { loginApi } from '@/api/login.js';
const checkSigninStatus = async () => {
// Step 1. 檢查 token 是否存在,沒有登錄用戶不觸發(fā)簽到邏輯
const token = uni.getStorageSync('token');
if (!token) return;
try {
// Step 2. 請(qǐng)求簽到狀態(tài)接口
const res = await loginApi.getSigninInfoApi({});
if (res?.code !== 1) return; // 接口異常直接退出
const hasSignedToday = !!res?.data?.is_signed_today;
if (hasSignedToday) return; // 已簽到則不彈窗
// Step 3. 打開簽到彈窗(防止重復(fù)跳轉(zhuǎn))
const openPopup = () => {
const pages = getCurrentPages();
const currentPage = pages[pages.length - 1];
if (!currentPage || currentPage.route === 'pages/checkIn/checkIn') return;
// 輕微延遲防止路由沖突
uni.navigateTo({
url: '/pages/checkIn/checkIn'
});
};
setTimeout(openPopup, 300);
} catch (e) {
console.error('檢查簽到狀態(tài)失敗:', e);
}
};
// 在 App.vue 的 onShow 生命周期中觸發(fā)
onShow(() => {
checkSigninStatus();
});
- 簽到彈窗邏輯 (pages/checkIn/checkIn.vue)
- 頁(yè)面加載時(shí)展示簽到按鈕。
- 點(diǎn)擊“簽到”后調(diào)用
loginApi.signInApi()。 - 簽到成功后彈出提示并自動(dòng)關(guān)閉彈窗。
// pages/checkIn/checkIn.vue
import { loginApi } from '@/api/login.js';
const loading = ref(false); // 按鈕加載狀態(tài)
const isSignedToday = ref(false); // 是否已簽到
// 頁(yè)面加載時(shí)拉取簽到狀態(tài)
onShow(async () => {
const res = await loginApi.getSigninInfoApi({});
if (res?.code === 1) {
isSignedToday.value = !!res.data.is_signed_today;
}
});
// 點(diǎn)擊“立即簽到”按鈕
const handleSignIn = async () => {
if (loading.value) return;
loading.value = true;
try {
const res = await loginApi.signInApi({});
if (res?.code === 1) {
uni.showToast({
title: '簽到成功',
icon: 'success'
});
// 延遲關(guān)閉彈窗
setTimeout(() => {
uni.navigateBack(); // 返回上一個(gè)頁(yè)面(即關(guān)閉彈窗)
}, 800);
} else {
uni.showToast({
title: res?.msg || '簽到失敗,請(qǐng)稍后再試',
icon: 'none'
});
}
} catch (err) {
console.error('簽到請(qǐng)求失敗:', err);
uni.showToast({
title: '網(wǎng)絡(luò)異常,請(qǐng)稍后再試',
icon: 'none'
});
} finally {
loading.value = false;
}
};
總結(jié)
到此這篇關(guān)于uniapp+Vue實(shí)現(xiàn)App端用戶每日彈出簽到彈窗功能的文章就介紹到這了,更多相關(guān)App端用戶每日彈出簽到彈窗內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue+elementUI實(shí)現(xiàn)簡(jiǎn)單日歷功能
這篇文章主要為大家詳細(xì)介紹了vue+elementUI實(shí)現(xiàn)簡(jiǎn)單日歷功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-09-09
vue3利用store實(shí)現(xiàn)記錄滾動(dòng)位置的示例
這篇文章主要介紹了vue3利用store實(shí)現(xiàn)記錄滾動(dòng)位置的示例,幫助大家更好的理解和學(xué)習(xí)使用vue框架,感興趣的朋友可以了解下2021-04-04
Vue3.0實(shí)現(xiàn)無(wú)限級(jí)菜單
這篇文章主要為大家詳細(xì)介紹了基于Vue3.0實(shí)現(xiàn)無(wú)限級(jí)菜單,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07
vue3實(shí)現(xiàn)對(duì)自定義組件自由拖動(dòng)效果
在數(shù)據(jù)可視化看板開發(fā)中,組件的自由拖拽功能能極大提升交互體驗(yàn),本文將基于Vue3生態(tài),從零開始解析如何實(shí)現(xiàn)一個(gè)支持自由拖拽的容器組件,感興趣的朋友一起看看吧2025-04-04
vue 獲取到數(shù)據(jù)但卻渲染不到頁(yè)面上的解決方法
這篇文章主要介紹了vue 獲取到數(shù)據(jù)但卻渲染不到頁(yè)面上的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
vue-router的beforeRouteUpdate不觸發(fā)問(wèn)題
這篇文章主要介紹了vue-router的beforeRouteUpdate不觸發(fā)問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04
vue中插件和組件的區(qū)別點(diǎn)及用法總結(jié)
在本篇文章里小編給大家分享的是一篇關(guān)于vue中插件和組件的區(qū)別點(diǎn)及用法總結(jié)內(nèi)容,有興趣的的朋友們可以學(xué)習(xí)下。2021-12-12
解決vue中使用less/sass及使用中遇到無(wú)效的問(wèn)題
這篇文章主要介紹了解決vue中使用less/sass及使用中遇到無(wú)效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10

