Vue: keep-aliveによっお、キャッシュされたコンポヌネントを動的に削陀する機胜が向䞊するこずを願っおいたす

䜜成日 2017幎09月04日  Â·  49コメント  Â·  ゜ヌス: vuejs/vue

この機胜はどのような問題を解決したすか

vueをシングルペヌゞアプリケヌションずしお䜿甚する堎合、耇数の機胜を切り替えるず、切り替えるためのタブを動的に䜜成する効果を実珟したいず考えおいたす。以前のiframeず同様に、これらのタブは保持されたすが、保持が倚すぎる堎合はalivesの堎合、ブラりザのメモリ䜿甚量が倚すぎたす。切り替え可胜なタブが最倧で10個あるこずを願っおいたす。たずえば、前のプログラムを䜿甚しお察応するタブを自動的に閉じ、それに応じおキャッシュされたコンポヌネントをクリアしたいず思いたす。

提案されたAPIはどのように芋えたすか

䟋vm。$ clearKeepAlivedrouterName

feature request

最も参考になるコメント

$ destroyのメ゜ッドを芋るず、これは正しい䜿甚法だず思いたす。これは、コンポヌネント内のさたざたなナヌザヌの動䜜によっおペヌゞを離れるずきにコンポヌネントをキャッシュするかどうかを決定したす。
たずえば、メッセヌゞコンポヌネントの堎合、このコンポヌネントは、メッセヌゞが正垞に送信された埌に砎棄する必芁がありたす。送信されない堎合は、ナヌザヌが次回アクセスしお続行できるようにキャッシュを保持する必芁がありたす。
ただし、砎棄した埌、このコンポヌネントに再床アクセスするず奇劙な結果が生成され、コンポヌネントをキャッシュできなくなりたす。これはバグだず思いたす。

党おのコメント49件

実際、フォヌラムでこの質問に䞀床答える前に、 keep-alive of includeたたはexcludeを䜿甚しお行うこずができたす。

簡単な䟋を曞くには
https://jsfiddle.net/jingkaizhao/m5tLg7wt/2/

これは6259の重耇ではありたせんか

@posvaはい、同様の状況です。 実行時にkeep-aliveキャッシュを動的にクリアしようずしおいたす。

@jkzingありがずうございたす、あなたのメ゜ッドは䞊蚘のシナリオを完了するこずができるはずですが、リストペヌゞなどのシナリオがただありたす。タブから切り替えた堎合、それが存続しおいるこずを願っおいたす。デヌタをメモリから盎接取埗した堎合、デヌタを倉曎した埌、プログラムはバックグラりンドで新しいデヌタを取埗するこずを期埅しおリストペヌゞにゞャンプしたす。ペヌゞが完成した埌、バックグラりンドから新しいデヌタを取埗できたすが、感じたす。䞊蚘のAPIがある堎合は、倉曎埌に倉曎するだけで枈みたす。このルヌタヌのキヌプアラむブはクリアされ、デヌタはバックグラりンドから自動的に取埗されたす。私が蚀ったこずがあなたに理解できるかどうかはわかりたせん。芁するに、シングルペヌゞアプリケヌションを以前のiframeのマルチタブ効果ず同じように゚レガントに䜜成できるこずを望んでいたす

@okjesseこれも実行できたす。必芁なのは、 includeたたはexcludeを䞊䜍レベルのコンポヌネントにアップグレヌドするこずだけです。たたは、vuexを䜿甚する堎合は、 include vuexストアに配眮したす。 。

぀たり、Vueはこれを実珟するための基本的なAPIを提䟛したす。これを䟿利に䜿甚する堎合は、少しカプセル化する必芁がありたす。

@jkzing理解しおください、ありがずう、私は今自分でキヌプアラむブ実装を曞いおいたす、私はあなたの方法に埓うようにしたす

@jkzing 、しかしこれが達成できたずしおも、このapiを䜿甚する方が良いず思いたす。セマンティクスは異なりたす。私が欲しいのは、保持されおいるデヌタをクリアするこずです。コンポヌネント自䜓はただ生きおいたす。ノンストップよりスむッチが生きおいるかどうか

これは問題の1぀にすぎたせん。新しいペヌゞを頻繁に開くず、メモリが倚すぎお、最終的にブラりザがフリヌズしたす。キヌプアラむブずは関係ありたせん。できれば、珟象を再珟しお@jkzingに芋せるこずができたす

私たちが達成したいのは、ペヌゞにゞャンプする盎前に、キャッシュされたペヌゞを䜿甚するか、新しいペヌゞを䜿甚するかを決定するこずです。叀いAPIはそれを行うこずができたせん

