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 做进站频控- 广告底座与打点