vue keep-aliveダイナミックキャッシュページの使用
20580 ワード
keep-aliveの使用
ビジネスではtab_を使用したプロジェクトのニーズによく遭遇します.barは開いているページを管理し、切り替え中にページの状態をキャッシュしたい場合はラベルページを閉じ、左側のメニューバーからページを開くと再ロードされます.以下に、いくつかの一般的なソリューションとメリットとデメリットと限界を示します.
keep-aliveの公式ドキュメント:https://cn.vuejs.org/v2/api/#keep-alive
1:router-viewを使用してv-ifを組み合わせる:
適用:元のrouter関連コンポーネントに匿名コンポーネント(nameプロパティを設定していない)が存在する利点:改造コストの低い欠点:新しく開いたページがあるとkeep-aliveコンポーネントが再ロードされ、すべてのキャッシュが失われる
2:keep-aliveを使用したincludeパラメータ
適用:すべての関連routerのページコンポーネントにname属性が設定されている欠点:元のプロジェクトには匿名コンポーネントが存在し、name属性を追加する必要があります(includeはrouter_nameではなくコンポーネントnameのみを識別します)
3:keep-aliveダイナミッククリアキャッシュ(推奨)
適用:システムに匿名コンポーネントが一部存在し、keep-aliveキャッシュを柔軟に制御する必要がある
3.1最初にすべてのコンポーネントをキャッシュする
3.2 vuexに現在開いているtab_を保存barデータ(具体的な書き方は人によって異なり、ここでは考え方のみを示す)
3.3 mixinファイルでルーティングガードを定義する(キー)
現在のページチェックを閉じると、beforeRouteLeaveがトリガーされ、現在閉じているtabがtab_に存在するかどうかを判断します.barリストで、存在しない場合は、現在のコンポーネントキャッシュが消去されます.
3.4 tab_closeの関数で現在のルーティング以外のページラベルをキャッシュ処理する
閉じられたページタグが現在のルーティングが存在しない場合は、ルーティングの変更がないため、ルーティングガードをトリガーすることはできません.ページを閉じた場所でいくつかの操作を行う必要があります.
3.5現在のすべてのラベルをすばやく閉じるとき
ビジネスではtab_を使用したプロジェクトのニーズによく遭遇します.barは開いているページを管理し、切り替え中にページの状態をキャッシュしたい場合はラベルページを閉じ、左側のメニューバーからページを開くと再ロードされます.以下に、いくつかの一般的なソリューションとメリットとデメリットと限界を示します.
keep-aliveの公式ドキュメント:https://cn.vuejs.org/v2/api/#keep-alive
1:router-viewを使用してv-ifを組み合わせる:
適用:元のrouter関連コンポーネントに匿名コンポーネント(nameプロパティを設定していない)が存在する利点:改造コストの低い欠点:新しく開いたページがあるとkeep-aliveコンポーネントが再ロードされ、すべてのキャッシュが失われる
// home.vue
// pageLoding keep-alive
<div class="firame-router" v-if="!$store.state.pageLoding">
<keep-alive>
<router-view v-if="$store.state.bar_data_name.indexOf($route.name)>-1"></router-view>
</keep-alive>
<router-view v-if="$store.state.bar_data_name.indexOf($route.name)<0"></router-view>
</div>
// store/index.js
// bar_data menu_name
refresh_bar_data(s, v) {
s.bar_data = v
// bar_data_name
let bar_data = v
let bar_data_name = []
bar_data.forEach(element => {
let name = s.menu_map.get(element).code
bar_data_name.push(name)
});
s.bar_data_name = bar_data_name
},
2:keep-aliveを使用したincludeパラメータ
適用:すべての関連routerのページコンポーネントにname属性が設定されている欠点:元のプロジェクトには匿名コンポーネントが存在し、name属性を追加する必要があります(includeはrouter_nameではなくコンポーネントnameのみを識別します)
// include name ( router_name)
<div class="firame">
{
{
$store.state.bar_data_name}} // bar
<div class="firame-router">
<keep-alive>
<router-view :include="$store.state.bar_data_name"></router-view>
</keep-alive>
</div>
</div>
3:keep-aliveダイナミッククリアキャッシュ(推奨)
適用:システムに匿名コンポーネントが一部存在し、keep-aliveキャッシュを柔軟に制御する必要がある
3.1最初にすべてのコンポーネントをキャッシュする
<div class="firame-router">
<keep-alive>
<router-view></router-view>
</keep-alive>
</div>
3.2 vuexに現在開いているtab_を保存barデータ(具体的な書き方は人によって異なり、ここでは考え方のみを示す)
refresh_bar_data(s, v) {
s.bar_data = v
// bar_data_name
let bar_data = v
let bar_data_name = []
bar_data.forEach(element => {
let name = s.menu_map.get(element).code
bar_data_name.push(name)
});
s.bar_data_name = bar_data_name
},
3.3 mixinファイルでルーティングガードを定義する(キー)
現在のページチェックを閉じると、beforeRouteLeaveがトリガーされ、現在閉じているtabがtab_に存在するかどうかを判断します.barリストで、存在しない場合は、現在のコンポーネントキャッシュが消去されます.
beforeRouteLeave(to, from, next) {
let flag = true
this.$store.state.bar_data_name.forEach(e => {
// bar_data_name tabs
if(from.name == e) {
flag = false
}
})
if(flag && this.$vnode.parent && this.$vnode.parent.componentInstance.cache) {
let key = this.$vnode.tag.split('-')[2] // key
let cache = this.$vnode.parent.componentInstance.cache //
let keys = this.$vnode.parent.componentInstance.keys //
if(cache[key] != null) {
delete cache[key]
let index = keys.indexOf(key)
if(index > -1) {
keys.splice(index, 1)
}
}
}
next()
},
3.4 tab_closeの関数で現在のルーティング以外のページラベルをキャッシュ処理する
閉じられたページタグが現在のルーティングが存在しない場合は、ルーティングの変更がないため、ルーティングガードをトリガーすることはできません.ページを閉じた場所でいくつかの操作を行う必要があります.
tabs_close(m) {
// ,refresh_bar_data active ( beforeRouteLeave)
if (this.$parent.active_menu_key != m.id) {
this.$router.push({
name: m.code });
}
let set = new Set(this.bar_data)
set.delete(m.id)
let data = Array.from(set)
let key = data[this.index] || data[this.index - 1]
this.$store.commit('refresh_bar_data', [...set])
this.$parent.active_menu_key = key
},
3.5現在のすべてのラベルをすばやく閉じるとき
clear_all_tabs() {
this.$store.commit('refresh_bar_data', [])
this.$parent.active_menu_key = -1
// keep-alive
// this.$parent || home.vue
// this.$parent.$refs['router_view'] || router_view
// this.$parent.$refs['router_view'].$vnode.parent.componentInstance.cache || keep-alive
try {
this.$parent.$refs['router_view'].$vnode.parent.componentInstance.cache = []
} catch (error) {
console.log(error)
}
}