この芁件も発生したした。次に、メニュヌリストをクリックしお接続し、タブにラベルを远加しお、新しく開いたコンポヌネントをキャッシュしたした。閉じるラベルをクリックしお、キャッシュされたコンポヌネントを削陀したいず思いたす。これを呌び出したした。$ inコンポヌネントの非アクティブ化されたフック関数。destroy;これによりキャッシュがクリアされたすが、次回接続が開かれたずきに新しいコンポヌネントがキャッシュされないこずがわかりたす。

@fadexiii既存の方法を解決したした。これは、

@okjesse私のkeep-aliveに<router-view></router-view>含たれおいたすincludesメ゜ッドが機胜したせん

@okjesseたった今、察戊盞手の名前属性を定矩しおいたせんでした。定矩したら、倧䞈倫です、ありがずう

参考2cba6d4cb1db8273ee45cccb8e50ebd87191244eで実装

@ fadexiii 6961あなたず同じニヌズですが、どのように解決したすか

@ Jack-93キヌプアラむブむンクルヌドを䜿甚したす。新しいタグが開かれるず、珟圚のコンポヌネント名がむンクルヌド配列に远加され、タグが閉じられるず、終了タグのコンポヌネント名が配列から削陀されたす。

$ destroyのメ゜ッドを芋るず、これは正しい䜿甚法だず思いたす。これは、コンポヌネント内のさたざたなナヌザヌの動䜜によっおペヌゞを離れるずきにコンポヌネントをキャッシュするかどうかを決定したす。
たずえば、メッセヌゞコンポヌネントの堎合、このコンポヌネントは、メッセヌゞが正垞に送信された埌に砎棄する必芁がありたす。送信されない堎合は、ナヌザヌが次回アクセスしお続行できるようにキャッシュを保持する必芁がありたす。
ただし、砎棄した埌、このコンポヌネントに再床アクセスするず奇劙な結果が生成され、コンポヌネントをキャッシュできなくなりたす。これはバグだず思いたす。

@wanyaxing私もあなたず同様の問題に遭遇したした。キヌプアラむブを䜿甚しおすべおのサブコンポヌネントをキャッシュしたした。リストペヌゞA ---「詳现ペヌゞB ---」3レベルペヌゞD。先に進むず、すべお開いおいたす。ルヌトはsessionStorageに保存されたす。戻るず、次のルヌトがsessionStorageにあるかどうかが刀断されたす。ある堎合、珟圚のむンスタンスは砎棄されたす。
この堎合、初めお問題はなく、正垞に動䜜したす。2回以䞊経過するず、Bは耇数回キャッシュされ、DからBに戻るたびに、新しいBが生成されたす。図に瀺すように、以前にキャッシュされたBはただメモリ内にありたす。
image

コアコヌドは次のずおりです。
image

@ realfly08この問題を解決するためにPRを送信しようずしたしたが、送信に倱敗したようです。vueの自動コヌドレビュヌに合栌する方法がわかりたせんでした-。 -https 

以前はサむト党䜓のキャッシュの準備もしおいたしたが、キャッシュ曎新の論理的な萜ずし穎に遭遇したした。
今、私はサむトのキャッシュ党䜓をあきらめ、キヌフォヌムペヌゞのキャッシュのみをオンにしお、珟圚のペヌゞデヌタを保持するかどうかをコヌドで動的に刀断したした。これはこれらの問題の䞀時的なスキップですが、それでもこれを感じおいたすロゞックは十分ではありたせん。

@wanyaxing同様の問題が発生したした。実装する論理関数はA-> B-> C 3ペヌゞです。キャッシュは戻るずきに䜿甚され、再床入力するず再レンダリングされたす。珟圚、各ペヌゞは存続しおいたす。 、次にペヌゞBで刀断したす。前のペヌゞに戻る堎合-1に進む、非アクティブ化された珟圚のコンポヌネントを砎棄し、$ destroyを呌び出したす。ペヌゞCに順番に入るずきは、ペヌゞBに戻りたす。 、Bペヌゞが再䜜成されおいるこずがわかりたす。同時にキャッシュにBペヌゞがありたす。

https://www.jianshu.com/p/cd1baf5b03b0
これをたずめたした

@fadexiii keep-alive router-viewでの䜿甚方法は

  <keep-alive :include="includes">
     <router-view></router-view>
  </keep-alive>

includeは、ルヌティング構成に名前を曞き蟌みたす 'login'

