当前位置:   article > 正文

vue3从其他页面跳转页面头部组件菜单el-menu菜单高亮

vue3从其他页面跳转页面头部组件菜单el-menu菜单高亮

主要代码

  1. import { ref, onMounted, watch } from 'vue';
  2. const activeIndex = ref("/");
  3. const route = useRoute();
  4. onMounted(() => {
  5. updateActiveMenu();
  6. });
  7. watch(() => route.path, updateActiveMenu);
  8. function updateActiveMenu() {
  9. // 根据路由更新activeMenu的值,使菜单高亮
  10. activeMenu.value = route.fullPath;
  11. }

头部组件 

  1. <template>
  2. <div
  3. class="header-container flex-center-center header-element-sty"
  4. :class="isDefault ? 'default-sty' : 'change-sty'"
  5. id="subei1"
  6. @mouseenter="changeActive()"
  7. @mouseleave="removeActive()"
  8. >
  9. <el-menu
  10. :default-active="activeIndex"
  11. class="el-menu"
  12. mode="horizontal"
  13. :ellipsis="false"
  14. active-text-color="#74237e"
  15. menu-trigger="click"
  16. @select="handleSelect"
  17. :unique-opened="true"
  18. >
  19. <div class="header-logo" @click="toHome"></div>
  20. <div class="flex-grow" />
  21. <el-sub-menu index="/brandNews" class="header-item">
  22. <template #title>
  23. <span class="el-menu-item-txt">品牌动态</span>
  24. </template>
  25. <el-menu-item index="/brandNews?active=company_news"
  26. >公司新闻</el-menu-item
  27. >
  28. <el-menu-item index="/brandNews?active=media_coverage"
  29. >媒体报道</el-menu-item
  30. >
  31. <el-menu-item index="/brandNews?active=popular_science_course"
  32. >科普教程</el-menu-item
  33. >
  34. <el-menu-item index="/brandNews?active=popular_science_activity"
  35. >科普活动</el-menu-item
  36. >
  37. </el-sub-menu>
  38. <el-menu-item class="el-menu-item-txt header-item" index="/?name=smartGym">
  39. <template #title>
  40. <span class="el-menu-txt">室外智能健身房</span>
  41. </template>
  42. </el-menu-item>
  43. <el-menu-item class="el-menu-item-txt header-item" index="/sportsCampus">
  44. <template #title>
  45. <span class="el-menu-item-txt">智慧体育公园</span>
  46. </template>
  47. </el-menu-item>
  48. <el-sub-menu class="header-item" index="/fitnessPlans">
  49. <template #title>
  50. <span class="el-menu-item-txt">全民健身方案</span>
  51. </template>
  52. <el-menu-item index="/fitnessPlans?plan=smart_sports_campus"
  53. >智慧体育公园</el-menu-item
  54. >
  55. <el-menu-item index="/fitnessTrain?plan=intelligent_fitness_trail"
  56. >智能健身步道</el-menu-item
  57. >
  58. <el-menu-item index="/fitnessPath?plan=national_fitness_path"
  59. >全民健身路径</el-menu-item
  60. >
  61. <el-menu-item index="/fitnessCenter?plan=digital_fitness_center"
  62. >数字健身中心</el-menu-item
  63. >
  64. </el-sub-menu>
  65. <el-sub-menu class="header-item" index="/match">
  66. <template #title>
  67. <span class="el-menu-item-txt">智能赛事</span>
  68. </template>
  69. <el-menu-item index="/match?active=preview">活动预告</el-menu-item>
  70. <el-menu-item index="/match?active=sign_up">参赛报名</el-menu-item>
  71. <el-menu-item index="/match?active=review">赛事回顾</el-menu-item>
  72. </el-sub-menu>
  73. <el-menu-item class="el-menu-item-txt header-item"
  74. ><a
  75. class="menu-item-a"
  76. href="https://www.topsupport.cn/"
  77. target="_blank"
  78. >TopSupport</a
  79. ></el-menu-item
  80. >
  81. <el-menu-item class="el-menu-item-txt header-item"
  82. ><a
  83. class="menu-item-a"
  84. href="https://www.topsupport.cn/"
  85. target="_blank"
  86. >运动健康商城</a
  87. ></el-menu-item
  88. >
  89. <el-sub-menu class="header-item" index="/about">
  90. <template #title>
  91. <span class="el-menu-item-txt">关于我们</span>
  92. </template>
  93. <el-menu-item index="/about?about=us">集团简介</el-menu-item>
  94. <el-menu-item index="/customer?about=customer">客服中心</el-menu-item>
  95. </el-sub-menu>
  96. </el-menu>
  97. </div>
  98. </template>
  99. <script lang="ts" setup>
  100. import { ref, onMounted, onUnmounted,watch } from "vue";
  101. const navBackgroundColor = ref("transparent");
  102. const isDefault = ref(false);
  103. const activeIndex = ref("/");
  104. const route= useRoute();
  105. const handleSelect = (key: string, keyPath: string[]) => {
  106. activeIndex.value = key;
  107. navigateTo(key, { external: true });//页面跳转
  108. };
  109. // 根据路由更新activeIndex的值,使菜单高亮
  110. function updateActiveMenu() {
  111. activeIndex.value = route.fullPath;
  112. }
  113. // 监听路由
  114. watch(() => route.path, updateActiveMenu);
  115. const toHome = () => {
  116. activeIndex.value = "/";
  117. navigateTo("/");
  118. };
  119. const handleScroll=()=> {
  120. // window.innerHeight
  121. const navHeight = 420; // 窗口高度
  122. if (window.scrollY >= navHeight) {
  123. isDefault.value = true;
  124. } else {
  125. isDefault.value = false;
  126. }
  127. }
  128. const changeActive=()=> {
  129. document.getElementById("subei1").classList.add("mouseenterSty");
  130. }
  131. const removeActive=()=>{
  132. document.getElementById("subei1").classList.add("mouseleaveSty");
  133. }
  134. onMounted(() => {
  135. window.addEventListener("scroll", handleScroll);
  136. updateActiveMenu();//使选中页面菜单高亮的方法
  137. });
  138. onUnmounted(() => {
  139. window.removeEventListener("scroll", handleScroll);
  140. });
  141. </script>
  142. <style lang="scss" scoped>
  143. .header-container {
  144. width: 100%;
  145. position: fixed;
  146. // border-bottom: 1px solid rgba(255,255,255,0.5);
  147. top: 0;
  148. z-index: 99;
  149. background: #ffffff;
  150. overflow: hidden;
  151. .left {
  152. img {
  153. height: 3rem;
  154. }
  155. }
  156. }
  157. .el-menu {
  158. background-color: transparent;
  159. display: flex;
  160. align-items: center;
  161. justify-content: center;
  162. border-bottom: none !important;
  163. font-size: var(fs-content-normal);
  164. &-item {
  165. font-size: var(--fs-content-most);
  166. display: flex;
  167. justify-content: center;
  168. }
  169. &-item-txt {
  170. padding-left: 3rem;
  171. }
  172. img {
  173. width: 6.5rem;
  174. }
  175. }
  176. .flex-grow {
  177. flex-grow: 1;
  178. }
  179. .el-menu--popup-bottom-start .el-menu-item {
  180. display: flex;
  181. justify-content: center;
  182. }
  183. :deep.el-menu-item {
  184. padding: 0;
  185. }
  186. :deep.el-menu-item-txt {
  187. padding-left: 0;
  188. }
  189. :deep.el-menu:not(.el-menu--collapse) .el-sub-menu__title {
  190. padding: 0 1.5rem;
  191. }
  192. .el-menu-item-txt:hover {
  193. color: var(--color-priority) !important;
  194. background-color: transparent !important;
  195. }
  196. .el-menu--horizontal > .el-menu-item {
  197. border-bottom: none;
  198. text-decoration: none;
  199. }
  200. .el-menu--horizontal > .el-menu-item:hover {
  201. color: var(--color-priority) !important;
  202. }
  203. :deep(.el-sub-menu__title) {
  204. font-size: var(--fs-content-most);
  205. }
  206. // 导航样式
  207. .header-item {
  208. padding: 0 1.5rem;
  209. }
  210. // 白底导航
  211. .default-sty {
  212. background: #ffffff;
  213. .header-logo {
  214. width: 10.5rem;
  215. height: 2.81rem;
  216. background: url(/image/logo.png) no-repeat center center;
  217. background-size: 100% 100%;
  218. }
  219. }
  220. // 透明导航
  221. .change-sty {
  222. background: linear-gradient(180deg, rgba(0, 0, 0, 0.3) 13%, rgba(0, 0, 0, 0));
  223. .header-logo {
  224. width: 10.5rem;
  225. height: 2.81rem;
  226. background: url(/image/logo_white.png) no-repeat center center;
  227. background-size: 100% 100%;
  228. }
  229. }
  230. .mouseenterSty {
  231. background: #ffffff;
  232. .header-logo {
  233. width: 10.5rem;
  234. height: 2.81rem;
  235. background: url(/image/logo.png) no-repeat center center;
  236. background-size: 100% 100%;
  237. }
  238. }
  239. </style>

其他页面跳转

<router-link class="menu-item-a" to="/brandNews?active=company_news">品牌动态</router-link>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/329332
推荐阅读
相关标签
  

闽ICP备14008679号