返回

一劳永逸解决 Vue-Element-Admin Tags-View 标签刷新消失问题

前端

问题

在使用 Vue-Element-Admin 时,遇到了一个棘手的问题:在刷新页面后,标签页(Tags-View)会消失。这给用户带来了极大的困扰,因为他们需要重新打开所有标签页,影响了工作效率。

解决方案

经过一番探索,我找到了一种一劳永逸解决此问题的方案:使用 SessionStorage 或 LocalStorage 来持久化标签页的状态。具体步骤如下:

  1. 修改 /src/store/index.js

    /src/store/index.js 中,找到 createStore 函数,并添加以下代码:

    import { sessionStorage, localstorage } from '@/utils/storage'
    ...
    const store = createStore({
      ...
      plugins: [
        createPersistedState({
          storage: {
            getItem: key => sessionStorage.getItem(key),
            setItem: (key, value) => sessionStorage.setItem(key, value),
            removeItem: key => sessionStorage.removeItem(key)
          }
        })
      ]
      ...
    })
    

    这将使用 SessionStorage 持久化 Vuex 状态。

  2. 修改 /src/layout/components/TagsView/index.vue

    /src/layout/components/TagsView/index.vue 中,找到 <template> 区域,并添加以下代码:

    <template>
      <keep-alive>
        <router-view v-if="$route.meta.keepAlive" />
      </keep-alive>
    </template>
    

    这将使用 <keep-alive> 组件缓存标签页组件。

  3. 刷新页面

    完成上述修改后,刷新页面。你会发现,标签页现在已经持久化,即使刷新后也不会消失。

原理解释

此解决方案的原理是:

  • SessionStorage 或 LocalStorage: 这些 API 可以存储数据,即使在刷新页面后也不会丢失。
  • Vuex: Vuex 是 Vue.js 的状态管理库,可以存储应用程序的状态。
  • <keep-alive> 组件: 此组件可以缓存组件,即使组件被卸载也不会销毁。

通过使用这些技术,我们可以将标签页的状态持久化到 SessionStorage 或 LocalStorage 中,并在刷新页面后使用 <keep-alive> 组件恢复状态。这样,标签页就可以在刷新后保持可见。

注意:

  • 如果需要在多个标签页之间共享数据,可以使用 LocalStorage 替代 SessionStorage。
  • 这种解决方案不会持久化标签页的内容,如表单数据或编辑器内容。需要额外的措施来持久化这些内容。