Element UI导航菜单之秘:无痕迹浏览与历史记录栈的管理

前言

需求

在使用 Element UI 的 el-menu 导航栏菜单时,发现 history 栈(历史记录栈)会不断缓存之前的记录,而在某些场景下我们可能不希望 history 栈(历史记录栈)中有之前的记录,即实现无痕迹流量模式。

示例

以下实例为默认行为对应情形:

代码

html 复制代码
    <el-menu 
        :default-active="activeIndex" 
        mode="horizontal" 
        @select="handleSelect" 
        router
    >
      <el-menu-item index="/about">about</el-menu-item>
      <el-menu-item index="/mode">mode</el-menu-item>
      <el-menu-item index="/pagination">pagination</el-menu-item>
    </el-menu>

el-menu:

  • :default-active="activeIndex":这里使用 Vue 的绑定语法(:)来设置 el-menu 的默认激活项。activeIndex 是一个 Vue data 属性,它的值是当前激活菜单项的索引。
  • mode="horizontal":这表示菜单是水平模式,即菜单项是水平排列的。
  • @select="handleSelect":这是 Vue 的事件监听语法,表示当用户选择一个菜单项时,会调用 handleSelect 方法。
  • router:这个属性表示 el-menu 会使用 Vue Router 来导航。

el-menu-item:

  • index="/about":每个 el-menu-item 都有一个 index 属性,它表示当用户选择这个菜单项时,他们将被导航到哪个路由。在这个例子中,如果用户选择 "about",他们将被导航到 /about 路由。
javascript 复制代码
data() {
    return {
      activeIndex: window.sessionStorage.getItem('MenuPath') || '/about',
    };
  },
  methods: {
    handleSelect(key, keyPath) {
      window.sessionStorage.setItem('MenuPath', key);
    },
  },

data:

  • return { activeIndex: window.sessionStorage.getItem('MenuPath') || '/about', }:这里定义了一个 Vue data 对象,它有一个 activeIndex 属性。这个属性的值从浏览器的 sessionStorage 中获取,键为 'MenuPath'。如果 session storage 中没有这个键,那么 activeIndex 的默认值是 '/about'。

methods:

  • handleSelect(key, keyPath):这是一个 Vue 方法,它被调用当用户选择一个菜单项时。这个方法将选择的菜单项的键(key)存储到浏览器的 sessionStorage 中,键为 'MenuPath'。这样,即使在重新加载页面或刷新页面后,用户也能记住他们之前选择的菜单项。

实现

原理

使用router.push方法导航到不同的 URL 时会向 history 栈添加一个新的记录,所以,当用户点击浏览器后退按钮时,会回到之前的 URL。

使用router.replace方法导航到不同的 URL 时会在 history 栈替换历史记录,即history 栈中一直都只有当前页面所对应的记录。

代码

html 复制代码
    <el-menu
        :default-active="activeIndex" 
        mode="horizontal" 
        @select="handleSelect"
    >
      <el-menu-item index="/about">about</el-menu-item>
      <el-menu-item index="/mode">mode</el-menu-item>
      <el-menu-item index="/pagination">pagination</el-menu-item>
    </el-menu>

区别在 router 属性的配置上,因为 router 可以决定是否使用 vue-router 的模式,启用该模式会在激活导航时以 index 作为 path 进行路由跳转。换句话说,不启用 router 的话,点击导航时路由就不会跳转,那么我们就需要自己完成跳转相关代码,此时就可以使用 replace 代替默认的 push 来完成跳转,实现无痕迹浏览的目的。

javascript 复制代码
data() {
    return {
      activeIndex: window.sessionStorage.getItem('MenuPath') || '/about',
    };
  },
  methods: {
    handleSelect(key, keyPath) {
      window.sessionStorage.setItem('MenuPath', key);
      this.$router.replace(key); // 使用 replace 跳转路由
    },
  },

效果


相关推荐
落霞的思绪39 分钟前
CSS复习
前端·css
咖啡の猫3 小时前
Shell脚本-for循环应用案例
前端·chrome
百万蹄蹄向前冲5 小时前
Trae分析Phaser.js游戏《洋葱头捡星星》
前端·游戏开发·trae
朝阳5816 小时前
在浏览器端使用 xml2js 遇到的报错及解决方法
前端
GIS之路6 小时前
GeoTools 读取影像元数据
前端
ssshooter6 小时前
VSCode 自带的 TS 版本可能跟项目TS 版本不一样
前端·面试·typescript
你的人类朋友6 小时前
【Node.js】什么是Node.js
javascript·后端·node.js
Jerry7 小时前
Jetpack Compose 中的状态
前端
dae bal8 小时前
关于RSA和AES加密
前端·vue.js
柳杉8 小时前
使用three.js搭建3d隧道监测-2
前端·javascript·数据可视化