keep-alive的作用和应用

这篇具有很好参考价值的文章主要介绍了keep-alive的作用和应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、什么是keep-alive

keep-alive是Vue提供给我们的一个内置组件,会缓存不活动的组件实例,而不是销毁它们。作为标签使用包裹这需要缓存的组件。

2、作用

在组件切换过程中,把切换出的组件保存在内存中,防止重新渲染DOM,减少加载时间及性能消耗,提高用户体验。避免左慈重复渲染降低性能

举个例子:

这里有两个组件,Home和About,我们使用钩子函数来显示每个组件的创建和销毁

Home.vue

<template>
  <div class="home">
    <h1>This is a Home Page</h1>
    <input type="text">
  </div>
</template>

<script>
export default {
  name: "HomePage",
  created(){
    console.log('Home组件---created');
  },
  unmounted(){
    console.log('Home组件---unmounted');
  }
}
</script>

About.vue

<template>
  <div class="about">
    <h1>This is a About Page</h1>
    <input type="text">
  </div>
</template>

<script>
export default {
  name: "AboutPage",
  created(){
    console.log('About组件---created');
  },
  unmounted(){
    console.log('About组件---unmounted');
  }
}
</script>

App.vue

<template>
  <div class="root">
    <div class="nav">
      <router-link to='/home'>Home</router-link> 
      <span> | </span>
      <router-link to="/about">About</router-link>
    </div>
    <router-view></router-view>
  </div>
</template>

一开始进入Home组件,组件被创建

keep-alive,前端,javascript,vue.js,前端,Powered by 金山文档

切换到About组件时,About组件创建,Home组件销毁

keep-alive,前端,javascript,vue.js,前端,Powered by 金山文档

但是,如果我需要Home组件被切换掉以后,不销毁,而是保留之前的状态,那么就可以利用keep-alive来实现

keep-alive可以在组件切换时,保存其包裹的组件的状态,使其不被销毁,避免重新渲染。其拥有两个独立的生命周期钩子函数 actived 和 deactived,使用keep-alive包裹的组件在切换时不会被销毁,而是缓存到内存中并执行 deactived 钩子函数,命中缓存渲染后会执行 actived 钩子函数。

<template>
  <div class="root">
    <div class="nav">
      <router-link to='/home'>Home</router-link> 
      <span> | </span>
      <router-link to="/about">About</router-link>
    </div>
    <router-view v-slot="{ Component }">
      <keep-alive>
        <component :is="Component" />
      </keep-alive>
    </router-view>
  </div>
</template>

PS:这里Vue3的keep-alive官方进行了修改

原来:

<keep-alive>
    <router-view></router-view>
</keep-alive>

现在:

<router-view v-slot="{ Component }">
  <keep-alive>
    <component :is="Component" />
  </keep-alive>
</router-view>

接着,我们在组件Home中输入123456,然后切换到About组件

keep-alive,前端,javascript,vue.js,前端,Powered by 金山文档

会发现,Home并没有被销毁

keep-alive,前端,javascript,vue.js,前端,Powered by 金山文档

当我们在切换回Home组件时,Home组件也没有重新创建,并且还保留了字符串

keep-alive,前端,javascript,vue.js,前端,Powered by 金山文档

这时候,Home组件其实就被缓存了。但同样的,About组件也被缓存了。

如果我们需要设置某某组件不被缓存,或者某某组件需要被缓存,可以利用keep-alive的两个属性

  • include --- 字符串或正则表达式,只有匹配的组件才会被缓存

  • exclude --- 字符串或正则表达式,任何匹配的组件都不会被缓存

原写法:

<keep-alive include="HomePage">
    <router-view/>
</keep-alive>

Vue3写法:

<router-view v-slot="{ Component }">
  <keep-alive include="HomePage">
    <component :is="Component"  />
  </keep-alive>
</router-view>

注意:这里include里面的值不是 路由里定义的,而是组件里的那个name

keep-alive,前端,javascript,vue.js,前端,Powered by 金山文档

这时候,就只有Home组件会被缓存,而About组件不会被缓存了。 exclude同理。

实际中,我们更倾向于利用路由的meta属性来控制:

const routes = [
    {
        name: 'home',
        path: '/home',
        component: () => import("../View/Home"),
        meta:{
            keepAlive: true
        }
    },
    {
        path: '/about',
        component: () => import("../View/About"),
        meta: {
            keepAlive: false
        }
    },
]
<router-view v-slot="{ Component }">
  <keep-alive>
    <component :is="Component" v-if="$route.meta.keepAlive"/>
  </keep-alive>
    <component :is="Component" v-if="!$route.meta.keepAlive"/>
</router-view>
keep-alive结合v-if,如果meta中的keepAlive为true则缓存,否则不缓存,这样的话更方便且灵活

这样子,就实现了指定组件的缓存,其他组件不缓存。但是,随之而来的问题就是,Home组件被缓存了,我就不知道什么时候离开和什么进入Home组件了。 这时候就要利用 新增的两个钩子函数 activated和deactived来获取当前组件是否处于活动状态。

  • activated --- 在keep-alive组件激活时调用,该钩子在服务器渲染期间不被调用

  • deactivated --- 在keep-alive组件停用时调用,该钩子在服务器渲染期间不被调用

