watchEffect 适用于权限变更后的自动跳转,需监听响应式权限状态并结合路由元信息校验,配合 router.beforeEach 实现首次访问拦截与后续状态响应。
用 watchEffect 实现权限驱动的页面跳转,核心在于监听用户权限状态变化,并在变化时主动触发路由跳转。它适合在组合式 API 中做轻量级、响应式的路由拦截,但要注意它不替代守卫(如 router.beforeEach),而是作为补充——用于「状态就绪后自动响应」,而非「访问前强制校验」。
当权限数据(如 userRole 或 isAuthenticated)由 Pinia、ref 或 computed 提供时,可用 watchEffect 捕获其变化,结合 router.push 执行跳转:
const { role } = storeToRefs(authStore))setup() 或 onMounted 中调用 watchEffect,避免重复监听示例:
const router = useRouter()在路由定义中通过 meta 标记所需权限(如 meta: { requiresAuth: true, allowedRoles: ['admin', 'editor'] }),再在 watchEffect 中读取当前路由的 meta 并比对:
router.currentRoute.value.meta 获取当前路由元信息requiresAuth 是否为真,且用户角色是否在 allowedRoles 内403 或根据业务跳回首页/登录页注意:currentRoute 是只读的响应式 ref,可直接监听或读取,无需额外 toRef。
watchEffect 是同步响应的,若权限和路由同时频繁更新,可能引发跳转打架(比如刚跳过去又因状态未稳再跳一次)。可加一层保护:
ref(false) 标记「是否正在跳转中」,跳转前设为 true,导航守卫 onBeforeRouteUpdate 或 onEachRouteAfter 中重置nextTick 延迟判断,避开 Vue 的响应式批量更新时机watchEffect 无法拦截初始导航(比如用户直接输入 /admin 地址),因为组件可能尚未挂载、权限还未拉取。所以必须搭配:
router.beforeEach 做首次访问拦截(检查 token、拉取权限、决定放行/重定向)watchEffect 做后续响应(权限变更后 UI 自动适配,比如管理员降权,立刻退出管理页)两者分工明确:守卫管「能不能进」,watchEffect 管「进了之后状态变了怎么办」。