我的编程空间,编程开发者的网络收藏夹
学习永远不晚

vue的keep-alive怎么正确使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

vue的keep-alive怎么正确使用

这篇文章主要讲解了“vue的keep-alive怎么正确使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue的keep-alive怎么正确使用”吧!

  先来看一个项目中的需求

  作为苦逼的前端开发者,我们无时无刻都要面对产品经理提的各种需求, 比如这个场景

  场景:

  从首页的点击导航进入列表页,

  列表页点击列表进入 该 数据详情页

  从详情页返回,希望列表页缓存,不重新渲染数据,这样会提高用户体验。

  分析一下

  这样需求,如果是小程序的话,默认列表页就会缓存,因为小程序的运行环境是微信客户端,当我们打开一个页面会新建一个webview,

  所有列表页和详情页是两个webview,当我们进入详情页,列表页webview,只是会在详情页webview下面,不会销毁。

  以下是小程序运行环境:我们可以看到每个页面都有一个webview

  但是但是,我们的项目是用vue开发的webapp,多个组件共用一个窗口,当我们切换路由时,切出路由组件会销毁,所有列表页进入详情页列表页会销毁,重新回到列表页,列表页组件会重新加载。

  解决方案

  睡服提需求的人,改个简单的需求

  emm... ,看了看镜子中的自己,估计这辈子没办法从脸上得到任何的便利了,老老实实换个方案吧。

  keep-alive

  keep-alive是Vue提供的一个抽象组件,主要用于保留组件状态或避免重新渲染。

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

  和<transition> 相似, <keep-alive> 是一个抽象组件,它自身不会渲染一个DOM元素,也不会出现在父组件链中。

  但是 keep-alive 会把其包裹的所有组件都缓存起来。

  em...怎么办呢,我们只是需要让列表页缓存啊.

  分析一下

  我们可以把需求拆分为2步

  (1) 把需要缓存和不需要缓存的组件区分开,在组件的路由配置的元信息,meta中定义哪些需要缓存哪些不需要缓存

  具体代码如下

  1,定义两个出口 router-view

  <keep-alive>

  <!-- 需要缓存的视图组件 -->

  <router-view v-if="$route.meta.keepAlive">

  </router-view>

  </keep-alive>

  <!-- 不需要缓存的视图组件 -->

  <router-view v-if="!$route.meta.keepAlive">

  </router-view>

  2,在router配置中定义哪些需要缓存哪些不需要缓存

  new Router({

  routes: [

  {

  path: '/',

  name: 'index',

  component: () => import('./views/keep-alive/index.vue')

  },

  {

  path: '/list',

  name: 'list',

  component: () => import('./views/keep-alive/list.vue'),

  meta: {

  keepAlive: true //需要被缓存

  }

  },

  {

  path: '/detail',

  name: 'detail',

  component: () => import('./views/keep-alive/detail.vue')

  }

  ]

  })

  (2),开始按需缓存组件

  我们从官方文档提供的 api 入手,

  keep-alive组件如果设置了 include ,就只有和 include 匹配的组件会被缓存,

  所以思路就是,动态修改 include 数组来实现按需缓存。

  <template>

  <keep-alive :include="include">

  <!-- 需要缓存的视图组件 -->

  <router-view v-if="$route.meta.keepAlive">

  </router-view>

  </keep-alive>

  <!-- 不需要缓存的视图组件 -->

  <router-view v-if="!$route.meta.keepAlive">

  </router-view>

  </template>

  <script>

  export default {

  name: "app",

  data: () => ({

  include: []

  }),

  watch: {

  $route(to, from) {

  //如果 要 to(进入) 的页面是需要 keepAlive 缓存的,把 name push 进 include数组

  if (to.meta.keepAlive) {

  !this.include.includes(to.name) && this.include.push(to.name);

  }

  }

  }

  };

  </script>

  此时我们发现,从详情页返回列表页,列表页真的不再刷新了

  em...新的问题又出现了,由于 列表页被缓存了,这个时候我从首页,再点击进入某个列表,也不刷新了,完了,点击首页导航应该进入不同的列表页的. 也就是说,从首页进入列表组件不应该被缓存的。

  解决一下,我们在定义路由是,在元信息中再加一个字段,这里是deepth字段,代表进入路由的层级,比如首页路由deepth是0.5,列表页是1,详情页是2

  new Router({

  routes: [

  {

  path: '/',

  name: 'index',

  component: () => import('./views/keep-alive/index.vue'),

  meta: {

  deepth: 0.5 // 定义路由的层级

  }

  },

  {

  path: '/list',

  name: 'list',

  component: () => import('./views/keep-alive/list.vue'),

  meta: {

  deepth: 1

  keepAlive: true //需要被缓存

  }

  },

  {

  path: '/detail',

  name: 'detail',

  component: () => import('./views/keep-alive/detail.vue'),

  meta: {

  deepth: 2

  }

  }

  ]

  })

  然后在 app.vue中增加监听器,监听 我们进入路由的 方向

  具体代码如下

  <template>

  <keep-alive :include="include">

  <!-- 需要缓存的视图组件 -->

  <router-view v-if="$route.meta.keepAlive">

  </router-view>

  </keep-alive>

  <!-- 不需要缓存的视图组件 -->

  <router-view v-if="!$route.meta.keepAlive">

  </router-view>

  </template>

  <script>

  export default {

  name: "app",

  data: () => ({

  include: []

  }),

  watch: {

  $route(to, from) {

  //如果 要 to(进入) 的页面是需要 keepAlive 缓存的,把 name push 进 include数组

  if (to.meta.keepAlive) {

  !this.include.includes(to.name) && this.include.push(to.name);

  }

  //如果 要 form(离开) 的页面是 keepAlive缓存的,

  //再根据 deepth 来判断是前进还是后退

  //如果是后退

  if (from.meta.keepAlive && to.meta.deepth < from.meta.deepth) {

  var index = this.include.indexOf(from.name);

  index !== -1 && this.include.splice(index, 1);

  }

  }

  }

  };

  </script>

