在活动促销页面中用导航守卫做时间拦截,核心是路由跳转前读取活动时间范围并比对当前时间,不满足则重定向或提示;需配置 startTime 和 endTime(时间戳或 ISO 字符串),并在 router.beforeEach 中统一校验,支持静态配置与动态接口获取两种方式。
在活动促销页面中用导航守卫做时间拦截,关键在于:路由跳转前读取活动时间范围,比对当前时间,不满足就重定向或提示。不需要额外请求接口,只要活动起止时间已配置(如路由 meta 或后端返回的静态数据),就能快速生效。
适合活动时间固定、上线前已知的场景。把 startTime 和 endTime 直接写进路由的 meta:
startTime 和 endTime 用标准时间戳(毫秒)或 ISO 字符串(如 "2026-07-25T00:00:00")new Date() 对比,避免用户本地时间偏差过大)示例路由配置:
{path: '/campaign/summer-sale',
component: SummerSale,
meta: {
requiresTimeCheck: true,
startTime: '2026-07-25T00:00:00',
endTime: '2026-08-10T23:59:59'
}
}
在 router.beforeEach 中统一处理所有带时间校验标记的路由:
to.meta.requiresTimeCheck 是否为真new Date() 获取当前时间,转为毫秒数;再将 startTime/endTime 转为毫秒(new Date().getTime())next() 只被调用一次,避免重复跳转报错代码片段:
router.beforeEach((to, from, next) => {if (to.meta.requiresTimeCheck) {
const now = Date.now();
const start = new Date(to.meta.startTime).getTime();
const end = new Date(to.meta.endTime).getTime();
if (now
next({ path: '/campaign/coming-soon', query: { activity: to.path } });
return;
}
if (now > end) {
next({ path: '/campaign/expired', query: { activity: to.path } });
return;
}
}
next();
});
如果活动时间由后端动态下发(比如运营后台随时调整),就不能硬编码在路由里。建议:
/api/campaign/config)获取最新时间,用 async/await + next(false) 暂停导航,等响应后再决定跳转useCampaignStore().activePeriod
单纯跳走不够友好,建议补充:
?debug-time=2026-08-01),方便模拟不同时间段测试