vue组件切换方式有几种,组件缓存怎么实现
Admin 2022-07-05 群英技术资讯 482 次浏览
背景:
- 在组件化开发模式下,我们会把整个项目拆分成很多组件,然后按照合理的方式组织起来,达到预期效果
- 因为页面是多组件组织起来的,这时候自然就存在组件之间的切换问题,Vue中也提出了动态组件的概念,使得我们可以更好的实现组件之间的切换效果 , 但是vue中组件的切换实际是组件本身重新创建和销毁的过程,在某些场景下我们并不希望组件被重新创建重新渲染
实际场景: 用户操作 列表页-->详情页-->列表页 此时需要达到的预期效果是用户从详情页切换回列表页的时候原来的页面保持不变,而不是重新渲染,此时就需要在用户从列表页切换到详情页的时候对原来的列表页进行缓存
本文主要介绍Vue中组件的切换以及缓存解决方法
// 变量flag为true时显示comp-a组件 ,相反则显示comp-b组件 <comp-a v-if="flag"></comp-a> <comp-b v-else></comp-b>
// 点击切换登录,注册,退出组件 <template> <div> <a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" @click.prevent="comName = 'login'">登录</a> <a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" @click.prevent="comName = 'register'">注册</a> <a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" @click.prevent="comName = 'logOut'">退出</a> // <component></component> 来展示对应名称的组件,相当于一个占位符 // :is 属性指定 组件名称 <component :is="comName"></component> </div> </template>
// 路由规则: { path: '/login', name: 'login', component: () => import('../views/login.vue') }, { path: '/register', name: 'register', component: () => import('../views/register.vue') }, // 需要展示组件的位置: <router-view />
根据需求对组件缓存,而不是销毁重建,正如本文开篇举例的实际场景
<keep-alive>
包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。
<keep-alive> 是一个抽象组件:它自身不会渲染一个 DOM 元素,也不会出现在父组件链中。 当组件在 <keep-alive>
内被切换,它的 activated
和 deactivated
这两个生命周期钩子函数将会被对应执行 。
activated
在 keep-alive
组件激活时调用 该钩子函数在服务器端渲染期间不被调用
deactivated
在 keep-alive
组件停用时调用 该钩子在服务器端渲染期间不被调用
被包含在 keep-alive
中创建的组件,会多出两个生命周期的钩子: activated
与 deactivated
使用 keep-alive
会将数据保留在内存中,如果要在每次进入页面的时候获取最新的数据,需要在 activated 阶段获取数据,承担原来 created
钩子函数中获取数据的任务。
注意: 只有组件被 keep-alive 包裹时,这两个生命周期函数才会被调用,如果作为正常组件使用,是不会被调用的,以及在 2.1.0 版本之后,使用 exclude 排除之后,就算被包裹在 keep-alive 中,这两个钩子函数依然不会被调用!另外,在服务端渲染时,此钩子函数也不会被调用。
设置了缓存的组件:
beforeRouterEnter ->created->…->activated->…->deactivated> beforeRouteLeave
beforeRouterEnter ->activated->deactivated> beforeRouteLeave
include
- 字符串或数组,正则表达式。只有名称匹配的组件会被缓存-->include
的值为组件的name
。
exclude
- 字符串或正则表达式。任何名称匹配的组件都不会被缓存。
max
- 数字。最多可以缓存多少组件。
<template> <div> <a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" @click.prevent="comName = 'login'">登录</a> <a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" @click.prevent="comName = 'register'">注册</a> <a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" @click.prevent="comName = 'logOut'">退出</a> // login组件会被缓存 不设置include会默认缓存所有挂载到<component></component>的组件 // 缓存多个指定组件include = ['login','register'] <keep-alive include="login"> <component :is="comName"></component> </keep-alive> </div> </template>
需配置路由meta
信息的keepAlive
属性
keep-alive
代码可以结合v-if进行包裹,如果meta中的keepAlive
为true
进行缓存,否侧不进行缓存,这样可以更灵活一些
{ path: '/login', name: 'login', component: () => import('../views/login.vue') meta:{ keepAlive : true // login组件会被缓存 } }, { path: '/register', name: 'register', component: () => import('../views/register.vue'), meta:{ keepAlive : false // register组件不会被缓存 } },
<router-view />:
<div id="app"> <keep-alive> <!-- 需要缓存的视图组件 --> <router-view v-if="$route.meta.keepAlive"> </router-view> </keep-alive> <!-- 不需要缓存的视图组件 --> <router-view v-if="!$route.meta.keepAlive"> </router-view> </div>
// beforeRouteLeave()钩子 // 判断是否要到详情页 beforeRouteLeave(to, from, next) { if (to.path === "/goods_detail") { from.meta.keepAlive = true; } else { from.meta.keepAlive = false; // this.$destroy() } next(); }
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
vue清除定时器的方法是什么?一些朋友可能不知道为什么要清楚定时器,这是因为定时器如果不及时合理地清除,会造成业务逻辑混乱甚至应用卡死的情况,因此这篇文章就给大家分享关于vue清除定时器的方法及要注意的问题。
前端编写测试用例时,在测试界面上的一些效果时,通常都希望能够模拟一些用户操作,而模拟用户操作最主要的方式就是用代码触发指定事件。通常一些元素上会自带一些触发事件的方法
使用JavaScript实现随机颜色生成器 目录 项目基本结构 1.颜色生成器的基本结构 2.使用 HTML 添加标题 3.创建用于颜色查看的显示器 4.创建一个框以查看颜色代码 5.创建生成器和复制按钮 6.使用 JavaScript 激活随机颜色生成器 完整源码下载 在线演示地址 项目基本结构 目录结构如下: 1.颜色生成器的基本结构 我使用了以下的 HTML 和 CSS 代码创建了这个颜色生成器的基本结构.在添加所有信息的页面上创建了一个小框,框的背景颜色为白色. <div class="container" ...
这篇文章主要介绍了如何在CocosCreator里画个炫酷的雷达图,对Graphics感兴趣的同学,一定要看看,并且把代码实践一下
路由权限控制常用于后台管理系统中,对不同业务人员能够访问的页面进行一个权限的限制。本文主要介绍了两种Vue 路由权限控制,具有一定的参考价值,感兴趣的可以了解一下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008