찾다
웹 프론트엔드View.jsVue의 내장 구성 요소인 연결 유지에 대한 이해에 대해 이야기해 보겠습니다.

연결 유지란 무엇인가요? 다음 기사에서는 vue 내장 구성 요소 연결 유지에 대한 이해에 대해 설명하겠습니다. 도움이 되기를 바랍니다.

Vue의 내장 구성 요소인 연결 유지에 대한 이해에 대해 이야기해 보겠습니다.

1. Keep-alive란 무엇입니까

keep-alivevue에 내장된 구성 요소로 구성 요소 전환 중에 상태를 유지할 수 있습니다. . 메모리에서 DOM의 반복 렌더링을 방지합니다. [관련 권장사항: vuejs 비디오 튜토리얼keep-alivevue中的内置组件,能在组件切换过程中将状态保留在内存中,防止重复渲染DOM 。【相关推荐:vuejs视频教程web前端开发

keep-alive 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。

keep-alive可以设置以下props属性:

  • include - 字符串或正则表达式。只有名称匹配的组件会被缓存
  • exclude - 字符串或正则表达式。任何名称匹配的组件都不会被缓存
  • max - 数字。最多可以缓存多少组件实例

关于keep-alive的基本用法:

<keep-alive>
  <component :is="view"></component>
</keep-alive>

使用includesexclude

<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="[&#39;a&#39;, &#39;b&#39;]">
  <component :is="view"></component>
</keep-alive>

匹配首先检查组件自身的 name 选项,如果 name 选项不可用,则匹配它的局部注册名称 (父组件 components 选项的键值),匿名组件不能被匹配

设置了 keep-alive 缓存的组件,会多出两个生命周期钩子(activateddeactivated):

  • 首次进入组件时:beforeRouteEnter > beforeCreate > createdmounted > activated > ... ... > beforeRouteLeave > deactivated
  • 再次进入组件时:beforeRouteEnter >activated > ... ... > beforeRouteLeave > deactivated

二、使用场景

使用原则:当我们在某些场景下不需要让页面重新加载时我们可以使用keepalive

举个栗子:

当我们从首页–>列表页–>商详页–>再返回,这时候列表页应该是需要keep-alive

首页–>列表页–>商详页–>返回到列表页(需要缓存)–>返回到首页(需要缓存)–>再次进入列表页(不需要缓存),这时候可以按需来控制页面的keep-alive

在路由中设置keepAlive属性判断是否需要缓存

{
  path: &#39;list&#39;,
  name: &#39;itemList&#39;, // 列表页
  component (resolve) {
    require([&#39;@/pages/item/list&#39;], resolve)
 },
 meta: {
  keepAlive: true,
  title: &#39;列表页&#39;
 }
}

使用<keep-alive></keep-alive>

<div id="app" class=&#39;wrapper&#39;>
    <keep-alive>
        <!-- 需要缓存的视图组件 --> 
        <router-view v-if="$route.meta.keepAlive"></router-view>
     </keep-alive>
      <!-- 不需要缓存的视图组件 -->
     <router-view v-if="!$route.meta.keepAlive"></router-view>
</div>

三、原理分析

keep-alivevue中内置的一个组件

源码位置:src/core/components/keep-alive.js

export default {
  name: &#39;keep-alive&#39;,
  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(&#39;include&#39;, val => {
      pruneCache(this, name => matches(val, name))
    })
    this.$watch(&#39;exclude&#39;, 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}` : &#39;&#39;)
        : 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])
  }
}

可以看到该组件没有template,而是用了render,在组件渲染的时候会自动执行render函数

this.cache是一个对象,用来存储需要缓存的组件,它将以如下形式存储:

this.cache = {
    &#39;key1&#39;:&#39;组件1&#39;,
    &#39;key2&#39;:&#39;组件2&#39;,
    // ...
}

在组件销毁的时候执行pruneCacheEntry函数

function pruneCacheEntry (
  cache: VNodeCache,
  key: string,
  keys: Array<string>,
  current?: VNode
) {
  const cached = cache[key]
  /* 判断当前没有处于被渲染状态的组件,将其销毁*/
  if (cached && (!current || cached.tag !== current.tag)) {
    cached.componentInstance.$destroy()
  }
  cache[key] = null
  remove(keys, key)
}