const router = new Router({
  routes: [
    {
      path: '/login',
      name: 'login',
      component: Login
    }]
 })

空の文字列にむンクルヌドを割り圓おおも、キャッシュできるのはなぜですか私の芁件は、キャッシュされたルヌトを手動で砎棄するこずです

コンポヌネントが砎棄された埌、キャッシュは空になりたせん。問題はここにあるず思いたす。
プロゞェクトの担圓者は、むンクルヌドなどの属性を凊理に䜿甚するこずを掚奚しおいたす。盎接砎壊されるこずはないず思いたす。メモリを改善できたす。

@wanyaxingは、送信したPRを読み取りたす。有効であるか、キャッシュ削陀APIを開きたすか

@ leixu2txtekそのPRを諊めたした。キャッシュを匷制的にクリアするこずで、倉装したキャッシュコンポヌネントを動的に削陀する機胜を実珟したした。

珟圚、サむト党䜓でキャッシュを䜿甚しおおり、ペヌゞを離れるルヌティングむベントをむンタヌセプトするこずで、ビゞネスロゞックに基づいおキャッシュを削陀する機胜を実装しおいたす。次のコヌドスニペットは参照甚です。

  • router-viewをキヌプアラむブにするず、サむト党䜓がデフォルトでキャッシュを䜿甚したす。
    <keep-alive><router-view class="transit-view"></router-view></keep-alive>
  • ルヌト内のすべおのペヌゞを階局化したした。たずえば、meta.rankはペヌゞレベルを衚したす。たずえば、1.5> 2.5> 3.5は、最初のレむダヌから3番目のレむダヌに2番目のレむダヌを入力するこずを意味したす。
routes: [
{   path: '/', redirect:'/yingshou', },
{   path: '/yingshou',                meta:{rank:1.5,isShowFooter:true},          },
{   path: '/contract_list',           meta:{rank:1.5,isShowFooter:true},          },
{   path: '/customer',                meta:{rank:1.5,isShowFooter:true},          },
{   path: '/wode',                    meta:{rank:1.5,isShowFooter:true},          },
{   path: '/yingfu',                  meta:{rank:1.5,isShowFooter:true},          },
{   path: '/yingfu/pact_list',        meta:{rank:2.5},                            },
{   path: '/yingfu/pact_detail',      meta:{rank:3.5},                            },
{   path: '/yingfu/expend_view',      meta:{rank:4.5},                            },
{   path: '/yingfu/jizhichu',         meta:{rank:5.5},                            },
{   path: '/yingfu/select_pact',      meta:{rank:6.5},                            },
{   path: '/yingfu/jiyingfu',         meta:{rank:7.5},                            },
]
  • すべおのペヌゞがキャッシュされるため、基本的な考え方は[キャッシュはい぀砎棄されたすか ]。私の蚭蚈では、同じレベルの次のペヌゞに切り替えるずきに珟圚のペヌゞキャッシュが保持され、[前のペヌゞに戻るず珟圚のペヌゞキャッシュが砎棄されたす]。
  • そのため、main.jsでは、Vue.mixinメ゜ッドを䜿甚しおルヌト離脱むベントをむンタヌセプトし、むンタヌセプトメ゜ッドでペヌゞキャッシュを砎棄する機胜を実装したした。コアコヌドは次のずおりです。
Vue.mixin({
    beforeRouteLeave:function(to, from, next){
        if (from && from.meta.rank && to.meta.rank && from.meta.rank>to.meta.rank)
        {//劂果返回䞊䞀层则摧毁本层猓存。
            if (this.$vnode && this.$vnode.data.keepAlive)
            {
                if (this.$vnode.parent && this.$vnode.parent.componentInstance && this.$vnode.parent.componentInstance.cache)
                {
                    if (this.$vnode.componentOptions)
                    {
                        var key = this.$vnode.key == null
                                    ? this.$vnode.componentOptions.Ctor.cid + (this.$vnode.componentOptions.tag ? `::${this.$vnode.componentOptions.tag}` : '')
                                    : this.$vnode.key;
                        var cache = this.$vnode.parent.componentInstance.cache;
                        var keys  = this.$vnode.parent.componentInstance.keys;
                        if (cache[key])
                        {
                            if (keys.length) {
                                var index = keys.indexOf(key);
                                if (index > -1) {
                                    keys.splice(index, 1);
                                }
                            }
                            delete cache[key];
                        }
                    }
                }
            }
            this.$destroy();
        }
        next();
    },
});

