Rumah > Artikel > hujung hadapan web > Mari kita bincangkan tentang pemahaman komponen terbina dalam Vue kekal hidup
Apa itu Keep-alive? Artikel berikut akan membincangkan pemahaman anda tentang vue komponen terbina dalam keep-alive. Saya harap ia akan membantu anda!
, keep-alive
pembangunan bahagian hadapan webvue
]DOM
Apabila membungkus komponen dinamik, tika komponen tidak aktif akan dicache dan bukannya memusnahkannya .
berikut: keep-alive
keep-alive
- rentetan atau ungkapan biasa. Hanya komponen dengan nama yang sepadan akan dicache props
include
exclude
max
dan keep-alive
:
<keep-alive> <component :is="view"></component> </keep-alive>
Padanan terlebih dahulu menyemak pilihan includes
bagi komponen itu sendiri Jika pilihan exclude
tidak tersedia, ia sepadan dengan nama pendaftaran setempatnya (nilai utama komponen
<keep-alive include="a,b"> <component :is="view"></component> </keep-alive> <!-- 正则表达式 (使用 `v-bind`) --> <keep-alive :include="/a|b/"> <component :is="view"></component> </keep-alive> <!-- 数组 (使用 `v-bind`) --> <keep-alive :include="['a', 'b']"> <component :is="view"></component> </keep-alive>
Komponen dengan cache keep-alive akan mempunyai dua lagi cangkuk kitaran hayat (name
dan name
): components
Apabila memasukkan komponen untuk yang pertama. masa: activated
> deactivated
> memasuki komponen semula:
beforeRouteEnter
–>beforeCreate
–>created
, pada masa ini halaman senarai mestilah mounted
activated
beforeRouteLeave
daripada deactivated
–> beforeRouteEnter
–>activated
–>beforeRouteLeave
, pada masa ini, anda boleh mengawal deactivated
keepalive
首页
ialah komponen terbina dalam 列表页
商详页
再返回
Lokasi kod sumber: src/core /components/keep-alive.jskeep-alive
Anda boleh melihatnya komponen tidak mempunyai 首页
, tetapi menggunakan 列表页
Apabila komponen dipaparkan, fungsi 商详页
akan dilaksanakan secara automatik 返回到列表页(需要缓存)
返回到首页(需要缓存)
ialah objek yang digunakan untuk menyimpan komponen yang perlu dicache. Ia akan disimpan dalam bentuk berikut: 再次进入列表页(不需要缓存)
keep-alive
dilaksanakan apabila komponen dimusnahkan keepAlive
{ path: 'list', name: 'itemList', // 列表页 component (resolve) { require(['@/pages/item/list'], resolve) }, meta: { keepAlive: true, title: '列表页' } }Perhatikan perubahan
dan 7c9485ff8c3cba5ae9343ed63c2dc3f7
dalam fungsi cangkuk
<div id="app" class='wrapper'> <keep-alive> <!-- 需要缓存的视图组件 --> <router-view v-if="$route.meta.keepAlive"></router-view> </keep-alive> <!-- 不需要缓存的视图组件 --> <router-view v-if="!$route.meta.keepAlive"></router-view> </div>
, iaitu seperti berikut: keep-alive
vue
dalam fungsi ini dan keluarkan setiap Nilai
item digunakan untuk memadankan peraturan caching baharu Jika ia tidak sepadan, ini bermakna komponen tidak perlu lagi dicache di bawah peraturan caching baharu dan fungsiexport default { name: 'keep-alive', abstract: true, props: { include: [String, RegExp, Array], exclude: [String, RegExp, Array], max: [String, Number] }, created () { this.cache = Object.create(null) this.keys = [] }, destroyed () { for (const key in this.cache) { pruneCacheEntry(this.cache, key, this.keys) } }, mounted () { this.$watch('include', val => { pruneCache(this, name => matches(val, name)) }) this.$watch('exclude', val => { pruneCache(this, name => !matches(val, name)) }) }, render() { /* 获取默认插槽中的第一个组件节点 */ const slot = this.$slots.default const vnode = getFirstComponentChild(slot) /* 获取该组件节点的componentOptions */ const componentOptions = vnode && vnode.componentOptions if (componentOptions) { /* 获取该组件节点的名称,优先获取组件的name字段,如果name不存在则获取组件的tag */ const name = getComponentName(componentOptions) const { include, exclude } = this /* 如果name不在inlcude中或者存在于exlude中则表示不缓存,直接返回vnode */ if ( (include && (!name || !matches(include, name))) || // excluded (exclude && name && matches(exclude, name)) ) { return vnode } const { cache, keys } = this /* 获取组件的key值 */ const key = vnode.key == null // same constructor may get registered as different local components // so cid alone is not enough (#3269) ? componentOptions.Ctor.cid + (componentOptions.tag ? `::${componentOptions.tag}` : '') : vnode.key /* 拿到key值后去this.cache对象中去寻找是否有该值,如果有则表示该组件有缓存,即命中缓存 */ if (cache[key]) { vnode.componentInstance = cache[key].componentInstance // make current key freshest remove(keys, key) keys.push(key) } /* 如果没有命中缓存,则将其设置进缓存 */ else { cache[key] = vnode keys.push(key) // prune oldest entry /* 如果配置了max并且缓存的长度超过了this.max,则从缓存中删除第一个 */ if (this.max && keys.length > parseInt(this.max)) { pruneCacheEntry(cache, keys[0], keys, this._vnode) } } vnode.data.keepAlive = true } return vnode || (slot && slot[0]) } }dipanggil untuk mengalih keluar. ia daripada
Hanya alih keluar objek template
render
Fungsi caching paling berkuasa tentang render
ialah melaksanakannya dalam fungsi
komponen: this.cache
this.cache = { 'key1':'组件1', 'key2':'组件2', // ... }Selepas mendapat nilai
, pergi ke objek pruneCacheEntry
untuk mencari sama ada terdapat nilai ini, bermakna komponen itu mempunyai cache, iaitu, ia mencecah cache, seperti berikut:
/* 如果命中缓存,则直接从缓存中拿 vnode 的组件实例 */ if (cache[key]) { vnode.componentInstance = cache[key].componentInstance /* 调整该组件key的顺序,将其从原来的地方删掉并重新放在最后一个 */ remove(keys, key) keys.push(key) }
直接从缓存中拿 vnode
的组件实例,此时重新调整该组件key
的顺序,将其从原来的地方删掉并重新放在this.keys
中最后一个
this.cache
对象中没有该key
值的情况,如下:
/* 如果没有命中缓存,则将其设置进缓存 */ else { cache[key] = vnode keys.push(key) /* 如果配置了max并且缓存的长度超过了this.max,则从缓存中删除第一个 */ if (this.max && keys.length > parseInt(this.max)) { pruneCacheEntry(cache, keys[0], keys, this._vnode) } }
表明该组件还没有被缓存过,则以该组件的key
为键,组件vnode
为值,将其存入this.cache
中,并且把key
存入this.keys
中
此时再判断this.keys
中缓存组件的数量是否超过了设置的最大缓存数量值this.max
,如果超过了,则把第一个缓存组件删掉
解决方案可以有以下两种:
每次组件渲染的时候,都会执行beforeRouteEnter
beforeRouteEnter(to, from, next){ next(vm=>{ console.log(vm) // 每次进入路由执行 vm.getData() // 获取数据 }) },
在keep-alive
缓存的组件被激活的时候,都会执行actived
钩子
activated(){ this.getData() // 获取数据 },
注意:服务器端渲染期间avtived
不被调用
Atas ialah kandungan terperinci Mari kita bincangkan tentang pemahaman komponen terbina dalam Vue kekal hidup. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!