You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue Router history模式下点击父菜单触发favicon请求而非展开子菜单

解决Vue Router History模式下父菜单点击未展开子菜单的问题

嘿,我刚看完你的问题,这事儿我之前也碰到过——在Vue Router的History模式下,带href="#"的父菜单点击后不展开子菜单反而触发favicon请求,核心原因是这个#触发了浏览器的默认导航行为,干扰了你的子菜单展开逻辑。

下面给你几个靠谱的解决方案,一步步来:

1. 用Vue指令阻止默认跳转(最推荐)

既然你用Vue开发,直接给父菜单的<a>标签加@click.prevent指令就行,它会自动阻止浏览器的跳转动作,让点击只触发子菜单展开:

<li>
  <a href="#" @click.prevent>
    <i></i> parent menu <i></i>
  </a>
  <ul>
    <li><a href="index-2.html">submenu 1</a></li>
    <li><a href="dashboard-2.html">submenu 2</a></li>
  </ul>
</li>

这样点击父菜单时,就不会触发路由跳转,自然也不会出现莫名其妙的favicon请求了。

2. 替换href为无效值(应急方案)

如果你暂时不想改Vue指令,也可以把href="#"换成href="javascript:void(0)",这个值不会触发任何默认导航:

<li>
  <a href="javascript:void(0)">
    <i></i> parent menu <i></i>
  </a>
  <ul>
    <li><a href="index-2.html">submenu 1</a></li>
    <li><a href="dashboard-2.html">submenu 2</a></li>
  </ul>
</li>

不过这种写法可读性不如Vue指令,更推荐第一种方法。

3. 完善子菜单的展开逻辑

另外要确保你的子菜单展开逻辑已经正确绑定了。比如在Vue组件里用状态控制显示隐藏,这样更符合Vue的开发习惯:

<template>
  <li>
    <a href="#" @click.prevent="toggleSubmenu">
      <i></i> parent menu <i></i>
    </a>
    <ul v-show="isSubmenuOpen">
      <!-- 子菜单推荐用router-link,适配Vue Router -->
      <li><router-link to="/index-2">submenu 1</router-link></li>
      <li><router-link to="/dashboard-2">submenu 2</router-link></li>
    </ul>
  </li>
</template>

<script>
export default {
  data() {
    return {
      isSubmenuOpen: false
    }
  },
  methods: {
    toggleSubmenu() {
      this.isSubmenuOpen = !this.isSubmenuOpen;
    }
  }
}
</script>

这里用v-show控制子菜单的显示,点击父菜单时切换状态,同时用router-link替代原生<a>,更适配单页应用的路由机制。

最后说下为什么会出现favicon请求:当你点击href="#"时,浏览器会尝试导航到当前页面的根锚点,在Vue Router History模式下,这个动作会被路由拦截处理,过程中可能触发浏览器重新请求favicon.ico——阻止默认跳转后,这个问题就彻底消失了。

内容的提问来源于stack exchange,提问作者ᴜɴᴅᴇғɪɴᴇᴅ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:14:48