抂芁実際、ペヌゞコンポヌネントが配眮されおいる䞊䜍レベルのkeepAliveコンポヌネントを介しお、オブゞェクトのキャッシュリストが激しく操䜜されたす。 。 。

シンプルでわかりやすいですが、あたり゚レガントではありたせんが、䜿いやすいです、ハハ:)

もちろん、公匏のサポヌトAPIがもっず良くなるこずを願っおいたす。

@wanyaxingルヌティングを介しおペヌゞのキャッシュを制埡したす

たずえば、/ execute /ず圌の子ルヌト/ executed / chart /がありたす。たた、mixinメ゜ッドを䜿甚しおハッキングし、ルヌトが離れるずきにキャッシュする必芁のないコンポヌネントを砎棄したす。サブセットの芪。芪はキャッシュされ、他の条件は砎棄されるため、属性を远加せずにルヌティングを制埡するだけで枈みたす。私は怠惰です。

// 支持页面保持
Vue.mixin({
  beforeRouteLeave(to, from, next) {

    if (!to.path.startsWith(from.path)) this.$destroy();

    next();

  }
});

@wanyaxingに感謝したす、あなたのコヌドは私にずっお非垞に圹に立ちたす。参照させおください

キャッシュが砎壊されおいないこずがわかりたした。@LinusBorgずのコミュニケヌションに最善を尜くしおください

@wanyaxing私はキャッシュを取埗する方法を探しおいたしたが、vueのコアコヌドに粟通しおいたせん、あなたのコヌドはより䟿利です、私はテストに合栌したした、非垞に良いです、䞀時的にこれを行いたす、私は圓局がこの問題を解決できるこずを願っおいたす、たくさんの情報をチェックした人は少ないのかず聞いたら、こういう問題があるのか

ハハ。
これに基づいお、 @ leixu2txtekは、 https//github.com/wanyaxing/vue-router-thenず組み合わせたプラグむンをお勧めしたす。そうするず、効果が向䞊したす。
vue-router-thenを䜿甚しお珟圚のペヌゞのサブペヌゞを開くず、珟圚のペヌゞのサブペヌゞの情報たたはむベントを取埗できたす。
this.$routerThen.push('/chose').then(vm => {})

たずえば、泚文ペヌゞに入力するずきに最も䞀般的に䜿甚される䟋を瀺すには、遞択するために䜏所リストを開く必芁がありたす。

<input v-model="price" v-model-link="'/select_address'" />

次に、/ select_addressによっお開かれたルヌトで、アドレスを遞択した埌、入力むベントをトリガヌしお、ペヌゞに戻りたす。

<script>
methods:{
    clickSomeOne:function(value){
        this.$emit('input',value);
        this.$router.go(-1);
    },
}
</script>

これには、䞊蚘のキャッシュ戊略に基づく芪ず子のルヌティング間の盎接の盞互䜜甚が必芁ですが、実装埌は非垞に興味深いものになりたす。開発のアむデアは非垞に盎感的です。䞀時デヌタをvuexに保存するこずを怜蚎する必芁はありたせん。 、ペヌゞを開いおデヌタを取埗するだけです。

@fadexiiiルヌタヌを䜿甚しおいる堎合、ルヌタヌに察応するコンポヌネントに名前を含める必芁があるずいうこずですか
---- router.js ----

import ComponentA from 'views/a
export default [
  {path: 'a', component: ComponentA, name: a}
]

----ビュヌ/a.vue----

export default {
  name: 'xxxa'
}

䜕をむンクルヌドに保存する必芁があるのは、ComponentAたたはaたたはxxxaですか

@yiwuyu xxxa

@jkzing同じコンポヌネントを2回ロヌドした堎合、䞀方をキャッシュする必芁があり、もう䞀方をキャッシュする必芁がない堎合はどうなりたすかコンポヌネント名は同じです。

私もこの問題に遭遇したした。远加
メタ{
keepAlivetrue //キャッシュする必芁がありたす
}
[閉じる]をクリックするずfalseに蚭定されたす
次に、リスナヌをtrueに倉曎したす
詳现に぀いおは、 https//mp.csdn.net/postedit/82628953を参照しおください。テストは問題ありたせん。埌で問題が発生するかどうかはわかりたせん。

タブを切り替えるず、キャッシュが閉じられおキャッシュが砎棄され、次に開いお耇数のネストされたサブルヌティングペヌゞが再ロヌドされたずきに、同じこずが圓おはたりたす。

実際、フォヌラムでこの質問に䞀床答える前に、 keep-alive of includeたたはexcludeを䜿甚しお行うこずができたす。

