Vue-template-admin のキープアライブ キャッシュとキャッシュの削除

一つ、現場

ページ A はフォーム ページであり、入力後にページ B にリダイレクトする必要があります。ページ B が何も操作せずに戻った場合は、ページ A のコンテンツを復元する必要があります。ページ B が送信をクリックしてページ A に戻った場合は、キャッシュをクリアする必要があります。

第二に、実装方法

ページ A がデータをキャッシュしたい場合は、キープアライブでラップする必要があります。
ページ B が「送信」をクリックした後にキャッシュをクリアする必要がある場合は、ページ A のキープアライブ キャッシュをクリアする必要があります。
したがって、keep-alive の :include 属性を使用すると、このリスト内のページのみがキャッシュを持ちます。

被 keep-alive 包裹的组件的生命周期是有区别于普通的组件。
被 keep-alive 包裹的组件中,会多出两个生命周期 activated、deactivated。
第一次进入被 keep-alive 包裹的组件中的时候会依次调用 beforeCreate -> created -> beforeMount -> mounted -> activated,其后的进入皆只会调用 activated,因为组件被缓存了,再次进入的时候,就不会走 创建、挂载 的流程了。
被 keep-alive 包裹的组件退出的时候就不会再执行 beforeDestroy、destroyed 了,因为组件不会真正意义上被销毁,相对应的组件退出的时候会执行 deactivated 作为替代。

したがって、次のように考えることができます。

第一步:路由发生改变时(例如跳转A页面时),将A页面加入keep-alive缓存include,然后页面开始渲染
第二步:A页面填写表单完成后跳转B页面
第三步:B页面提交表单完成后把A页面从include中移除。
第四步:这时候无论从哪里进入A页面,都需要重新加入include缓存,并重新渲染了(重新走第一步)。而如果没有第三步的移除缓存,则再进入A时会拿缓存的A页面。

3 番目に、特定の実装コード ロジック

デモとして vue-template-admin を使用したので、その実装方法について説明します。

最初のステップ: keep-alive パッケージのコンポーネント

メインレイアウトページ:

<template>
  <section class="app-main">
    <transition name="fade-transform" mode="out-in">
      <keep-alive :include="cachedViews">
        <router-view :key="key" />
      </keep-alive>
    </transition>
  </section>
</template>
<script>
export default {
    
    
  name: "AppMain",
  computed: {
    
    
    cachedViews() {
    
    
      return this.$store.state.tagsView.cachedViews
    },
    key() {
    
    
      return this.$route.path
    }
  }
}
</script>

ステップ 2: vuex の tagsView モジュールを確認します。

const state = {
    
    
  cachedViews: []
}

const mutations = {
    
    
  ADD_CACHED_VIEW: (state, view) => {
    
    
    if (state.cachedViews.includes(view.name)) return
    if (!view.meta.noCache) {
    
    
      state.cachedViews.push(view.name)
    }
  },
  DEL_CACHED_VIEW: (state, view) => {
    
    
    const index = state.cachedViews.indexOf(view.name)
    index > -1 && state.cachedViews.splice(index, 1)
  },
}
export default {
    
    
  namespaced: true,
  state,
  mutations,
  actions
}

インクルードを追加および削除する方法は次のとおりです。

ステップ 3: router.js ファイル内の設定を確認する

  {
    
    
    path: "/test",
    component: Layout,
    redirect: "/test/test-one",
    children: [
      {
    
    
        path: "test-one",
        component: () => import("@/views/test-one/index"),
        name: "TestOne",
        meta: {
    
     title: "表单测试", icon: "el-icon-warning", noCache: false }
      },
      {
    
    
        path: "test-two",
        hidden: true,
        component: () => import("@/views/test-two/index.vue"),
        name: "TestTwo",
        meta: {
    
    
          title: "表单提交",
          activeMenu: "/test/test-one",
          noCache: true
        }
      }
    ]
  }

主に、meta の name 属性と noCache 属性です。

ステップ 4: キープアライブ インクルード キャッシュがいつ追加されたかを確認する

以下の図を見ると、現在のルートの変更が監視されていることがわかります。ルートが変更されると、vuex の ADD_CACHED_VIEW メソッドが呼び出され、現在のページに対応する名前が配列に追加されます。ルート変更時にページがレンダリングされていないため、この時点で追加するとページのレンダリング時にキャッシュできます。
ここに画像の説明を挿入

ステップ 5: フォーム送信ページを参照してキャッシュを削除する

ページ A がキャッシュされている場合、フォームに記入してページ B を入力し、フォームを送信した後、A のキャッシュを削除する必要があります。ページ B:

<template>
  <div class="activity-list">
    第二个测试页面
    <button @click="back">提交代码</button>
  </div>
</template>

<script>
export default {
    
    
  name: "TestTwo",
  data() {
    
    
    return {
    
    }
  },
  created() {
    
    },
  mounted() {
    
    },
  methods: {
    
    
    back() {
    
    
      this.$store.commit("tagsView/DEL_CACHED_VIEW", {
    
     name: "TestOne" })
      this.$router.go(-1)
    }
  }
}
</script>

<style scoped lang="scss"></style>

tagsView/DEL_CACHED_VIEW を呼び出すと削除されていることがわかります。先に削除されているため、この時点でページAに戻ると、ページAが再度キャッシュに追加され、再びレンダリングが開始されます。

おすすめ

転載: blog.csdn.net/weixin_42349568/article/details/129322557