感谢各位的阅读,以上就是“vue的keep-alive怎么正确使用”的内容了,经过本文的学习后,相信大家对vue的keep-alive怎么正确使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

vue的keep-alive怎么正确使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Vue中的keep-alive如何使用

本篇内容介绍了“Vue中的keep-alive如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!keep-alive 是 Vue 的内置
2023-07-05

keep-alive组件怎么在Vue中使用

这篇文章将为大家详细讲解有关keep-alive组件怎么在Vue中使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 一、keep-alive 用法< keep-alive> 包裹动态组件时
2023-06-14

vue内置组件keep-alive怎么使用

这篇文章主要讲解了“vue内置组件keep-alive怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue内置组件keep-alive怎么使用”吧!一、Keep-alive 是什么k
2023-07-04

详解Vue中keep-alive的使用

keep-alive是Vue的内置组件,当它包裹动态组件时,会缓存不活动的组件实例,而不是销毁,这篇文章主要介绍了详解Vue中keep-alive的使用,需要的朋友可以参考下
2023-03-03

vue中keep-alive组件怎么用

这篇文章将为大家详细讲解有关vue中keep-alive组件怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。问题描述(什么是keep-alive)keep-alive顾名思义,保持活跃。保持谁活跃呢?
2023-06-15

怎么在keep-alive中使用LRU算法

怎么在keep-alive中使用LRU算法?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。vue的keep-alive内置组件的使用也是使用了改算法,源码如下:export
2023-06-15

vue3中keep-alive和vue-router的结合使用方式

这篇文章主要介绍了vue3中keep-alive和vue-router的结合使用方式, 具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-13

关于Vue中keep-alive的作用及使用方法

keep-alive是Vue的内置组件,当它包裹动态组件时,会缓存不活动的组件实例,该组件将不会销毁,这篇文章主要介绍了关于Vue中keep-alive的作用是什么?怎么使用,需要的朋友可以参考下
2023-05-17

vue使用keep-alive后从部分页面进入不缓存怎么解决

这篇文章主要介绍了vue使用keep-alive后从部分页面进入不缓存怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue使用keep-alive后从部分页面进入不缓存怎么解决文章都会有所收获,下面我们
2023-07-05

vue怎么正确使用create,mounted调用方法

这篇文章主要介绍了vue怎么正确使用create,mounted调用方法的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue怎么正确使用create,mounted调用方法文章都会有所收获,下面我们一起来看看吧
2023-06-30

关于Vue中this.$set的正确使用

我们在项目开发的过程中,经常会遇到这种情况:为data中的某一个对象添加一个属性,我们该如何解决这个问题呢,下面小编给大家带来了Vue中this.$set的正确使用,感兴趣的朋友跟随小编一起看看吧
2022-12-09

setTimeout在vue中的正确使用方式

这篇文章主要介绍了setTimeout在vue中的正确使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-01-28

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录