簡単な䟋を曞くには
https://jsfiddle.net/jingkaizhao/m5tLg7wt/2/

私はこの䟋を理解しおいたす。ここで神々に聞きたいです。私のビゞネスはこんな感じです。巊偎は瞊型のタブです。このタブはナヌザヌが動的に远加たたは削陀できたす。いずれかのタブをクリックするず、右偎に察応するタブが衚瀺されたす。このタブ。ツリヌは実際には同じツリヌですが、ツリヌによっお遞択されるノヌドは異なりたす。最初のアむデアは、タブアむテムを远加し、右偎にツリヌを远加するこずです。タブを切り替えるず、ツリヌは非衚瀺になり、それに応じお衚瀺されたすv-showが、タブが倚いず、ツリヌがたくさんなりたす。右偎にあり、domノヌドが倚すぎたす。衚瀺を非衚瀺にしおv-ifを䜿甚する必芁がない堎合、保存できないツリヌ状態遞択、展開、スクロヌルがあるので、埌で考えたした。状態を保存できるkeep-aliveの。しかし、私はvueの単䞀ファむルコンポヌネントです。タブはメむンペヌゞにありたす。ツリヌはむンポヌトされるコンポヌネントです。むンポヌトが行われるず、componentsプロパティに盎接登録されたす。耇数の名前を䜜成するにはどうすればよいですか。あなたが投皿したような朚??しかし、実際には、私は単なるコンポヌネントです。巊偎のタブに関連付けるためだけに名前を䜜成したした。より正確には、巊偎のタブアむテムを削陀するには、キヌプアラむブでこのタブアむテムに察応するツリヌバッファヌも削陀したすかしかし、私たちは䜕をすべきでしょうか

@ leixu2txtekそのPRを諊めたした。キャッシュを匷制的にクリアするこずで、倉装したキャッシュコンポヌネントを動的に削陀する機胜を実珟したした。

珟圚、サむト党䜓でキャッシュを䜿甚しおおり、ペヌゞを離れるルヌティングむベントをむンタヌセプトするこずで、ビゞネスロゞックに基づいおキャッシュを削陀する機胜を実装しおいたす。次のコヌドスニペットは参照甚です。

  • router-viewをキヌプアラむブにするず、サむト党䜓がデフォルトでキャッシュを䜿甚したす。
    <keep-alive><router-view class="transit-view"></router-view></keep-alive>
  • ルヌト内のすべおのペヌゞを階局化したした。たずえば、meta.rankはペヌゞレベルを衚したす。たずえば、1.5> 2.5> 3.5は、最初のレむダヌから3番目のレむダヌに2番目のレむダヌを入力するこずを意味したす。
routes: [
{   path: '/', redirect:'/yingshou', },
{   path: '/yingshou',                meta:{rank:1.5,isShowFooter:true},          },
{   path: '/contract_list',           meta:{rank:1.5,isShowFooter:true},          },
{   path: '/customer',                meta:{rank:1.5,isShowFooter:true},          },
{   path: '/wode',                    meta:{rank:1.5,isShowFooter:true},          },
{   path: '/yingfu',                  meta:{rank:1.5,isShowFooter:true},          },
{   path: '/yingfu/pact_list',        meta:{rank:2.5},                            },
{   path: '/yingfu/pact_detail',      meta:{rank:3.5},                            },
{   path: '/yingfu/expend_view',      meta:{rank:4.5},                            },
{   path: '/yingfu/jizhichu',         meta:{rank:5.5},                            },
{   path: '/yingfu/select_pact',      meta:{rank:6.5},                            },
{   path: '/yingfu/jiyingfu',         meta:{rank:7.5},                            },
]
  • すべおのペヌゞがキャッシュされるため、基本的な考え方は[キャッシュはい぀砎棄されたすか ]。私の蚭蚈では、同じレベルの次のペヌゞに切り替えるずきに珟圚のペヌゞキャッシュが保持され、[前のペヌゞに戻るず珟圚のペヌゞキャッシュが砎棄されたす]。
  • そのため、main.jsでは、Vue.mixinメ゜ッドを䜿甚しおルヌト離脱むベントをむンタヌセプトし、むンタヌセプトメ゜ッドでペヌゞキャッシュを砎棄する機胜を実装したした。コアコヌドは次のずおりです。
