keep-alive在vue2中应该怎样使用

这次给大家带来keep-alive在vue2中应该怎样使用,keep-alive在vue2中使用的注意事项有哪些,下面就是实战案例,一起来看一下。

keep-alive 是Vue的内置组件,能在组件切换过程中将状态保留在内存中,防止重复渲染DOM。结合vue-router中使用,可以缓存某个view的整个内容。

基本使用如下:

   

登录后复制

一般有这样的需求,当我们第一次进入列表页需要请求一下数据,当我从列表页进入详情页,详情页不缓存也需要请求下数据,然后返回列表页

有两个情况:

1. 直接点击浏览器的后退返回按钮。

2. 点击导航栏中的 /list的链接返回。

那么针对第一种情况下,我们直接通过后退按钮时,返回到列表页(/list) 是不需要请求数据。

针对第二种情况下,我们通过链接返回到列表页是需要请求数据。

所以这边有三种情况:

1. 默认进来列表页需要请求数据。

2. 进入详情页后,通过浏览器默认后退按钮返回,是不需要ajax的请求的。

3. 进入详情页后,通过点击链接返回到列表页后,也是需要发ajax请求的。

配置如下:

1. 入口文件 app.vue 的配置如下:

 

登录后复制

2. 在router中设置meta属性,设置 keepAlive: true 表示需要使用缓存,false的话表示不需要使用缓存。且添加滚动行为 scrollBehavior

router/index.js 的配置如下:

import Vue from 'vue';import Router from 'vue-router';// import HelloWorld from '@/views/HelloWorld';Vue.use(Router);const router = new Router({ mode: 'history', // 访问路径不带井号 需要使用 history模式,才能使用 scrollBehavior base: '/page/app', // 配置单页应用的基路径 routes: [ {  path: '/',  name: 'list',  component: resolve => require(['@/views/list'], resolve), // 使用懒加载  meta: {  keepAlive: true // true 表示需要使用缓存  } }, {  path: '/list',  name: 'list',  component: resolve => require(['@/views/list'], resolve), // 使用懒加载  meta: {  keepAlive: true // true 表示需要使用缓存 false表示不需要被缓存  } }, {  path: '/detail',  name: 'detail',  component: resolve => require(['@/views/detail'], resolve) // 使用懒加载 } ], scrollBehavior (to, from, savedPosition) { // 保存到 meta 中,备用 to.meta.savedPosition = savedPosition; if (savedPosition) {  return { x: 0, y: 0 }; } return {}; }});export default router;

登录后复制

3. list.vue 代码如下:

 

vue

{{msg}}

跳转到detail页

export default { name: 'helloworld', data () { return { msg: 'Welcome to Your Vue.js App' }; }, methods: { ajaxRequest() { const obj = { 'aa': 1 }; Promise.all([this.$store.dispatch('testUrl', obj)]).then((res) => { console.log(res); }); } }, beforeRouteEnter(to, from, next) { next(vm => { /* 如果 to.meta.savedPosition === undefined 说明是刷新页面或可以叫第一次进入页面 需要刷新数据 如果savedPosition === null, 那么说明是点击了导航链接; 此时需要刷新数据,获取新的列表内容。 否则的话 什么都不做,直接使用 keep-alive中的缓存 */ if (to.meta.savedPosition === undefined) { vm.ajaxRequest(); } if (to.meta.savedPosition === null) { vm.ajaxRequest(); } }) }};

登录后复制

4. detail.vue 代码如下:

 

{{msg}}

返回列表页

export default { name: 'list', data () { return { msg: 'Welcome to Your Vue.js App' }; }, created() { this.ajaxRequest(); }, methods: { ajaxRequest() { const obj = { 'aa': 1 }; Promise.all([this.$store.dispatch('withdary', obj)]).then((res) => { console.log(res); }); } }};

登录后复制

二:使用router.meta 扩展

假设现在有3个页面,需求如下:

1. 默认有A页面,A页面进来需要一个请求。

2. B页面跳转到A页面,A页面不需要重新请求。

