useAdFrequency()
useAdFrequency 是廣告展示頻率控制 composable,通用於任何需頻控的廣告位(如 SwAdPopup 進站彈窗)。不綁「開屏」語意。決策記錄走 framework 加密快取 util(useSession / useLocal 自動拼 cachePrefix + AES 加密,不裸用 storage)。
useAdFrequency(key, strategy):
| 名稱 | 類型 | 必填 | 說明 |
|---|
key | string | ✓ | 頻控記錄的唯一鍵(如 'home-popup')。內部存為 ad_seen_<key>,便於 devtools 辨識 |
strategy | AdFrequencyStrategy | ✓ | 頻率策略,見下表 |
| 取值 | 含義 | 儲存 |
|---|
'session' | 會話內展示一次,關標籤頁重置 | sessionStorage(加密) |
number > 0 | N 天內不再展示(N 可為小數,如 0.5 = 12 小時) | localStorage(加密,存時間戳) |
0 / 負數 | 每次都展示(除錯 / 不限頻) | 不讀寫 |
| 名稱 | 類型 | 說明 |
|---|
shouldShow | () => boolean | 當前是否該展示。SSR 回傳 false —— 頻控是 client-only 決策 |
markShown | () => void | 標記已展示(寫入加密快取) |
// 範例 1:進站彈窗,會話內只彈一次
const { shouldShow, markShown } = useAdFrequency('home-popup', 'session')
onMounted(() => {
if (shouldShow()) {
openPopup()
markShown()
}
})
// 範例 2:促銷彈窗,3 天彈一次
const { shouldShow, markShown } = useAdFrequency('promo-2026', 3)
onMounted(() => {
if (shouldShow()) {
openPromo()
markShown()
}
})
// 範例 3:除錯期不限頻(每次都彈)
const { shouldShow } = useAdFrequency('debug-ad', 0)
- 決策邏輯抽成純函式
shouldShowByStrategy(strategy, stored, now)(不碰 storage / Date,便於單測):
number <= 0 → 始終 true(每次)'session' → 無標記才 true(會話內未展示過)number > 0 → 無標記、或 now - 上次展示時間 >= N 天 才 true
shouldShow() 在 SSR(!IS_CLIENT)直接回傳 false,避免伺服端誤判 + hydration 不一致。
- 先
shouldShow() 判斷,再 markShown() —— markShown 不會自動在展示時呼叫,需業務在真正展示後顯式標記。 key 要全站唯一,不同廣告位用不同 key,否則頻控記錄互相覆蓋。
SwAdPopup —— 彈窗廣告元件,常配合本 composable 做進站頻控- 廣告底座與打點