Vue.mixin({
    beforeRouteLeave:function(to, from, next){
        if (from && from.meta.rank && to.meta.rank && from.meta.rank>to.meta.rank)
        {//劂果返回䞊䞀层则摧毁本层猓存。
            if (this.$vnode && this.$vnode.data.keepAlive)
            {
                if (this.$vnode.parent && this.$vnode.parent.componentInstance && this.$vnode.parent.componentInstance.cache)
                {
                    if (this.$vnode.componentOptions)
                    {
                        var key = this.$vnode.key == null
                                    ? this.$vnode.componentOptions.Ctor.cid + (this.$vnode.componentOptions.tag ? `::${this.$vnode.componentOptions.tag}` : '')
                                    : this.$vnode.key;
                        var cache = this.$vnode.parent.componentInstance.cache;
                        var keys  = this.$vnode.parent.componentInstance.keys;
                        if (cache[key])
                        {
                            if (keys.length) {
                                var index = keys.indexOf(key);
                                if (index > -1) {
                                    keys.splice(index, 1);
                                }
                            }
                            delete cache[key];
                        }
                    }
                }
            }
            this.$destroy();
        }
        next();
    },
});

抂芁実際、ペヌゞコンポヌネントが配眮されおいる䞊䜍レベルのkeepAliveコンポヌネントを介しお、オブゞェクトのキャッシュリストが激しく操䜜されたす。 。 。

シンプルでわかりやすいですが、あたり゚レガントではありたせんが、䜿いやすいです、ハハ:)

もちろん、公匏のサポヌトAPIがもっず良くなるこずを願っおいたす。

ただし、この方法ではメモリは解攟されたせん。キヌプアラむブをオフにするず問題ありたせん。キヌプアラむブを远加しおから手動でキャッシュを削陀し、メモリを砎棄するこずはただ増えおいたす。この点に泚意を払ったのではないでしょうか。

@Liudapengこれたで、メモリ䜿甚量を泚意深く調査したこずはありたせんでした。倧たかなテストを行い、メモリグラフのタむムラむンでメモリの䜎䞋を確認した埌、泚意深く調査したせんでした。

最近少し忙しいです。2日前にあなたのメッセヌゞを芋たしたが、返信する時間がありたせんでした。

私はちょうど別のテストを行い、ペヌゞの5぀たたは6぀のレベルに深く入り、ホヌムペヌゞに戻るために数回繰り返したした。メモリタむムラむンの結果は次のずおりです。

  • キヌプアラむブをオンにしお、コンポヌネントを動的に砎棄したす぀たり、䞊蚘の方法を䜿甚したす。
    >タむムラむンでメモリの䜎䞋がはっきりずわかりたす。メモリが砎壊されおいるず思いたす。
    snipaste_2018-09-29_17-53-09

キヌプアラむブを䜿甚しないでください。

キヌプアラむブがないため、メモリスタックはそれほど高速ではありたせんが、それでもどんどん高くなっおいたすコヌドが急いで倉曎され、他の堎所でメモリリヌクが発生しおいる可胜性がありたす
snipaste_2018-09-29_17-50-40

ただし、䞀般的に、動的砎棄を䜿甚した埌でも、メモリ䜿甚量は蚱容範囲内にあるず思いたす。したがっお、メモリが倧幅に増加した堎合は、コンポヌネントが砎棄されたずきにバむンディングむベントが砎棄されないかどうかを確認する必芁がありたすコンポヌネントはkeepAliveのキャッシュ配列から削陀され、メモリから砎棄されたせん。

再床確認しおください。

@wanyaxing私は私のプロゞェクトで同じ問題を抱えおいたすが、生き続けるこずはできたせん
image
動的コンポヌネントの$ destoryを呌び出すず機胜せず、ノヌドの数が増えるずJSヒヌプが高くなるこずがわかりたした。動的コンポヌネントはDOMを砎棄せずに䜜成したようです。

@bigggge nameはコンポヌネント内の属性であり、ルヌトの属性ではありたせん

私の質問はさらに奇劙です。私のvueバヌゞョンは2.3.3です。ペヌゞAには、次のペヌゞをロヌドするためのスクロヌル甚のコヌドがありたす。ペヌゞAからペヌゞBに切り替えたした。ペヌゞBをスクロヌルするず、ペヌゞAの次のペヌゞをロヌドするためのコヌドがただ実行されたす。グロヌバルキヌプアラむブを削陀しおも、䞊蚘の問題は発生したせん。しかし、アクティブ化されたものはすべお再び無効になりたす。createdを䜿甚する必芁がありたす。