3. C页面跳转到A页面,A页面需要重新请求。

实现方式如下:

在 A 路由里面设置 meta 属性:

{ path: '/a', name: 'A', component: resolve => require(['@/views/a'], resolve), meta: { keepAlive: true // true 表示需要使用缓存 }}

登录后复制

所以router/index下的所有代码变为如下:

import Vue from 'vue';import Router from 'vue-router';// import HelloWorld from '@/views/HelloWorld';

登录后复制

Vue.use(Router);

const router = new Router({ mode: 'history', // 访问路径不带井号 需要使用 history模式,才能使用 scrollBehavior base: '/page/app', // 配置单页应用的基路径 routes: [ {  path: '/',  name: 'list',  component: resolve => require(['@/views/list'], resolve), // 使用懒加载  meta: {  keepAlive: true // true 表示需要使用缓存  } }, {  path: '/list',  name: 'list',  component: resolve => require(['@/views/list'], resolve), // 使用懒加载  meta: {  keepAlive: true // true 表示需要使用缓存 false表示不需要被缓存  } }, {  path: '/detail',  name: 'detail',  component: resolve => require(['@/views/detail'], resolve) // 使用懒加载 }, {  path: '/a',  name: 'A',  component: resolve => require(['@/views/a'], resolve),  meta: {  keepAlive: true // true 表示需要使用缓存  } }, {  path: '/b',  name: 'B',  component: resolve => require(['@/views/b'], resolve) }, {  path: '/c',  name: 'C',  component: resolve => require(['@/views/c'], resolve) } ], scrollBehavior (to, from, savedPosition) { // 保存到 meta 中,备用 to.meta.savedPosition = savedPosition; if (savedPosition) {  return { x: 0, y: 0 }; } return {}; }});export default router;

登录后复制

在 B 组件里面设置 beforeRouteLeave

beforeRouteLeave(to, from, next) { // 设置下一个路由meta to.meta.keepAlive = true; // 让A缓存,不请求数据 next(); // 跳转到A页面}

登录后复制

B组件所有代码如下:

 

{{msg}}

返回a页面

export default { name: 'list', data () { return { msg: 'Welcome to B Page' }; }, created() {}, methods: { }, beforeRouteLeave(to, from, next) { // 设置下一个路由meta to.meta.keepAlive = true; // 让A缓存,不请求数据 next(); // 跳转到A页面 }};

登录后复制

在 C 组件里面设置 beforeRouteLeave:

beforeRouteLeave(to, from, next) { // 设置下一个路由meta to.meta.keepAlive = false; // 让A不缓存,重新请求数据 console.log(to) next(); // 跳转到A页面}

登录后复制

c组件所有代码如下:

 

{{msg}}

返回a页面

export default { name: 'list', data () { return { msg: 'Welcome to B Page' }; }, created() {}, methods: { }, beforeRouteLeave(to, from, next) { // 设置下一个路由meta to.meta.keepAlive = false; // 让A不缓存,重新请求数据 console.log(to) next(); // 跳转到A页面 }};

登录后复制

a组件内的所有的代码如下:

 

vue

{{msg}}

跳转到b页面 跳转到c页面

export default { name: 'helloworld', data () { return { msg: 'Welcome to A Page' }; }, methods: { ajaxRequest() { const obj = { 'aa': 1 }; Promise.all([this.$store.dispatch('testUrl', obj)]).then((res) => {}); } }, beforeRouteEnter(to, from, next) { next(vm => { /* 如果 to.meta.savedPosition === undefined 说明是刷新页面或可以叫第一次进入页面 需要刷新数据 如果to.meta.keepAlive === false, 那么说明是需要请求的; 此时需要刷新数据,获取新的列表内容。 否则的话 什么都不做,直接使用 keep-alive中的缓存 */ if (to.meta.savedPosition === undefined) { vm.ajaxRequest(); } if (!to.meta.keepAlive) { vm.ajaxRequest(); } }) }};

登录后复制

注意 b组件到a组件不重新请求数据 (包括点击链接和浏览器后退按钮),c组件到a组件请求数据(包括点击链接和浏览器后退按钮).

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

nodejs怎么实现gulp打包功能

webpack构建多页面应用的步骤分析

以上就是keep-alive在vue2中应该怎样使用的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2772468.html

(0)
上一篇 2025年3月8日 13:17:42
下一篇 2025年3月8日 13:17:56

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Bootstrap4与Vue2实现分页查询功能(附代码)

    这次给大家带来Bootstrap4与Vue2实现分页查询功能(附代码),Bootstrap4与Vue2实现分页查询功能的注意事项有哪些,下面就是实战案例,一起来看一下。 写在前面 工程为前后端分离设计,使用Nginx为前端资源服务器,同时实…

    编程技术 2025年3月8日
    200
  • Angular4输入与输出怎么使用

    这次给大家带来Angular4输入与输出怎么使用,使用Angular4输入与输出的注意事项有哪些,下面就是实战案例,一起来看一下。 Angular4输入属性 输入属性通常用于父组件向子组件传递信息 举个栗子:我们在父组件向子组件传递股票代码…

    编程技术 2025年3月8日
    200
  • JS动态规划使用详解

    这次给大家带来JS动态规划使用详解,JS动态规划使用的注意事项有哪些,下面就是实战案例,一起来看一下。 其实像在我们前端的开发中,用到的高级算法并不多,大部分情况if语句,for语句,swith语句等等,就可以解决了。稍微复杂的,可能会想到…

    编程技术 2025年3月8日
    200
  • js的作用域使用详解

    这次给大家带来js的作用域使用详解,js作用域使用的注意事项有哪些,下面就是实战案例,一起来看一下。 JavaScript是现在很多人都在使用的,对于JavaScript的使用,可能很多人还不是很清楚作用域以及块级作用域,这里文章就给大家具…

    编程技术 2025年3月8日
    200
  • JS匿名函数应该怎样使用

    这次给大家带来JS匿名函数应该怎样使用,使用JS匿名函数的注意事项有哪些,下面就是实战案例,一起来看一下。 匿名函数的基本形式为(function(){…})(); 前面的括号包含函数体,后面的括号就是给匿名函数传递参数并立即执…

    编程技术 2025年3月8日
    200
  • node Async的异步处理使用详解

    这次给大家带来node Async的异步处理使用详解,node Async异步处理使用详解的注意事项有哪些,下面就是实战案例,一起来看一下。 最近在研究nodejs,令我感受比较深的是……熟悉js代码的地球人都知道,js的加载顺序很重要!很…

    编程技术 2025年3月8日
    200
  • Node的模块系统使用详解

    这次给大家带来Node的模块系统使用详解,Node模块系统使用的注意事项有哪些,下面就是实战案例,一起来看一下。 模块是构建应用程序的基础,也使得函数和变量私有化,不直接对外暴露出来,接下来我们就要介绍Node的模块化系统和它最常用的模式 …

    编程技术 2025年3月8日
    200
  • Bootstrap的表单验证功能使用详解

    这次给大家带来Bootstrap的Bootstrap功能使用详解,Bootstrap表单验证的Bootstrap有哪些,下面就是实战案例,一起来看一下。 使用方式: 1.CSS样式 .valierror { border-color: re…

    编程技术 2025年3月8日
    200
  • 在ES6里模板字符串使用详解

    这次给大家带来在ES6里模板字符串使用详解,在ES6里模板字符串使用的注意事项有哪些,下面就是实战案例,一起来看一下。 写在前面 关于 ES6, 也终于在 2015 年的 7 月 18 号尘埃落定了。虽然说各大浏览器还没有全面的支持,不过这…

    编程技术 2025年3月8日
    200
  • Vue路由钩子的实战使用教程

    这次给大家带来Vue路由钩子实战使用教程,Vue路由钩子使用的注意事项有哪些,下面就是实战案例,一起来看一下。 一. 路由钩子语法 在vue-router的官方文档中, 将路由钩子翻译为导航守卫, 下面是文档中的内容摘要, 大家也可以通过传…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论