只有组件被 keep-alive 包裹时,这两个生命周期函数才会被调用,如果作为正常组件使用,是不会被调用的
<template>
  <div class="home">
    <h1>This is a Home Page</h1>
    <input type="text">
  </div>
</template>

<script>
export default {
  name: "HomePage",
  created(){
    console.log('Home组件---created');
  },
  unmounted(){
    console.log('Home组件---unmounted');
  },
  activated(){
    console.log('Home组件---激活');
  },
  deactivated(){
    console.log('Home组件---停用');
  }
}
</script>
keep-alive,前端,javascript,vue.js,前端,Powered by 金山文档

created ---> activate文章来源地址https://www.toymoban.com/news/detail-805824.html

keep-alive,前端,javascript,vue.js,前端,Powered by 金山文档

到了这里,关于keep-alive的作用和应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue keep-alive 中的生命周期

    keep-alive 是 Vue 提供的一个内置组件,用来对组件进行缓存——在组件切换过程中将状态保留在内存中,防止重复渲染DOM。 如果为一个组件包裹了 keep-alive,那么它会多出两个生命周期:deactivated、activated。同时,beforeDestroy 和 destroyed 就不会再被触发了,因为组件 不会被真正

    2024年02月12日
    浏览(31)
  • vue3.0中的keep-alive

    keep-alive是vue中的一个内置组件,通常用它来包裹一个动态组件,keep-alive 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。 它有两个特殊的生命周期钩子 activated 和 deactivated ,在vue3.0里面生命周期函数前面都要加上on, onActivated , onDeactivated 。当组件在使用了kee

    2023年04月08日
    浏览(28)
  • 【Vue3】keep-alive 缓存组件

    当在 Vue.js 中使用 keep-alive 组件时,它将会缓存动态组件,而不是每次渲染都销毁和重新创建它们。这对于需要在组件间快速切换并且保持组件状态的情况非常有用。 keep-alive 只能包含(或者说只能渲染)一个子组件,如果需要包含多个子组件,需要用 v-if 选择某个确定的组

    2024年02月13日
    浏览(31)
  • Vue中的keep-alive缓存组件的理解

    keep-alive 是一个抽象组件,用于将其内部的组件保留在内存中,而不会重新渲染。这意味着当组件在keep-alive 内部切换时,其状态将被 保留 ,而不是被销毁和重新创建。          keep-alive用来缓存不经常变化的组件,以提高性能,当我们在不同路由之间进行切换或者是动

    2024年01月18日
    浏览(28)
  • Vue keep-alive的使用和原理解析

    在当今Web开发领域中,构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架,正是为了满足这些需求而诞生。它采用了MVVM架构模式,并通过数据驱动和组件化的方式,使我们能够更轻松地构建出优雅而高效的Web应用程序。

    2024年01月16日
    浏览(37)
  • VUE3,自定义控制keep-alive缓存

    安装插件 npm install vite-plugin-vue-setup-extend --save 在vite.config.ts中 import VueSetupExtend from \\\'vite-plugin-vue-setup-extend\\\' ..... plugins:[         vue(),         VueSetupExtend(),         ..... ] useKeepalive.ts import { ref } from \\\"vue\\\" export const includes = refstring[]([]); // 增加缓存 export function addKeepAliveC

    2024年01月19日
    浏览(22)
  • Vue路由组件的缓存keep-alive和include属性

    功能:浏览器页面在进行切换时,原有的路由组件会被销毁。通过缓存可以保存被切换的路由组件。 例子:在页面上填好的信息当进行页面切换再转回原来的页面时,原本信息被清空了需要重新填写 功能:切换路由时,保留被切换路由组件。 格式: keep-alive router-view/ keep-

    2024年02月06日
    浏览(26)
  • Vue3 除了 keep-alive,还有哪些实现页面缓存的方法

    有这么一个需求:列表页进入详情页后,切换回列表页,需要对列表页进行缓存,如果从首页进入列表页,就要重新加载列表页。 对于这个需求,我的第一个想法就是使用keep-alive来缓存列表页,列表和详情页切换时,列表页会被缓存;从首页进入列表页时,就重置列表页数

    2024年02月06日
    浏览(31)
  • 【手撕源码】vue2.x中keep-alive源码解析

    🐱 个人主页: 不叫猫先生 🙋‍♂️ 作者简介:前端领域新星创作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀! 💫系列专栏:vue3从入门到精通、TypeScript从入门到实践 📢 资料领取:前端进阶资料以及文中源码可以找我免费领取 🔥 前端

    2024年02月20日
    浏览(25)
  • vue3中keep-alive的使用及结合transition使用

    在组件中使用(这里结合了 transition 内置动画组件 ) 在router.js中配置 keepAlive 自定义属性 VueCompilerError: expects exactly one child element or component. 不报错,但 keep-alive 内置组件的缓存没有效果,onActivated 函数也不会执行 vue中keep-alive的使用及详解

    2024年02月11日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包