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

主要代码

import { ref, onMounted, watch } from 'vue';
const activeIndex = ref("/");
const route = useRoute();
 
onMounted(() => {
  updateActiveMenu();
});
 
watch(() => route.path, updateActiveMenu);
 
function updateActiveMenu() {
  // 根据路由更新activeMenu的值,使菜单高亮
  activeMenu.value = route.fullPath;
}

头部组件 

<template>
  <div
    class="header-container flex-center-center header-element-sty"
    :class="isDefault ? 'default-sty' : 'change-sty'"
    id="subei1"
    @mouseenter="changeActive()"
    @mouseleave="removeActive()"
  >
    <el-menu
      :default-active="activeIndex"
      class="el-menu"
      mode="horizontal"
      :ellipsis="false"
      active-text-color="#74237e"
      menu-trigger="click"
      @select="handleSelect"
      :unique-opened="true"
    >
      <div class="header-logo" @click="toHome"></div>
      <div class="flex-grow" />
      <el-sub-menu index="/brandNews" class="header-item">
        <template #title>
          <span class="el-menu-item-txt">品牌动态</span>
        </template>
        <el-menu-item index="/brandNews?active=company_news"
          >公司新闻</el-menu-item
        >
        <el-menu-item index="/brandNews?active=media_coverage"
          >媒体报道</el-menu-item
        >
        <el-menu-item index="/brandNews?active=popular_science_course"
          >科普教程</el-menu-item
        >
        <el-menu-item index="/brandNews?active=popular_science_activity"
          >科普活动</el-menu-item
        >
      </el-sub-menu>
      <el-menu-item class="el-menu-item-txt header-item" index="/?name=smartGym">
        <template #title>
          <span class="el-menu-txt">室外智能健身房</span>
        </template>
      </el-menu-item>
      <el-menu-item class="el-menu-item-txt header-item" index="/sportsCampus">
        <template #title>
          <span class="el-menu-item-txt">智慧体育公园</span>
        </template>
      </el-menu-item>
      <el-sub-menu class="header-item" index="/fitnessPlans">
        <template #title>
          <span class="el-menu-item-txt">全民健身方案</span>
        </template>
        <el-menu-item index="/fitnessPlans?plan=smart_sports_campus"
          >智慧体育公园</el-menu-item
        >
        <el-menu-item index="/fitnessTrain?plan=intelligent_fitness_trail"
          >智能健身步道</el-menu-item
        >
        <el-menu-item index="/fitnessPath?plan=national_fitness_path"
          >全民健身路径</el-menu-item
        >
        <el-menu-item index="/fitnessCenter?plan=digital_fitness_center"
          >数字健身中心</el-menu-item
        >
      </el-sub-menu>
      <el-sub-menu class="header-item" index="/match">
        <template #title>
          <span class="el-menu-item-txt">智能赛事</span>
        </template>
        <el-menu-item index="/match?active=preview">活动预告</el-menu-item>
        <el-menu-item index="/match?active=sign_up">参赛报名</el-menu-item>
        <el-menu-item index="/match?active=review">赛事回顾</el-menu-item>
      </el-sub-menu>
      <el-menu-item class="el-menu-item-txt header-item"
        ><a
          class="menu-item-a"
          href="https://www.topsupport.cn/"
          target="_blank"
          >TopSupport</a
        ></el-menu-item
      >
      <el-menu-item class="el-menu-item-txt header-item"
        ><a
          class="menu-item-a"
          href="https://www.topsupport.cn/"
          target="_blank"
          >运动健康商城</a
        ></el-menu-item
      >
      <el-sub-menu class="header-item" index="/about">
        <template #title>
          <span class="el-menu-item-txt">关于我们</span>
        </template>
        <el-menu-item index="/about?about=us">集团简介</el-menu-item>
        <el-menu-item index="/customer?about=customer">客服中心</el-menu-item>
      </el-sub-menu>
    </el-menu>
  </div>
</template>
<script lang="ts" setup>
import { ref, onMounted, onUnmounted,watch } from "vue";
const navBackgroundColor = ref("transparent");
const isDefault = ref(false);
const activeIndex = ref("/");
const route= useRoute();
const handleSelect = (key: string, keyPath: string[]) => {
  activeIndex.value = key;
  navigateTo(key, { external: true });//页面跳转
};
 // 根据路由更新activeIndex的值,使菜单高亮
function updateActiveMenu() {
  activeIndex.value = route.fullPath;
}
// 监听路由
watch(() => route.path, updateActiveMenu);

