空链接href="https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b"会触发哈希变更并记录历史状态,导致vue/react router误判为路由跳转,引发重渲染、404或状态不一致;推荐改用href="javascript:void(0)"或role="button"。

空链接锚点(href="https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b")为什么会让路由出问题
它不是“跳转到页面顶部”,而是触发一次无目标的哈希变更:location.hash 变成 "https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b",浏览器会记录这个历史状态。在 Vue Router 或 React Router v6+ 中,这会被视为一次合法的路由跳转事件 —— 即使没配 path: "https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b",也可能触发 onPopState、重渲染、甚至 404 页面(尤其当使用 createBrowserRouter 且未启用 hash 模式时)。
- Vue:若全局监听了
router.beforeEach,to.fullPath === "https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b"会进入守卫逻辑,可能意外中断或重定向 - React Router v6+:
useNavigate()或点击@#@#@#@#@#@#@#@#@#@0会调用history.pushState,但后续useLocation().hash读不到值(因为"https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b"被浏览器标准化为空字符串),造成状态不一致 - SSR 场景下,服务端首次渲染无法感知
https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b,客户端 hydrate 后又突然插入一个空 hash,可能触发额外的useEffect执行
href="https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b" 的替代写法:不干扰路由,也不阻止默认行为
真正安全的空链接,是既不触发哈希变更、也不阻止滚动行为的写法。关键在于让浏览器跳过哈希解析逻辑。
- 用
href="javascript:void(0)":老方案,兼容性好,但部分 Linter 会警告;现代框架中仍可接受 - 用
href="about:blank":更语义清晰,不产生 history entry,且不会被路由系统捕获 - 直接删掉
href,改用role="button"+tabindex="0":语义最正,需手动绑定click和keydown(Enter/Space),适合交互控件 - 绝对不要用
href="https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b" onclick="return false":看似阻断,但return false在现代事件模型中已不保证阻止默认行为,且仍会写入 history
已有 href="https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b" 的批量修复策略
如果项目里已有大量 @#@#@#@#@#@#@#@#@#@1 或折叠按钮,别逐个改,用脚本兜底更可靠。
- 在 DOM 加载后,统一拦截:
document.querySelectorAll('a[href="https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b"]').forEach(el => { el.addEventListener('click', e => { e.preventDefault(); // 不调用 e.stopPropagation(),避免影响外层事件委托 }); }); - 配合 CSS 隐藏默认下划线和手型:
a[href="https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b"] { text-decoration: none; cursor: default; } - 注意避开需要原生跳转的场景:比如表单内
@#@#@#@#@#@#@#@#@#@2若绑了 JS 重置逻辑,就不用动;但若只是占位,就该替换
SPA 中锚点跳转与空链接的边界必须划清
很多人混淆两类行为:href="https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15bfaq" 是有效锚点,href="https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b" 是无效占位符。路由系统对前者要放行(尤其在 hash 模式),对后者必须隔离。
- Vue Router:设
scrollBehavior时,if (to.hash) {...}要加to.hash !== "https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b"排除空 hash - React Router v6+:在
createHashRouter的routes配置里,不要定义{ path: "https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b" }这种路径,否则会污染匹配逻辑 - 最关键的检查点:打开 DevTools → Application → History,点击空链接后看是否多了一条
about:blank或空条目 —— 有,说明还没切干净
空链接本身不复杂,但它像一粒沙子,混在路由状态流里就会卡住整个导航链路。修的时候别只盯着 HTML,得同步清理 JS 监听、CSS 行为、路由守卫里的隐含假设。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