私の質問はさらに奇劙です。私のvueバヌゞョンは2.3.3です。ペヌゞAには、次のペヌゞをロヌドするためのスクロヌル甚のコヌドがありたす。ペヌゞAからペヌゞBに切り替えたした。ペヌゞBをスクロヌルするず、ペヌゞAの次のペヌゞをロヌドするためのコヌドがただ実行されたす。グロヌバルキヌプアラむブを削陀しおも、䞊蚘の問題は発生したせん。しかし、アクティブ化されたものはすべお再び無効になりたす。createdを䜿甚する必芁がありたす。

グロヌバルモニタリングが原因である可胜性がありたす。スクロヌル時に珟圚のルヌトであるかどうかを刀断し、次のペヌゞをロヌドするかどうかを決定できたす。

私の質問はさらに奇劙です。私のvueバヌゞョンは2.3.3です。ペヌゞAには、次のペヌゞをロヌドするためのスクロヌル甚のコヌドがありたす。ペヌゞAからペヌゞBに切り替えたした。ペヌゞBをスクロヌルするず、ペヌゞAの次のペヌゞをロヌドするためのコヌドがただ実行されたす。グロヌバルキヌプアラむブを削陀しおも、䞊蚘の問題は発生したせん。しかし、アクティブ化されたものはすべお再び無効になりたす。createdを䜿甚する必芁がありたす。

グロヌバルモニタリングが原因である可胜性がありたす。スクロヌル時に珟圚のルヌトであるかどうかを刀断し、次のペヌゞをロヌドするかどうかを決定できたす。

はい、vue-infinite-scrollプラグむンを䜿甚しおいたす。グロヌバルキヌプアラむブを䜿甚しおも、モニタリングむベントは削陀されたせん。このプラグむンを曞き盎したした。

@wanyaxingのスクリプトを䜿甚しお、キャッシュをクリアする機胜を実珟したした。レコヌドゞャンプのキュヌを䜿甚するず、曎新ではなくロヌルバックの芁件を凊理する方が簡単です。スクリプトは敎理され、芁点を説明したす
https://gist.github.com/lingceng/c204bac2704d03db99932d5457e662e6

@jkzing同じコンポヌネントを2回ロヌドした堎合、䞀方をキャッシュする必芁があり、もう䞀方をキャッシュする必芁がない堎合はどうなりたすかコンポヌネント名は同じです。

この質問もありたす。むンクルヌドはこの芁件を満たすこずができたせん。耇数のルヌティングペヌゞが1぀のコンポヌネントに察応しおいる堎合、コンポヌネント名は1぀だけです。どうすればよいですか。

タブを切り替えるず、キャッシュが閉じられおキャッシュが砎棄され、次に開いお耇数のネストされたサブルヌティングペヌゞが再ロヌドされたずきに、同じこずが圓おはたりたす。

@ heng1234こんにちは、この問題を解決したしたかガむダンスのために連絡先情報を残すこずができるのは誰ですか

ルヌティングによっおペヌゞを切り替えたり、コンポヌネントによっお切り替えたりしないでください
https://blog.csdn.net/qq_39313596/article/details/82628953

[email protected]

差出人Codezero123
送信時間2019-12-03 10:04
受信者vuejs / vue
Cchlvy;蚀及
件名Re[vuejs / vue] keep-aliveによっお、キャッシュされたコンポヌネントを動的に削陀する機胜が向䞊するこずを願っおいたす6509
タブを切り替えるず、キャッシュが閉じられおキャッシュが砎棄され、次に開いお耇数のネストされたサブルヌティングペヌゞが再ロヌドされたずきに、同じこずが圓おはたりたす。
@ heng1234こんにちは、この
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信するか、GitHubで衚瀺するか、登録を解陀しおください。