const toHome = () => {
  activeIndex.value = "/";
  navigateTo("/");
};
const handleScroll=()=> {
  // window.innerHeight
  const navHeight = 420; // 窗口高度
  if (window.scrollY >= navHeight) {
    isDefault.value = true;
  } else {
    isDefault.value = false;
  }
}
const changeActive=()=> {
  document.getElementById("subei1").classList.add("mouseenterSty");
}
const removeActive=()=>{
  document.getElementById("subei1").classList.add("mouseleaveSty");
}
onMounted(() => {
  window.addEventListener("scroll", handleScroll);
  updateActiveMenu();//使选中页面菜单高亮的方法
});

onUnmounted(() => {
  window.removeEventListener("scroll", handleScroll);
});

</script>
<style lang="scss" scoped>
.header-container {
  width: 100%;
  position: fixed;
  // border-bottom: 1px solid rgba(255,255,255,0.5);
  top: 0;
  z-index: 99;
  background: #ffffff;
  overflow: hidden;
  .left {
    img {
      height: 3rem;
    }
  }
}

.el-menu {
  background-color: transparent;
  display: flex;
  align-items: center;
  justify-content: center;
  border-bottom: none !important;
  font-size: var(fs-content-normal);
  &-item {
    font-size: var(--fs-content-most);
    display: flex;
    justify-content: center;
  }
  &-item-txt {
    padding-left: 3rem;
  }
  img {
    width: 6.5rem;
  }
}
.flex-grow {
  flex-grow: 1;
}
.el-menu--popup-bottom-start .el-menu-item {
  display: flex;
  justify-content: center;
}

:deep.el-menu-item {
  padding: 0;
}

:deep.el-menu-item-txt {
  padding-left: 0;
}
:deep.el-menu:not(.el-menu--collapse) .el-sub-menu__title {
  padding: 0 1.5rem;
}
.el-menu-item-txt:hover {
  color: var(--color-priority) !important;
  background-color: transparent !important;
}
.el-menu--horizontal > .el-menu-item {
  border-bottom: none;
  text-decoration: none;
}

.el-menu--horizontal > .el-menu-item:hover {
  color: var(--color-priority) !important;
}
:deep(.el-sub-menu__title) {
  font-size: var(--fs-content-most);
}

// 导航样式
.header-item {
  padding: 0 1.5rem;
}
// 白底导航
.default-sty {
  background: #ffffff;
  .header-logo {
    width: 10.5rem;
    height: 2.81rem;
    background: url(/image/logo.png) no-repeat center center;
    background-size: 100% 100%;
  }
}
// 透明导航
.change-sty {
  background: linear-gradient(180deg, rgba(0, 0, 0, 0.3) 13%, rgba(0, 0, 0, 0));
  .header-logo {
    width: 10.5rem;
    height: 2.81rem;
    background: url(/image/logo_white.png) no-repeat center center;
    background-size: 100% 100%;
  }
}
.mouseenterSty {
    background: #ffffff;
    .header-logo {
      width: 10.5rem;
      height: 2.81rem;
      background: url(/image/logo.png) no-repeat center center;
      background-size: 100% 100%;
    }
  }

</style>

其他页面跳转

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vueel-menu组件可以通过设置`default-active`属性来实现高亮当前选中的菜单项,而实现点击菜单项跳转路由可以通过设置`router`属性和使用`router-link`组件来实现。 首先,设置el-menu组件的`default-active`属性,将其绑定到Vue实例中的一个data属性,例如`activeMenu`: ```html <template> <div> <el-menu :default-active="activeMenu"> <el-menu-item index="/home">首页</el-menu-item> <el-menu-item index="/about">关于</el-menu-item> <el-menu-item index="/contact">联系我们</el-menu-item> </el-menu> <router-view></router-view> </div> </template> <script> export default { data() { return { activeMenu: '/home' // 默认选中首页菜单项 } } } </script> ``` 然后,在路由配置中,使用Vue Router的`router-link`组件来实现点击菜单项跳转路由。在每个菜单项上使用`router-link`组件,将其绑定到相应的路由路径: ```html <template> <div> <el-menu :default-active="activeMenu"> <el-menu-item index="/home"> <router-link to="/home">首页</router-link> </el-menu-item> <el-menu-item index="/about"> <router-link to="/about">关于</router-link> </el-menu-item> <el-menu-item index="/contact"> <router-link to="/contact">联系我们</router-link> </el-menu-item> </el-menu> <router-view></router-view> </div> </template> ``` 这样,点击菜单项时会根据`router-link`中的`to`属性自动跳转到对应的路由,并且el-menu组件会根据当前路由的路径自动高亮对应的菜单项。 请注意,以上代码中的el-menu和router-view是使用了Element UI库和Vue Router插件,你需要在项目中引入并正确配置它们。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值