mounted钩子函数中观测 include 和 exclude 的变化,如下:

mounted () {
    this.$watch(&#39;include&#39;, val => {
        pruneCache(this, name => matches(val, name))
    })
    this.$watch(&#39;exclude&#39;, val => {
        pruneCache(this, name => !matches(val, name))
    })
}

如果include 或exclude 发生了变化,即表示定义需要缓存的组件的规则或者不需要缓存的组件的规则发生了变化,那么就执行pruneCache函数,函数如下:

function pruneCache (keepAliveInstance, filter) {
  const { cache, keys, _vnode } = keepAliveInstance
  for (const key in cache) {
    const cachedNode = cache[key]
    if (cachedNode) {
      const name = getComponentName(cachedNode.componentOptions)
      if (name && !filter(name)) {
        pruneCacheEntry(cache, key, keys, _vnode)
      }
    }
  }
}

在该函数内对this.cache对象进行遍历,取出每一项的name值,用其与新的缓存规则进行匹配,如果匹配不上,则表示在新的缓存规则下该组件已经不需要被缓存,则调用pruneCacheEntry函数将其从this.cache对象剔除即可

关于keep-alive的最强大缓存功能是在render函数中实现

首先获取组件的key值:

const key = vnode.key == null? 
componentOptions.Ctor.cid + (componentOptions.tag ? `::${componentOptions.tag}` : &#39;&#39;)
: vnode.key

拿到key值后去this.cache, 웹 프론트엔드 개발

]🎜🎜keep-alive 동적 구성 요소를 래핑할 때 캐시 구성 요소 인스턴스를 파괴하는 대신 비활성 구성 요소 인스턴스가 됩니다. 🎜🎜keep-alive는 다음 props 속성을 ​​설정할 수 있습니다: 🎜
  • include - 문자열 또는 정규 표현식. 이름이 일치하는 구성 요소만 캐시됩니다.
  • 제외 - 문자열 또는 정규 표현식입니다. 이름이 일치하는 구성요소는 캐시되지 않습니다.
  • max - 숫자. 캐시할 수 있는 최대 구성 요소 인스턴스 수
🎜keep-alive의 기본 사용법: 🎜
/* 如果命中缓存,则直接从缓存中拿 vnode 的组件实例 */
if (cache[key]) {
    vnode.componentInstance = cache[key].componentInstance
    /* 调整该组件key的顺序,将其从原来的地方删掉并重新放在最后一个 */
    remove(keys, key)
    keys.push(key)
}
🎜includesexclude 사용 : 🎜
/* 如果没有命中缓存,则将其设置进缓存 */
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)
    }
}
🎜일치 항목은 먼저 구성 요소 자체의 name 옵션을 확인합니다. name 옵션을 사용할 수 없는 경우 로컬 등록 이름(부모)과 일치합니다. 구성 요소 구성 요소 코드> 옵션 키 값), 익명 구성 요소는 일치할 수 없습니다. 🎜🎜연결 유지 캐시가 설정된 구성 요소에는 수명 주기 후크가 두 개 더 있습니다(<code>활성화비활성화됨). ): 🎜
  • 컴포넌트를 처음 입력할 때: beforeRouteEnter > beforeCreate > > 탑재됨 > ... ... > 비활성화됨 li>
  • 구성요소를 다시 입력하세요. beforeRouteEnter >activated > ... ... > code>비활성화
li>

🎜2. 사용 시나리오🎜🎜🎜사용 원칙: 페이지를 다시 로드할 필요가 없는 경우 일부 시나리오에서는 keepalive🎜🎜를 사용할 수 있습니다. 예:🎜🎜홈페이지–>목록 페이지–>비즈니스 세부정보 페이지–>반환 이때 목록 페이지는 홈페이지에서 연결 유지🎜🎜해야 합니다. >–>목록 페이지–>비즈니스 세부정보 페이지–>목록 페이지로 돌아가기(캐싱 필요)–> 홈페이지로 돌아가기(캐싱 필요) – >목록 페이지 다시 입력(캐싱 필요 없음) 이때 연결 유지를 제어할 수 있습니다. > 필요에 따라 페이지의 🎜🎜라우팅 코드에 keepAlive를 설정> 속성은 캐싱이 필요한지 여부를 결정합니다🎜
beforeRouteEnter(to, from, next){
    next(vm=>{
        console.log(vm)
        // 每次进入路由执行
        vm.getData()  // 获取数据
    })
},
🎜<keep-alive></keep-alive>를 사용하세요🎜
activated(){
   this.getData() // 获取数据
},

