组合式 API 封装的“返回上一页”Hook需安全调用router.back(),包含历史栈判断(优先history.length>1,fallback至首页)、路由守卫拦截检测(通过afterEach比对to.fullPath)、自定义fallback策略(路径/函数/默认跳home),并导出响应式canGoBack与goBack函数。

<p>用 <strong>组合式 API</strong> 封装一个“返回上一页”的通用 Hook,核心是封装 <code>router.back()</code> 的安全调用逻辑,并补充浏览器历史栈判断、路由守卫兼容、异常降级等细节。</p>
<H3>判断历史栈是否可回退</H3>
<p>直接调用 <code>router.back()</code> 可能触发空白页或白屏(比如 history 栈只有 1 条记录)。需先检查 <code>window.history.length > 1</code>:</p>
<ul>
<li>注意:该值在部分安卓 WebView 或某些嵌入式容器中可能不准,不能完全依赖</li>
<li>更稳妥的方式是结合 <code>router.currentRoute</code> 的 <code>redirectedFrom</code> 或自维护一个简易导航栈(如 localStorage 记录最近 3 个路径)</li>
<li>推荐做法:优先用 <code>history.length</code> 快速判断,失败时 fallback 到 <code>router.push('/')</code> 或指定首页</li>
</ul>
<H3>处理路由守卫拦截场景</H3>
<p>用户点击“返回”时,若目标路由有 <code>beforeRouteLeave</code> 守卫且返回 <code>false</code>,<code>router.back()</code> 会静默失败。Hook 需感知这种“假成功”:</p>
<ul>
<li>监听 <code>router.afterEach</code>,比对 <code>to.fullPath</code> 是否变化;若未变,说明返回被守卫阻止</li>
<li>可暴露一个 <code>onBlocked</code> 回调,供业务决定是否弹窗提示、跳转兜底页或取消操作</li>
<li>避免在 Hook 内自动重试,防止无限循环</li>
</ul>
<H3>支持自定义 fallback 行为</H3>
<p>不是所有场景都适合无脑 <code>back()</code>。Hook 应允许传入 fallback 策略:</p>
<ul>
<li>字符串路径(如 <code>fallback: '/home'</code>)→ <code>router.push(fallback)</code></li>
<li>函数(如 <code>fallback: () => useUserStore().isLogin ? router.push('/profile') : router.push('/login')</code>)</li>
<li>不传 fallback 时,默认行为是 <code>router.push({ name: 'home' })</code> 或 <code>location.href = '/'</code>(强制刷新兜底)</li>
</ul>
<H3>使用示例与导出结构</H3>
<p>最终 Hook 可设计为:</p>
<font color="#666">const { goBack, canGoBack } = useGoBack({ fallback: '/dashboard' })</font>
<p>其中:</p>
<ul>
<li><code>canGoBack</code> 是响应式 ref,基于 <code>watch(router.currentRoute, ...)</code> + <code>history.length</code> 实时更新</li>
<li><code>goBack</code> 是函数,内部按「尝试 back → 检查是否生效 → 失败则执行 fallback」流程执行</li>
<li>支持在 setup 中直接解构,也支持在 <code>onBeforeRouteLeave</code> 中调用以主动控制离开逻辑</li>
</ul>