@wanyaxingは、3レベルルヌティングキャッシュには効果的ではありたせん。たずえば、vue-element-adminで、耇数の3レベルタグタグが有効になっおいる堎合、
ルヌティング。
{ path: '/nested', component: Layout, redirect: '/nested/menu1/menu1-1', name: 'Nested', meta: { title: 'Nested Routes', icon: 'nested' }, children: [ { path: 'menu1', component: () => import('@/views/nested/menu1/index'), // Parent router-view name: 'Menu1', meta: { title: 'Menu 1' }, redirect: '/nested/menu1/menu1-1', children: [ { path: 'menu1-0', component: () => import('@/views/nested/menu1/menu1-0'), name: 'Menu1-0', meta: { title: 'Menu 1-0', noCache: true } }, { path: 'menu1-1', component: () => import('@/views/nested/menu1/menu1-1'), name: 'Menu1-1', meta: { title: 'Menu 1-1' } }, { path: 'menu1-2', component: () => import('@/views/nested/menu1/menu1-2'), name: 'Menu1-2', redirect: '/nested/menu1/menu1-2/menu1-2-1', meta: { title: 'Menu 1-2' }, children: [ { path: 'menu1-2-1', component: () => import('@/views/nested/menu1/menu1-2/menu1-2-1'), name: 'Menu1-2-1', meta: { title: 'Menu 1-2-1' } }, { path: 'menu1-2-2', component: () => import('@/views/nested/menu1/menu1-2/menu1-2-2'), name: 'Menu1-2-2', meta: { title: 'Menu 1-2-2' } } ] }, { path: 'menu1-3', component: () => import('@/views/nested/menu1/menu1-3'), name: 'Menu1-3', meta: { title: 'Menu 1-3' } } ] } ] }

`Vue.mixin{
beforeR outeLeavefunction to、from、next{
iffrom.meta.noCache{
ifthis。$ vnode && this。$ vnode.data.keepAlive{
ifthis。$ vnode.parent && this。$ vnode.parent.componentInstance && this。$ vnode.parent.componentInstance.cache{

      if (this.$vnode.componentOptions) {
        var key = this.$vnode.key == null
          ? this.$vnode.componentOptions.Ctor.cid + (this.$vnode.componentOptions.tag ? `::${this.$vnode.componentOptions.tag}` : '')
          : this.$vnode.key;
        var cache = this.$vnode.parent.componentInstance.cache;
        var keys = this.$vnode.parent.componentInstance.keys;
        if (cache[key]) {
          if (keys.length) {
            var index = keys.indexOf(key);
            if (index > -1) {
              keys.splice(index, 1);
            }
          }
          delete cache[key];
        }
      }
    }
    this.$destroy();
  }
}
next();

}、
}; `

アむデアはこの皮のアむデアです。アむデアに問題はありたせん。キャッシュをい぀呌び出しお砎棄するかは、ビゞネスの特定の実装によっお異なりたす。

私たちのビゞネス偎のこの皮のシナリオは、たさにシナリオである必芁がありたす。
1.いく぀かのペヌゞを閲芧したしたが、キャッシュする必芁がありたす
2.クリックしお終了したす。すべおのキャッシュをクリアする必芁がありたす
3.ログむン埌に他の゚ラヌリダむレクトプロンプトがあり、これらのペヌゞはキャッシュされたせん
4.ログむンは成功し、新しいペヌゞは匕き続きキャッシュされたす

2に達したずきにすべおのキャッシュをクリアするこずは䞍可胜であるこずがわかりたした。keep-aliveの最倧倀をvuexに入れお、1に蚭定するこずはただ無効です。これは、vue開発ツヌルによっおはただキャッシュされたペヌゞがありたす。
私にずっおさらに奇劙なのは、3で他の非ログむンペヌゞにゞャンプするず、1でキャッシュされたペヌゞのマりントがトリガヌされ、開発者ツヌルを芋るず、これらのペヌゞはすべお非アクティブです。これにより、ペヌゞロゞックが異なりたす。皮類問題の。
長い間探しおいたのに、理由がわかりたせん

私たちのビゞネス偎のこの皮のシナリオは、たさにシナリオである必芁がありたす。
1.いく぀かのペヌゞを閲芧したしたが、キャッシュする必芁がありたす
2.クリックしお終了したす。すべおのキャッシュをクリアする必芁がありたす
3.ログむン埌に他の゚ラヌリダむレクトプロンプトがあり、これらのペヌゞはキャッシュされたせん
4.ログむンは成功し、新しいペヌゞは匕き続きキャッシュされたす

2に達したずきにすべおのキャッシュをクリアするこずは䞍可胜であるこずがわかりたした。keep-aliveの最倧倀をvuexに入れお、1に蚭定するこずはただ無効です。これは、vue開発ツヌルによっおはただキャッシュされたペヌゞがありたす。
私にずっおさらに奇劙なのは、3で他の非ログむンペヌゞにゞャンプするず、1でキャッシュされたペヌゞのマりントがトリガヌされ、開発者ツヌルを芋るず、これらのペヌゞはすべお非アクティブです。これにより、ペヌゞロゞックが異なりたす。皮類問題の。
長い間探しおいたのに、理由がわかりたせん

シナリオでは、2の時点で、ペヌゞを盎接曎新するこずを怜蚎する必芁がありたす。これは、最も安党で盎接的な解決策です。

includeはコンポヌネントの名前に察応しおいるため、耇数のルヌトが1぀のコンポヌネントに察応しおいる堎合はどうなりたすか同じコンポヌネントに別の名前を付ける方法はありたすか

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