🎜3. 원리 분석🎜🎜🎜keep -alivevue🎜🎜에 내장된 구성 요소입니다. 소스 코드 위치: src/core/comComponents/ keep-alive.js🎜rrreee🎜이 구성 요소에는 템플릿이 없고 대신 렌더링을 사용하여 자동으로 렌더링을 실행하는 것을 볼 수 있습니다. > 컴포넌트가 렌더링될 때의 함수🎜🎜this.cache는 캐시해야 하는 컴포넌트를 저장하는 데 사용되며 다음 형식으로 저장됩니다. 🎜rrreee🎜 를 실행합니다. 컴포넌트가 소멸될 때 pruneCacheEntry 함수 🎜rrreee🎜 mounted 후크 함수에서 관찰 include

exclude의 변경 사항은 다음과 같습니다. : 🎜rrreee🎜 include 또는 exclude가 변경되면 정의가 필요하다는 뜻입니다. 캐시된 구성 요소의 규칙이나 캐시할 필요가 없는 구성 요소의 규칙이 변경된 경우 , 그런 다음 pruneCache 함수를 실행합니다. 함수는 다음과 같습니다. 🎜rrreee🎜이 함수에서 this.cache를 업데이트하고 개체를 트래버스하고 name 값을 사용하여 새 캐싱 규칙을 일치시킵니다. 일치하지 않으면 구성요소가 더 이상 새 캐싱 규칙에 따라 캐시될 필요가 없음을 의미합니다. 그런 다음 <code>pruneCacheEntry 함수를 사용하여 <code>this.cache 개체에서 제거합니다🎜🎜 keep-alive의 가장 강력한 캐싱 기능은 렌더링에 구현되어 있습니다. > function 🎜🎜먼저 구성 요소의 key 값을 가져옵니다. 🎜rrreee🎜 key 값을 가져온 후 this.cache 개체로 이동하여 이 값이 있는지 확인합니다. 존재하는 경우 구성 요소에 캐시가 있음을 의미합니다. 즉, 다음과 같이 캐시에 도달한다는 의미입니다.<pre class='brush:php;toolbar:false;'>/* 如果命中缓存,则直接从缓存中拿 vnode 的组件实例 */ if (cache[key]) { vnode.componentInstance = cache[key].componentInstance /* 调整该组件key的顺序,将其从原来的地方删掉并重新放在最后一个 */ remove(keys, key) keys.push(key) }</pre><p>直接从缓存中拿 <code>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
  • actived

beforeRouteEnter

每次组件渲染的时候,都会执行beforeRouteEnter

beforeRouteEnter(to, from, next){
    next(vm=>{
        console.log(vm)
        // 每次进入路由执行
        vm.getData()  // 获取数据
    })
},

actived

keep-alive缓存的组件被激活的时候,都会执行actived钩子

activated(){
   this.getData() // 获取数据
},

注意:服务器端渲染期间avtived不被调用

(学习视频分享:vuejs入门教程编程基础视频

위 내용은 Vue의 내장 구성 요소인 연결 유지에 대한 이해에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
이 기사는 掘金社区에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
vue中keep-alive的工作原理及使用方法详解vue中keep-alive的工作原理及使用方法详解Jul 21, 2023 am 11:58 AM

Vue.js是一个流行的前端框架,提供了一些方便的功能来优化性能和提升开发效率。其中一个功能是keep-alive,它可以帮助我们在组件之间保留状态,从而减少不必要的渲染和请求。本文将详细介绍keep-alive的工作原理以及使用方法,并提供一些代码示例。一、keep-alive的工作原理在Vue.js中,每当我们切换组件时,组件都会被重新创建

使用vue的keep-alive组件实现页面缓存更新策略使用vue的keep-alive组件实现页面缓存更新策略Jul 21, 2023 pm 05:58 PM

使用Vue的keep-alive组件实现页面缓存更新策略引言:在开发Web应用程序时,经常需要处理页面缓存和更新的策略。基于Vue的SPA(Single-PageApplication)应用程序,我们可以使用Vue的keep-alive组件来进行页面缓存和更新的控制。本文将介绍如何使用Vue的keep-alive组件实现页面缓存更新策略,并提供相应的代码示

如何使用vue的keep-alive优化单页应用的性能如何使用vue的keep-alive优化单页应用的性能Jul 21, 2023 am 09:25 AM

如何使用Vue的keep-alive优化单页应用的性能在开发现代Web应用时,性能一直是一个重要的关注点。随着前端框架的发展,Vue作为一款流行的JavaScript框架,为我们提供了许多工具和技术来优化应用的性能。其中之一就是Vue的keep-alive组件。Vue的keep-alive是一个抽象组件,可以将动态组件缓存起来,以避免重复渲染和销毁。使用ke

如何在vue中利用keep-alive提升前端开发效率如何在vue中利用keep-alive提升前端开发效率Jul 21, 2023 am 09:01 AM

如何在Vue中利用keep-alive提升前端开发效率前端开发的性能一直是开发人员关注的重点之一。为了提升用户体验和页面加载速度,我们经常要考虑如何优化前端渲染。Vue作为一款流行的前端框架,提供了keep-alive组件来解决非活动组件的性能问题。本文将介绍keep-alive的使用方法,并通过代码示例展示其在Vue中如何提升前端开发效率。keep-ali

Go语言中http.Transport的Keep-Alive配置与性能优化方法Go语言中http.Transport的Keep-Alive配置与性能优化方法Jul 22, 2023 am 09:13 AM

Go语言中http.Transport的Keep-Alive配置与性能优化方法在使用Go语言进行网络编程时,我们经常会使用到http.Transport来发送HTTP请求。其中,http.Transport提供了Keep-Alive的功能,可以在多个请求之间复用TCP连接,从而提高性能。本文将介绍如何在Go语言中配置http.Transport的Keep-A

Vue3中的keep-alive函数详解:优化应用性能的应用Vue3中的keep-alive函数详解:优化应用性能的应用Jun 18, 2023 pm 11:21 PM

Vue3中的keep-alive函数详解:优化应用性能的应用在Vue3中,keep-alive函数变得更加功能强大,可以实现更多的优化功能。通过keep-alive函数,可以将组件状态保留到内存中,避免组件的重复渲染,提升应用的性能和用户体验。本文将详细介绍Vue3中keep-alive函数的使用方法和优化策略。一、keep-alive函数介绍在Vue3中,

Vue3中的keep-alive函数:提升应用性能Vue3中的keep-alive函数:提升应用性能Jun 18, 2023 pm 02:56 PM

在Vue3中,为了优化应用性能,新增了一个名为keep-alive的函数。这个函数可以将组件缓存起来,避免在切换时重新渲染,从而提高应用的整体性能。一、keep-alive函数的作用在Vue3中,keep-alive函数可以用来缓存组件,等待再次使用。在渲染过程中,如果一个组件不被销毁,也就不需要重新初始化状态,以及重新计算计算属性等。这个函数接收一个

Vue 中如何使用 keep-alive 优化性能?Vue 中如何使用 keep-alive 优化性能?Jun 11, 2023 pm 01:04 PM

在开发Web应用程序时,我们都很关注应用程序的性能。其中一个常见的场景是点开一个页面,然后返回上一页,这个过程中,页面需要重新加载一遍。这对于用户体验来说是很不友好的,而且还会浪费服务器资源和用户的流量。为了避免这种情况,我们可以使用Vue中提供的keep-alive来进行缓存,从而提高应用程序的性能。什么是keep-alive?keep-al

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

PhpStorm 맥 버전

PhpStorm 맥 버전

최신(2018.2.1) 전문 PHP 통합 개발 도구

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구